import pandas as pd
import numpy as np
import random as rd
import matplotlib.pyplot as plt
Data=pd.read_excel("西瓜数据集4.0.xlsx")
k=5#设置聚类个数
D=Data.values[:,1:]
U=[]
Sc=[]
while(1):#初始化均值向量,不能有重复
c=rd.randint(0,28)
if c not in Sc:#控制不能有重复
U.append(D[c].tolist())
if len(U)==k:
break
Sc.append(c)
def mindij(x,U):#计算样本到各个均值向量的距离,返回最近的那个编号
Dij=[]
for u in U:
dij=((x[0]-u[0])**2+(x[1]-u[1])**2)**1/2#欧氏距离
Dij.append(dij)
# print(dij)
return np.argmin(Dij)#返回最近类别标记
def U_mean(C):#计算新的均值向量(质心)
U_=[]
for i in range(k):
U_.append(np.mean(C[i],axis=0).tolist())#计算某个类别标记的数据的均值
return U_
# U_mean(C)
count=0
while(1):
count+=1
C=[[] for i in range(k)]
for x in D:#遍历所有数据
c=mindij(x,U)#获取最近距离的类别标记
C[c].append(x.tolist())#将样本添加进该簇集合中
U_=U_mean(C)#计算新的均值向量
if U==U_:#判断新均值向量是否等于前面一轮的均值向量
break#如果相等,则说明收敛,算法退出
else:
U=U_#未收敛,重新计算新的分类
print("迭代了",count,"次才收敛。")
for i in range(k):#描点输出
plt.scatter(np.array(C[i])[:,0],np.array(C[i])[:,1],label="cluster "+str(i))
plt.legend()
plt.show()
K-means聚类
于 2024-06-24 18:40:01 首次发布