2016-01-29 37 views
0

我正在学习一个教程,其中'kmeans'算法是整个示例的主要部分。 “行”列表作为要聚集的数据传递。 Pearson函数提供第二个参数,一个关系系数,k = 3是聚类数。从kmeans函数返回的'bestmatches'是与属于每个集群的行中的元素相对应的分组/聚集索引值的列表。因为我需要制作散点图,所以我需要它们的值。我如何返回值而不是索引?Python聚类数值数据

rows=[(1,1),(3,6),(11,2),(7,19),(22,11),(32,11)] 

def pearson(v1,v2): 

#sums 
sum1=sum(v1) 
sum2=sum(v2) 
print(sum1) 
#sums of the sqs 
sum1Sq=sum([pow(v,2) for v in v1]) 
sum2Sq=sum([pow(v,2) for v in v2]) 

#sum of products 
pSum=sum([v1[i]*v2[i] for i in range(len(v1))]) 

#calculate pearson R 
num=pSum-(sum1*sum2/len(v1)) 
den=sqrt((sum1Sq-pow(sum1,2)/len(v1))*(sum2Sq-pow(sum2,2)/len(v1))) 
if den==0: return 0 

return 1.0-num/den 



def kmeans(rows,distance=pearson,k=3): 
#Determine the min and max values for each point 

#COunt through "rows"(data) and find min and max values 
ranges=[(min([row[i] for row in rows]),max([row[i] for row in rows])) 

for i in range(len(rows[0]))]  
#create k randomly placed centroids within len of 'data' 
clusters=[[random.random()*(ranges[i][1]-ranges[i][0])+ranges[i][0] 

for i in range(len(rows[0]))] for j in range(k)] 
lastmatches=None 
for t in range(100): 
    print 'Iteration %d' % t 

    bestmatches=[[] for i in range(k)] 

    #find which centroid is the closest to each row 
    for j in range(len(rows)): 
     row=rows[j] 
     bestmatch=0 
     for i in range(k): 
      d=distance(clusters[i],row) 
      if d<distance(clusters[bestmatch],row): bestmatch=i 

     bestmatches[bestmatch].append(j) 

    if bestmatches==lastmatches: break 
    lastmatches=bestmatches 

    #move centroids to the avg of members 
    for i in range(k): 
     avgs=[0.0]*len(rows[0]) 
     if len(bestmatches[i])>0: 
      #print(len(bestmatches[i])) 
      for rowid in bestmatches[i]: 
       for m in range(len(rows[rowid])): 
        avgs[m]+=rows[rowid][m] 
       for j in range(len(avgs)): 
        avgs[j]/=len(bestmatches[i]) 
       clusters[i]=avgs 

    return bestmatches 
+0

本教程来自Toby Segaran的“Programming Collective Intelligence”。在“发现组”一章中,他涵盖了一些数据挖掘概念,并提供了这些代码。 – DomRow

+0

这本书被报告有一些代码错误... http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596529321虽然你似乎缺少基本的python体验... –

回答

0

不要使用k均值与Pearson相关

这可能会失败得厉害,因为Pearson相关和意味着是不相容的,可以防止算法收敛。更糟的是,它可能会产生无效的值。

如果你把两个向量

1 2 3 4 5 
9 8 7 6 5 

则平均是

5 5 5 5 5 

所得意味着不能与皮尔森corrleation使用,因为它是恒定值。

K-means仅适用于Brgeman散度,如平方欧几里得。因为它关于方差最小化,而不是距离最小化

K-means 不能用于任意距离。如果您有其他距离,请使用k-medans(PAM)或其他聚类算法。

+0

Thanks @Anony -摩丝。我正在重写一个距离度量函数来获得欧几里得。我看到bestmatches也被分配了索引值,当它最初被编入一个列表中,然后j值被附加到它。 – DomRow