Python的k-meansalgorithm

我正在寻找Python实现k-meansalgorithm与例子来聚类和caching我的坐标数据库。

Scipy的聚类实现运行良好,并且包含了k-means实现。

还有scipy-cluster ,它是凝聚聚类; 这个优点是你不需要提前决定簇的数目。

SciPy的kmeans2()有一些数值问题:其他人在0.6.0版本中报告错误信息,例如“matrix不是正定的 – 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 

对于连续数据,k-means非常简单。

你需要一个你的手段的清单,并为每个数据点,find其最接近的平均值,并平均新的数据点。 您的手段将代表input数据中最近的显着点。

我不断地进行平均,所以没有必要用旧的数据来获得新的平均值。 给定旧平均值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(xk[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”辅音具有一致的类别。 奇怪!

从维基百科 ,你可以使用scipy, K-means聚类vector量化

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

或者你可以OpenCV的新Python接口 ,以及他们的kmeans实现。

(多年以后)这个kmeans.py 是在它可能指定你自己的距离函数使用scikits学习k-手段是简单和合理快速; 它使用scipy.spatial.distance中的20多个指标中的任何一个。

您也可以使用GDAL,它具有很多function来处理空间数据。

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学习文档提供,上面链接)

Python的Pycluster和pyplot可用于k均值聚类和2D数据的可视化。 最近的博客文章使用Python和PyCluster进行股票价格/成交量分析给出了一个使用PyCluster对股票数据进行聚类的例子。

*此代码K-与Pyhon *

 from math import math from functions import functions class KMEANS: @staticmethod def KMeans(data,classterCount,globalCounter): counter=0 classes=[] cluster =[[]] cluster_index=[] tempClasses=[] for i in range(0,classterCount): globalCounter+=1 classes.append(cluster) cluster_index.append(cluster) tempClasses.append(cluster) classes2=classes[:] for i in range(0,len(classes)): globalCounter=1 cluster = [data[i]] classes[i]=cluster functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) functions.ResetClasterIndex(classes2,classterCount,globalCounter) def clusterFills(classeses,globalCounter,counter): counter+=1 combinedOfClasses = functions.CopyTo(classeses) functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) functions.ResetClasterIndex(tempClasses,classterCount,globalCounter) avarage=[] for k in range(0,len(combinedOfClasses)): globalCounter+=1 avarage.append(functions.GetAvarage(combinedOfClasses[k])) for i in range(0,len(data)): globalCounter+=1 minimum=0 index=0 for k in range(0,len(avarage)): total=0.0 for j in range(0,len(avarage[k])): total += (avarage[k][j]-data[i][j]) **2 tempp=math.sqrt(total) if(k==0): minimu=tempp if(tempp&lt;=minimu): minimu=tempp index=k tempClasses[index].append(data[i]) cluster_index[index].append(i) if(functions.CompareArray(tempClasses,combinedOfClasses)==1): return clusterFills(tempClasses,globalCounter,counter) returnArray = [] returnArray.append(tempClasses) returnArray.append(cluster_index) returnArray.append(avarage) returnArray.append(counter) return returnArray cdcd = clusterFills(classes,globalCounter,counter) if cdcd !=None: return cdcd @staticmethod def KMeansPer(data,classterCount,globalCounter): perData=data[0:int(float(len(data))/100*30)] result = KMEANS.KMeans(perData,classterCount,globalCounter) cluster_index=[] tempClasses=[] classes=[] cluster =[[]] for i in range(0,classterCount): globalCounter+=1 classes.append(cluster) cluster_index.append(cluster) tempClasses.append(cluster) classes2=classes[:] for i in range(0,len(classes)): globalCounter=1 cluster = [data[i]] classes[i]=cluster functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) functions.ResetClasterIndex(classes2,classterCount,globalCounter) counter=0 def clusterFills(classeses,globalCounter,counter): counter+=1 combinedOfClasses = functions.CopyTo(classeses) functions.ResetClasterIndex(cluster_index,classterCount,globalCounter) functions.ResetClasterIndex(tempClasses,classterCount,globalCounter) avarage=[] for k in range(0,len(combinedOfClasses)): globalCounter+=1 avarage.append(functions.GetAvarage(combinedOfClasses[k])) for i in range(0,len(data)): globalCounter+=1 minimum=0 index=0 for k in range(0,len(avarage)): total=0.0 for j in range(0,len(avarage[k])): total += (avarage[k][j]-data[i][j]) **2 tempp=math.sqrt(total) if(k==0): minimu=tempp if(tempp&lt;=minimu): minimu=tempp index=k tempClasses[index].append(data[i]) cluster_index[index].append(i) if(functions.CompareArray(tempClasses,combinedOfClasses)==1): return clusterFills(tempClasses,globalCounter,counter) returnArray = [] returnArray.append(tempClasses) returnArray.append(cluster_index) returnArray.append(avarage) returnArray.append(counter) return returnArray cdcd = clusterFills(result[0],globalCounter,counter) if cdcd !=None: return cdcd 

阅读 …