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

有帮助吗?

解决方案

Scipy的聚类 实施效果很好,它们包括 k-均值 执行。

还有 scipy 集群, ,进行凝聚聚类;这样做的优点是您不需要提前决定集群的数量。

其他提示

SciPy的的 kmeans2()有一些数值问题:其它有报道的错误信息,如“黑客帝国并不积极明确 - Cholesky分解不能在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)

在所有的数据通过,但其更有趣看它的实时变化,你可以只打印方式。我用这对声音的20ms的比特频率信封和谈论它一两分钟后,它有一致的类别短“一”元音,长“O”元音,而“S”辅音。奇怪!

维基百科, ,你可以使用 scipy, K 均值聚类矢量量化

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

或者你可以 OpenCV 的新 Python 界面, ,以及他们的 公里平均值 执行。

(几年后)这个 kmeans.py 下 是否可以使用 scikits-learn-k-means 指定您自己的距离函数 简单明了且相当快;它使用 scipy.spatial.distance 中 20 多个指标中的任何一个。

您也可以使用GDAL,其中有许多许多功能与空间数据的工作。

SciKit了解的 KMEANS()是所述在Python应用K-均值聚类最简单的方法。配件集群也很简单: 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的礼貌了解的文档,上面链接)

Python的Pycluster和pyplot可用于k-均值聚类和2D数据的可视化。最近的博客帖子股票价格/成交量分析使用Python和PyCluster 给出关于库存数据使用PyCluster聚类的示例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top