C均值算法实现

###总结

1、np.array是没有空数组的,需要先成立一个空的list,给他添加元素,然后将它转化为np.array的格式

2、直接使两个center相等,以后他们会一直相等,因为使用的是同一个指针。

###源程序

 

import numpy as np
import matplotlib.pyplot as plt

dataset = np.array([[0, 0], [1, 0], [0, 1], [1, 1], [2, 1],
                   [1, 2], [2, 2], [3, 2], [6, 6], [7, 6],
                   [8, 6], [6, 7], [7, 7], [8, 7], [9, 7],
                   [7, 8], [8, 8], [9, 8], [8, 9], [9, 9]])

plt.figure(1)
plt.scatter(dataset[:, 0], dataset[:, 1])

C = 2
C0 = []
C1 = []
center = dataset[0:C, :]
center = center.astype(float)
center_ = np.copy(center) #注意不能直接等于哦
while 1:

    #使用欧氏距离聚类
    for xi in dataset:
        if np.linalg.norm(center[0, :] - xi) < np.linalg.norm(center[1, :] - xi):
            C0.append(xi)
        else:
            C1.append(xi)

    #计算聚类中心
    C0 = np.array(C0)
    C1 = np.array(C1)
    center_[0] = np.mean(C0, axis=0)
    center_[1] = np.mean(C1, axis=0)

    #判断是否达到最优
    if np.sum(np.abs(center-center_)) <= 0.0:
        break

    #更新聚类中心
    center = center_
    C0 = []
    C1 = []

plt.figure(2)
plt.scatter(C0[:, 0], C0[:, 1], marker='o', color='b')
plt.scatter(C1[:, 0], C1[:, 1], marker='o', color='r')
plt.show()

 

posted @ 2021-03-16 14:39  潜心_修炼  阅读(303)  评论(0编辑  收藏  举报