步骤说明
1、确定K值。
K值是K-Means算法中唯一的参数,决定数据聚为几类。
2、从原始数据集中随机选择K点作为初始平均值点。
3、从原始数据集中依次取出数据。
每取出一个数据,分别计算与K平均值点之间的距离(默认计算点之间的欧氏距离),并将其归类为该平均值点所在的簇;
4、计算每簇当前的平均值点。
也就是说,该簇中所有点的平均值
5、比较当前的平均值是否与上一步获得的平均值相同。
如果是一样的话,K-Means算法就结束了,否则,用之前的平均值点代替当前的平均值点,然后重新划分族,重复步骤3。
实例
importnumpyasnp importmatplotlib.pyplotasplt '''标志位统计递归运行次数''' flag=0 '''欧式距离''' defecludDist(x,y): returnnp.sqrt(sum(np.square(np.array(x)-np.array(y)))) '''距离',曼哈顿;'' defmanhattanDist(x,y): returnnp.sum(np.abs(x-y)) '''夹角余弦''' defcos(x,y): returnnp.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y)) '''计算簇的平均值点''' defclusterMean(dataset): returnsum(np.array(dataset))/len(dataset) '''生成随机均值点''' defrandCenter(dataset,k): temp=[] whilelen(temp)<k: index=np.random.randint(0,len(dataset)-1) ifindexnotintemp: temp.append(index) returnnp.array([dataset[i]foriintemp]) '''以数据集的前k点为平均值''' deforderCenter(dataset,k): returnnp.array([dataset[i]foriinrange(k)]) '''聚类''' defkMeans(dataset,dist,center,k): globalflag #all_kinds用于存储中间计算结果 all_kinds=[] for_inrange(k): temp=[] all_kinds.append(temp) #计算每个点到每个均值点的距离 foriindataset: temp=[] forjincenter: temp.append(dist(i,j)) all_kinds[temp.index(min(temp))].append(i) #打印中间结果 foriinrange(k): print('第'+str(i)+'组:',all_kinds[i],end='\n') flag+=1 print('************************迭代'+str(flag)+'*************************;) #更新均值点 center_=np.array([clusterMean(i)foriinall_kinds]) if(center_==center).all(): print('结束') foriinrange(k): print('第'+str(i)+'组均值:',center_[i],end='\n') plt.scatter([j[0]forjinall_kinds[i]],[j[1]forjinall_kinds[i]],marker='*') plt.grid() plt.show() else: #递归调用kmeans函数 center=center_ kMeans(dataset,dist,center,k) defmain(k): '''生成随机点''' x=[np.random.randint(0,50)for_inrange(50)] y=[np.random.randint(0,50)for_inrange(50)] points=[[i,j]fori,jinzip(x,y)] plt.plot(x,y,'b.') plt.show() initial_center=randCenter(dataset=points,k=k) kMeans(dataset=points,dist=ecludDist,center=initial_center,k=k) if__name__='__main__': main(3)
以上是Python K-means算法的计算步骤,希望对大家有所帮助。更多Python学习指南:python基础教程
本教程的操作环境:windows7系统,Python 3.9.1,DELL G3电脑。