以k=3为例进行说明
(1)从数据中随机取k个数;
(2)遍历数据进行分类(本文分类标准选择了欧式距离);
(3)第一次分类结束后,计算每个分类中的平均数,代替(1)中的k个数;
(4)循环,迭代。
送上代码:
import numpy as np
import random
import matplotlib.pyplot as plt
k=3#需要分成的簇
n=20#循环次数
a=10*np.random.random((500,2))
#初始化k个点
b=[]
for i in range(len(a)):
b.append(i)
c=random.sample(b,k)
d=[]
for i in range(len(c)):
d.append(a[c[i]])
#定义距离函数
def distance(x,y):
s=0
for i in range(len(x)):
s=s+(x[i]-y[i])**2
return(s)
#遍历分类
#第一次循环是循环次数
for i in range(n):
A=[]
B=[]
C=[]
#第二次循化是遍历数据
for i in range(len(a)):
if min(distance(a[i],d[0]),distance(a[i],d[1]),distance(a[i],d[2]))==distance(a[i],d[0]):
A.append(a[i])
elif min(distance(a[i],d[0]),distance(a[i],d[1]),distance(a[i],d[2]))==distance(a[i],d[1]):
B.append(a[i])
elif min(distance(a[i],d[0]),distance(a[i],d[1]),distance(a[i],d[2]))==distance(a[i],d[2]):
C.append(a[i])
#可以查看分类后,每簇数据的个数
print(len(A),len(B),len(C))
#定义画图的视野范围
plt.xlim(xmax=10,xmin=0)
plt.ylim(ymax=10,ymin=0)
#画图
for i in range(len(A)):
plt.plot(A[i][0],A[i][1],'ro')
for i in range(len(B)):
plt.plot(B[i][0],B[i][1],'go')
for i in range(len(C)):
plt.plot(C[i][0],C[i][1],'bo')
plt.show()
#步(3)中的k个数的计算
d00=0
for i in range(len(A)):
d00=d00+A[i][0]
d00=d00/len(A)
d01=0
for i in range(len(A)):
d01=d01+A[i][1]
d01=d01/len(A)
d10=0
for i in range(len(B)):
d10=d10+B[i][0]
d10=d10/len(B)
d11=0
for i in range(len(B)):
d11=d11+B[i][1]
d11=d11/len(B)
d20=0
for i in range(len(C)):
d20=d20+C[i][0]
d20=d20/len(C)
d21=0
for i in range(len(C)):
d21=d21+C[i][1]
d21=d21/len(C)
d[0][0]=d00
d[0][1]=d01
d[1][0]=d10
d[1][1]=d11
d[2][0]=d20
d[2][1]=d21
献上3张结果图: