Python k-means算法

时间:2009-10-09 19:16:13

标签: python algorithm cluster-analysis k-means

我正在寻找k-means算法的Python实现,其中包含用于聚类和缓存坐标数据库的示例。

8 个答案:

答案 0 :(得分:54)

Scipy's clustering实施效果很好,并且包含k-means实施。

还有scipy-cluster,它进行凝聚聚类;这样做的好处是你不需要提前决定集群的数量。

答案 1 :(得分:28)

SciPy的kmeans2()有一些数值问题:其他人有reported错误信息,例如“Matrix不是正定的 - 在0.6.0版本中无法计算Cholesky分解”,我刚刚遇到了同样的问题在版本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

答案 2 :(得分:20)

对于连续数据,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)

你可以在所有数据都通过时打印出来,但观察它实时变化会更有趣。我在20ms声音的频率包络上使用它,并且在与它通话一两分钟之后,它对于短'a'元音,长'o'元音和's'辅音具有一致的类别。奇怪!

答案 3 :(得分:5)

wikipedia,你可以使用scipy,K-means clustering an vector quantization

或者,您可以使用OpenCV的Python包装器ctypes-opencv

或者您可以OpenCV's new Python interface及其kmeans实施。

答案 4 :(得分:5)

(多年以后)is-it-possible-to-specify-your-own-distance-function-using-scikits-learn-k-means下的这个kmeans.py很简单,而且速度相当快;它使用scipy.spatial.distance中的20多个指标中的任何一个。

答案 5 :(得分:0)

您还可以使用GDAL,它具有许多功能来处理空间数据。

答案 6 :(得分:0)

SciKit Learn KMeans()是在Python中应用k-means聚类的最简单方法。拟合集群很简单: 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的文档提供,上面链接)

答案 7 :(得分:-1)

Python的Pycluster和pyplot可用于k-means聚类和2D数据的可视化。最近的博客文章Stock Price/Volume Analysis Using Python and PyCluster给出了使用PyCluster对库存数据进行聚类的示例。