Python聚类数值数据

Python聚类数值数据,python,algorithm,cluster-analysis,Python,Algorithm,Cluster Analysis,我遵循一个教程,其中“kmeans”算法是整个示例的主要部分。“行”列表作为要群集的数据传递。皮尔逊函数提供了第二个参数,一个关系系数,k=3是聚类数。从kmeans函数返回的“bestmatches”是与属于每个集群的行中的元素相对应的分组/聚集索引值列表。因为我需要做一个散点图,我需要它们的值。如何返回值而不是索引的值 rows=[(1,1),(3,6),(11,2),(7,19),(22,11),(32,11)] def pearson(v1,v2): #sums sum1=sum(v

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

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
rows=[(1,1)、(3,6)、(11,2)、(7,19)、(22,11)、(32,11)]
def pearson(v1、v2):
#总数
sum1=总和(v1)
sum2=总和(v2)
打印(sum1)
#平方和
sum1Sq=总和([v1中v的功率(v,2)])
sum2Sq=总和([v2中v的功率(v,2)])
#积和
pSum=总和([v1[i]*v2[i]表示范围内的i(len(v1)))
#计算皮尔逊R
num=pSum-(sum1*sum2/len(v1))
den=sqrt((sum1Sq功率(sum1,2)/len(v1))*(sum2Sq功率(sum2,2)/len(v1)))
如果den==0:返回0
返回1.0-num/den
def kmeans(行,距离=pearson,k=3):
#确定每个点的最小值和最大值
#通过“行”(数据)计数,并找到最小值和最大值
范围=[(最小值([row[i]表示行中的行]),最大值([row[i]表示行中的行])
对于范围内的i(len(行[0]))]
#在“数据”的len内创建k个随机放置的质心
集群=[[random.random()*(范围[i][1]-范围[i][0])+范围[i][0]
对于范围内的i(len(行[0])),对于范围内的j(k)]
lastmatches=无
对于范围(100)内的t:
打印“迭代%d”%t
范围(k)内的i的最佳匹配=[]
#找到最靠近每行的质心
对于范围内的j(长度(行)):
行=行[j]
最佳匹配=0
对于范围(k)内的i:
d=距离(簇[i],行)
如果d0:
#打印(len(最佳匹配[i]))
对于最佳匹配[i]中的rowid:
对于范围内的m(len(行[rowid]):
平均值[m]+=行[rowid][m]
对于范围内的j(len(平均值)):
平均值[j]/=len(最佳匹配[i])
簇[i]=avgs
返回最佳匹配
不要使用pearson相关的k均值 这可能会严重失败,因为皮尔逊相关性和平均值不兼容,可能会阻止算法收敛。更糟糕的是,它可能会产生无效值

如果你取这两个向量

1 2 3 4 5
9 8 7 6 5
那么平均值是

5 5 5 5 5
结果的平均值不能用于皮尔逊相关,因为它是常量

K-均值仅适用于布格曼发散,如平方欧几里得。因为它是关于方差最小化,而不是距离最小化
K-均值不能用于任意距离。如果您有其他距离,请使用k-medians(PAM)或其他聚类算法。

本教程来自托比·塞加兰的“编程集体智能”。在“发现组”一章中,他介绍了一些数据挖掘概念,并提供了这段代码。。。虽然您似乎缺少基本的python体验…谢谢@Anony mouse。我在写一个距离度量函数来得到欧几里得。我看到了bestmatches也被分配了索引值,当它最初被放入一个列表中,然后j值被附加到列表中。