k-means算法
k-means算法是一个机器学习的经典算法,用求聚类。是无监督学习的典型代表
由于时间关系(赶着出去玩),直接上代码,可能会有bug hhh
import numpy as np
import math
#定义结点
class node:
def _init_(self,x1,x2):
self.x1=x1
self.x2=x2
#生成初始的K个质心
def get_initial_centroids(K):
x1=np.random.rand(K)
x2=np.random.rand(K)
return np.vstack((x1,x2)).T
#计算欧式距离
def Euclid_Distance(a1,b1,a2,b2):
distance=math.sqrt((a1-b1)**2+(a2-b2)**2)
return distance
if __name__ == '__main__':
print("请输入K的值")
K=int(input())
centre=get_initial_centroids(K)
print("请输入数据的个数的两倍")
y=int(input())#y为输入数据的个数,为偶数。
if y%2 != 0:
print("y得为偶数")
print("请输入数据")
data=[]
for i in range(0,int(y)):
x=int(input())
data.append(x)
data=np.array(data)
data=data.reshape((int(y/2),2))
epoch=int(input())#输入迭代次数
i=0
#print(centre)
#print(data)
while i<epoch:
lis=[]
m={}
for j in range(0,K):
lis.append([])
for j in range(0,int(y/2)):
m={}
for k in range(0,K):
m[Euclid_Distance(data[j][0],centre[k][0],data[j][1],centre[k][1])]=k
kkk=0
for k in m:
if kkk==0:
kk=k
elif k<kk:
kk=k
kkk+=1
lis[m[kk]].append(j)
#重新计算质心
for j in range(0,K):
xx=0
yy=0
pc=0
for k in lis[j]:
xx+=data[k][0]
yy+=data[k][1]
pc=pc+1
if pc==0:
continue
centre[j][0]=xx/pc
centre[j][1]=yy/pc
i+=1
print(lis)