实验8 聚类算法
数据见points.csv,编程实现kmeans聚类算法。
测试代码见main.py
(将执行正确的K_MeansPy函数的代码粘贴在此处)
import numpy as np
def K_MeansPy(data,K):
m=data.shape[0]#m是数据格式,n是数据维数
n=data.shape[1]
ma=np.zeros((1,n))#每一维最大的数
mi=np.zeros((1,n))#每一维最小的数
u=np.zeros((K,n))#随机初始化,最终迭代到每一类的中心位置
#先随机找一个质点
for i in range(n):
ma[0,i]=np.max(data[:,i])
mi[0,i]=np.min(data[:,i])
for j in range(K):
u[j,i]=mi[0,i]+(ma[0,i]-mi[0,i])*np.random.rand()
while(1):
pre_u=u.copy()
coord_diff_cell=np.empty([m,K],dtype=object)
for i in range(m):
for j in range(K):
coord_diff_cell[i,j]=data[i,:]-u[j,:]
Dist=np.ones((m,K))*-1
for i in range(m):
c=np.zeros((1,K))
for j in range(K):
c[0,j]=np.linalg.norm(coord_diff_cell[i,j])
index=c.argmin(1)
ind=index[0] #index返回list
Dist[i,index]=np.linalg.norm(coord_diff_cell[i,ind])
for i in range(K):
ind =np.nonzero(Dist[:,i]>0)#属于第几个簇
y=data[ind,:]
x=y[0,:,:]
u[i,:]=np.mean(x,axis=0) #axis=0,计算每一列的均值
if np.linalg.norm(pre_u-u)<0.1:
break
clusterID=np.ones((1,m))*-1
for i in range(m):
dist=np.empty([1,K])
for j in range(K):
dist[0,j]=np.linalg.norm(data[i,:]-u[j,:])
index=dist.argmin(1)
index=index[0]
clusterID[0,i]=index
print(clusterID)
return u,clusterID