Алгоритм Python k-means
8 ответов
скопление Сципи реализации работают хорошо, и они включают в себя k-означает реализация.
там же scipy-cluster, что делает агломеративную кластеризацию; ths имеет то преимущество, что вам не нужно заранее решать количество кластеров.
составляющей это kmeans2() есть некоторые численные проблемы: другие об этом сообщает сообщения об ошибках, такие как "Матрица не является положительно определенной - разложение Холецкого не может быть вычислено" в версии 0.6.0, и я просто столкнулся с такой же в версии 0.7.1.
на данный момент, я бы рекомендовал использовать PyCluster. Пример использования:
>>> import numpy
>>> import Pycluster
>>> points = numpy.vstack([numpy.random.multivariate_normal(mean,
0.03 * numpy.diag([1,1]),
20)
for mean in [(1, 1), (2, 4), (3, 2)]])
>>> labels, error, nfound = Pycluster.kcluster(points, 3)
>>> labels # Cluster number for each point
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
>>> error # The within-cluster sum of distances for the solution
1.7721661785401261
>>> nfound # Number of times this solution was found
1
для непрерывных данных методом k-средних очень легко.
вам нужен список ваших средств, и для каждой точки данных найдите среднее значение, ближайшее к ней, и усредните новую точку данных. ваши средства будут представлять последние заметные кластеры точек во входных данных.
я делаю усреднение непрерывно, поэтому нет необходимости иметь старые данные для получения нового среднего. Учитывая старое среднее k
, следующая точка данных x
, и постоянная n
- количество из прошлых точек данных, чтобы сохранить среднее значение, новое среднее значение
k*(1-(1/n)) + n*(1/n)
вот полный код в Python
from __future__ import division
from random import random
# init means and data to random values
# use real data in your code
means = [random() for i in range(10)]
data = [random() for i in range(1000)]
param = 0.01 # bigger numbers make the means change faster
# must be between 0 and 1
for x in data:
closest_k = 0;
smallest_error = 9999; # this should really be positive infinity
for k in enumerate(means):
error = abs(x-k[1])
if error < smallest_error:
smallest_error = error
closest_k = k[0]
means[closest_k] = means[closest_k]*(1-param) + x*(param)
вы можете просто распечатать средства, когда все данные прошли, но гораздо интереснее наблюдать за его изменением в режиме реального времени. Я использовал это на частотных огибающих 20 мс бит звука, и после разговора с ним в течение минуты или двух, у него были последовательные категории для короткой гласной "a", длинной гласной " o "и согласной "s". вирд!
с Википедия, вы можете использовать scipy,K-означает кластеризацию векторного квантования
или вы можете использовать оболочку Python для OpenCV,ctypes-opencv.
вы можете новый интерфейс Python OpenCV, и kmeans реализация.
(годы спустя) это kmeans.py под -Это-можно-получить-укажите свое расстояние-функция-через-scikits-учиться-к-значит является простым и достаточно быстрым; он использует любую из 20-нечетных метрик в scipy.пространственный.расстояние.
вы также можете использовать GDAL, который имеет много функций для работы с пространственными данными.
пакет scikit узнать KMeans() это самый простой способ применить кластеризацию k-means в Python. Установка кластеров проста как:
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
.
этот фрагмент кода показывает, как хранить координаты центроида и предсказывать кластеры для массива координат.
>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
... [4, 2], [4, 4], [4, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
>>> kmeans.cluster_centers_
array([[ 1., 2.],
[ 4., 2.]])
(любезно предоставлено документацией SciKit Learn, связанной выше)
Python Pycluster и pyplot можно использовать для кластеризации k-средних и для визуализации 2D-данных. Недавнее сообщение в блоге анализ цены/объема акций с использованием Python и PyCluster дает пример кластеризации с использованием PyCluster на фондовых данных.