机器学习之K_means(附简单手写代码)

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。(摘自百度百科)

假设对基本的二维平面上的点进行K均值聚类,其实现基本步骤是:

  1. 事先选定好K个聚类中心(假设要分为K类)。
  2. 算出每一个点到这K个聚类中心的距离,然后把该点分配给距离它最近的一个聚类中心
  3. 更新聚类中心。算出每一个类别里面所有点的平均值,作为新的聚类中心。
  4. 给定迭代此次数,不断重复步骤2,3,达到该迭代次数后自动停止。

思想很简单,实现起来也很简单,附上代码(有注释):

import numpy as np
import matplotlib.pyplot as plt

#np.random.seed(300)
x=np.random.rand(200)*15    #产生要聚类的数据点,(0,15)之间
y=np.random.rand(200)*15

center_x=[]    #存放聚类中心座标
center_y=[]
result_x=[]    #存放每次迭代后每一小类的座标
result_y=[]

number_cluster=4   #簇数
time=50   #迭代次数

color=['red','blue','black','orange']

for i in range(number_cluster):  # 随机生成中心
    result_x.append([])      #顺便初始化存放聚类结果的列表
    result_y.append([])
    x1 = np.random.choice(x)  #为了避免出现聚类后有的簇一个点也没有,
    y1 = np.random.choice(y)  #干脆就以某一个数据点为中心
    if x1 not in center_x and y1 not in center_y:
        center_x.append(x1)
        center_y.append(y1)

plt.scatter(x,y)  #画出数据图
plt.title('init plot')
plt.show()

def K_means():
    for t in range(time):
        for i in range(len(x)):
            distance = []   #存放每个点到各中心的距离
            for j in range(len(center_x)):
                k = (center_x[j] - x[i]) ** 2 + (center_y[j] - y[i]) ** 2  #距离
                distance.append([k])
            result_x[distance.index(min(distance))].append(x[i])  #聚类
            result_y[distance.index(min(distance))].append(y[i])
        plt.title('iterations:'+str(t+1))
        for i in range(number_cluster):
            plt.scatter(result_x[i], result_y[i], c=color[i])
        plt.show()

        # 更新位置
        center_x.clear()
        center_y.clear()
        for i in range(number_cluster):
            ave_x = np.mean(result_x[i])
            ave_y = np.mean(result_y[i])
            center_x.append(ave_x)
            center_y.append(ave_y)


if __name__=='__main__':
    K_means()

结果展示:
1.初始化:
在这里插入图片描述
2.第一次迭代:
在这里插入图片描述
3.第二次迭代:
在这里插入图片描述
4.第九次迭代(收敛):
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章