K-means

import numpy as np
import math

point = np.array([[0,0], [3,8], [2,2], [1,1], [5,3],
                  [4,8], [6,3], [5,4], [6,4], [7,5]])
#任选K个初始聚类中心,一般可选取前K个样本作为初始聚类中心
k=3
z1 = point[0]
z2 = point[1]
z3 = point[2]
#按照最短距离原则将其余样本分配到K个聚类中心中的某一个
while True:
    temp1 = np.empty((0,2),dtype=int)
    temp2 = np.empty((0,2),dtype=int)
    temp3 = np.empty((0,2),dtype=int)
    n1 = 0
    n2 = 0
    n3 = 0
    for i in range(10):
        #计算每个样本到各个聚类中心的距离,按最短距离原则将其余样本分配到K个聚类中心的某一个
        d1=np.linalg.norm(point[i]-z1)
        d2=np.linalg.norm(point[i]-z2)
        d3=np.linalg.norm(point[i]-z3)
        d = min(d1, d2, d3)
        if d == d1:
            n1 += 1
            temp1 = np.vstack((temp1, point[i]))
        elif d == d2:
            n2 += 1
            temp2 = np.vstack((temp2, point[i]))
        else:
            n3 += 1
            temp3 = np.vstack((temp3, point[i]))
    #输出每一轮中的聚类中心
    zt1= sum(temp1) / n1
    zt2 = sum(temp2) / n2
    zt3 = sum(temp3) / n3
    print("新的聚类中心为:",zt1,zt2,zt3)
    print("\n")
    #如果Z(k+1)=Z(k)则算法收敛计算完毕,如果Z(k+1)!=Z(k)则计算新的聚类中心,重复上述步骤
    if ((z1 == sum(temp1) / n1).all()) and ((z2 == sum(temp2) / n2).all()) and ((z3 == sum(temp3) / n3).all()):
        break
    #计算新的聚类中心
    z1 = sum(temp1) / n1
    z2 = sum(temp2) / n2
    z3 = sum(temp3) / n3

list1=temp1.tolist()
list2=temp2.tolist()
list3=temp3.tolist()

print("算法收敛,最后结果")
print("第一个聚类中心:",z1)
print("该聚类中心包括的点:",list1)

print("第二个聚类中心:",z2)
print("该聚类中心包括的点:",list2)

print("第三个聚类中心:",z3)
print("该聚类中心包括的点:",list3)
            

你可能感兴趣的:(kmeans,聚类)