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<=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<=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
阅读 …