【数据挖掘】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-means聚类的核心思想:

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

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

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

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

你可能感兴趣的:(【数据挖掘】k-means聚类算法)