Python k-means算法
-
20-09-2019 - |
题
我正在寻找 k-means 算法的 Python 实现,以及用于聚类和缓存我的坐标数据库的示例。
其他提示
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聚类的示例。