Алгоритм Python K-средних - PullRequest
       28

Алгоритм Python K-средних

46 голосов
/ 09 октября 2009

Я ищу реализацию Python алгоритма k-средних с примерами для кластеризации и кэширования моей базы данных координат.

Ответы [ 8 ]

54 голосов
/ 10 октября 2009

Кластеризация Scipy реализации работают хорошо, и они включают k-средних реализацию.

Существует также scipy-cluster , которая выполняет агломерационную кластеризацию; Преимущество этого метода заключается в том, что вам не нужно заранее определять количество кластеров.

28 голосов
/ 08 февраля 2010

SciPy 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
20 голосов
/ 09 апреля 2010

Для непрерывных данных k-means очень просто.

Вам необходим список ваших средств, и для каждой точки данных найдите среднее значение, наиболее близкое к нему, и усредните новые точки данных к нему. ваши средства будут представлять недавние заметные группы точек во входных данных.

Я делаю усреднение непрерывно, поэтому нет необходимости иметь старые данные для получения нового среднего. Учитывая старое среднее значение 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 мс, и после разговора с ним в течение минуты или двух, у него были последовательные категории для короткого гласного «а», длинного гласного «о» и согласного «с». странно!

5 голосов
/ 04 июля 2011

(Годы спустя) этот файл kmeans.py под функция "можно ли указать свою собственную дистанцию", используя "scikits-learn-k-means" является простой и достаточно быстрой ; он использует любую из 20 с лишним метрик в scipy.spatial.distance.

5 голосов
/ 09 октября 2009

Из википедии , вы можете использовать scipy, K-означает кластеризацию векторного квантования

Или вы можете использовать оболочку Python для OpenCV, ctypes-opencv .

Или вы можете Новый Python-интерфейс OpenCV и их kmeans реализация.

0 голосов
/ 12 февраля 2017

SciKit Learn's KMeans () - это самый простой способ применения k-средних в 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, ссылка выше)

0 голосов
/ 15 сентября 2014

Python Pycluster и pyplot могут использоваться для кластеризации k-средних и для визуализации 2D-данных. В недавнем сообщении в блоге Анализ цены / объема акций с использованием Python и PyCluster приводится пример кластеризации с использованием PyCluster для данных о запасах.

0 голосов
/ 09 октября 2009

Вы также можете использовать GDAL, который имеет много функций для работы с пространственными данными.

...