我正在寻找k-means算法的Python实现,其中包含用于聚类和缓存坐标数据库的示例。
答案 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对库存数据进行聚类的示例。