【数据挖掘】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)
还没有任何评论哟~
