Advertisement

【数据挖掘】k-means聚类算法

阅读量:

K-Means聚类
层次聚类给出了一个树作为结果,但是其不足之处:没有额外的工作,树形结构并不能真正将数据划分到独立的分组中,并且算法属于计算密集型任务。
因为每个item之间的距离需要计算,且合并之后,距离需要重算,所以当数据集非常大时,算法运行很缓慢。

K-means聚类,不同于层次聚类,它事先告诉有多少个唯一的clust要生成。算法基于数据的结构来决定cluster的大小。

复制代码
 def kclustr(rows,distance=sim_pearson,k=4):

    
     #取得向量每个维度中的最大、最小值
    
     ranges=[(min(row[i] for row in rows),max(row[i] for row in rows)) 
    
         for i in range(len(rows[0]))]
    
     #创建k个随机位置中心(向量)
    
     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):#最大迭代次数
    
     bestmatch=[[] for i in range(k)]#
    
     for j in range(len(rows)):
    
         row = rows[j]
    
         #分别计算row与随机clust的距离那个最近
    
         bestmatch=0
    
         for i in range(k):
    
             d=distance(clusters[i],row)
    
             if d<distance(clusters[bestmatch],row):bestmatch=i
    
         bestmatches[bestmatch].append(j)#将最近的划分到与其对应的clust中
    
     if bestmatches == lastmatches:break#若结果与最后一次相同,结束循环
    
     lastmatches=bestmatches
    
     #计算新center的中心,采用平均值
    
     for i in range(k):
    
         avgs=[0.0] * len(rows[0])
    
         if len(bestmatches[i])>0:
    
             for rowid in bestmatches[i]:
    
                 for m in range(len(rows[rowid])):
    
                     avg[m] += rows[rowid][m]
    
             for j in range(len(avgs)):
    
                 avgs[j]/=len(bestmatches[i])
    
             clusters[i]=avgs
    
     return bestmatches
    
    
    
    

k-means聚类的核心思想:

1)初始化k个随机向量,见上面代码

2)遍历所有向量,将向量分配到与k最近的clust中

3)此轮遍历结束后,将k clust的中心位置(划分后新的clust平均值)重新计算

4)多次遍历直到中心不再移动

全部评论 (0)

还没有任何评论哟~