Кластеризация K-средних — это метод поиска кластеров и центров кластеров в наборе немаркированных данных. Интуитивно, мы можем думать о кластере как о — состоящем из группы точек данных, чьи расстояния между точками малы по сравнению с расстояниями до точек вне кластера. Учитывая начальный набор K центров, алгоритм K-средних повторяет следующие два шага:
-
Для каждого центра идентифицируется подмножество точек обучения (его кластер), которое находится ближе к нему, чем любой другой центр.
-
Среднее значение каждого признака для точек данных в каждом кластере вычисляется, и этот средний вектор становится новым центром для этого кластера.
Для каждого центра идентифицируется подмножество точек обучения (его кластер), которое находится ближе к нему, чем любой другой центр.
Среднее значение каждого признака для точек данных в каждом кластере вычисляется, и этот средний вектор становится новым центром для этого кластера.
Эти два шага повторяются до тех пор, пока центры больше не перемещаются или назначения больше не меняются. Затем новая точка x может быть назначена кластеру ближайшего прототипа. Библиотека SciPy обеспечивает хорошую реализацию алгоритма K-Means через кластерный пакет. Дайте нам понять, как его использовать.
Внедрение K-Means в SciPy
Мы поймем, как реализовать K-Means в SciPy.
Импорт K-Средств
Мы увидим реализацию и использование каждой импортированной функции.
from SciPy.cluster.vq import kmeans,vq,whiten
Генерация данных
Мы должны смоделировать некоторые данные, чтобы исследовать кластеризацию.
from numpy import vstack,array from numpy.random import rand # data generation with three features data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))
Теперь мы должны проверить данные. Вышеуказанная программа сгенерирует следующий вывод.
array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00], [ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01], [ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01], …………….
Нормализуйте группу наблюдений на основе признаков. Перед запуском K-Means полезно изменить масштаб каждого измерения элемента набора наблюдений с отбеливанием. Каждая особенность делится на стандартное отклонение по всем наблюдениям, чтобы получить единичную дисперсию.
Отбелить данные
Мы должны использовать следующий код для отбеливания данных.
# whitening of data data = whiten(data)
Вычислить K-средние с тремя кластерами
Давайте теперь вычислим K-средние с тремя кластерами, используя следующий код.
# computing K-Means with K = 3 (2 clusters) centroids,_ = kmeans(data,3)
Приведенный выше код выполняет K-средние для набора векторов наблюдения, образующих K кластеров. Алгоритм K-средних корректирует центроиды до тех пор, пока не будет достигнут достаточный прогресс, то есть изменение искажения, поскольку последняя итерация меньше некоторого порогового значения. Здесь мы можем наблюдать центроид кластера, печатая переменную centroids, используя код, приведенный ниже.
print(centroids)
Приведенный выше код сгенерирует следующий вывод.
print(centroids)[ [ 2.26034702 1.43924335 1.3697022 ] [ 2.63788572 2.81446462 2.85163854] [ 0.73507256 1.30801855 1.44477558] ]
Присвойте каждое значение кластеру, используя приведенный ниже код.
# assign each sample to a cluster clx,_ = vq(data,centroids)
Функция vq сравнивает каждый вектор наблюдений в массиве «M» по «N» obs с центроидами и назначает наблюдение ближайшему кластеру. Он возвращает кластер каждого наблюдения и искажения. Мы также можем проверить искажение. Давайте проверим кластер каждого наблюдения, используя следующий код.
# check clusters of observation print clx
Приведенный выше код сгенерирует следующий вывод.
array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
Различные значения 0, 1, 2 из вышеуказанного массива указывают кластеры.