Алгоритм Python k-means

Я ищу реализацию 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 на фондовых данных.