Python实现K-means聚类算法并可视化生成动图步骤详解

作者:黑夜里游荡 时间:2021-06-20 23:10:40 

K-means算法介绍

简单来说,K-means算法是一种无监督算法,不需要事先对数据集打上标签,即ground-truth,也可以对数据集进行分类,并且可以指定类别数目 牧师-村民模型

K-means 有一个著名的解释:牧师—村民模型:

有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。
听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。
牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……
就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。

牧师的目的非常明显,就是要让每个来上自己课的村民走的路程最少

算法步骤

  1. 指定k个中心点

  2. 更新数据点所属类别:计算每个数据点到这k个点的欧氏距离,距离最小即为这个数据点的类别

  3. 更新中心点坐标:对每一个类别的数据点求平均,平均值即为新的中心点位置

伪代码


获取m个n维的数据
随即选取k个点作为初始中心点
while keep_changing:
for i in range(m):
for j in range(k):
计算每个点到center的距离
判断离哪个点更近
for center in range(k):
更新类别中心点的坐标

用Python实现K-means聚类算法


import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as datasets

def create_data():
   X,y = datasets.make_blobs(n_samples=1000,n_features=2,centers=[[1,0],[5,4],[2,3],[10,8],[7,4]])
   return X,y

def init_centers(data,k):
   m, n =data.shape
   # m 样本个数,n特征个数
   center_ids = np.random.choice(m,k)
   centers = data[center_ids]
   return centers

def cal_dist(ptA,ptB):
  return np.linalg.norm(ptA-ptB)

def kmeans_process(data,k):
   centers = init_centers(data, k)
   m, n = data.shape
   keep_changing = True
   pred_y = np.zeros((m,))

while keep_changing:
       keep_changing = False
       # 计算剩余样本所属类别
       for i in range(m):
           min_distance = np.inf
           for center in range(k):
               distance = cal_dist(data[i,:],centers[center,:])
               if distance<min_distance: # 判断离哪个更近
                   min_distance = distance
                   idx = center # 类别换下
           if pred_y[i] != idx:   # 判断是否发生了改变
               keep_changing = True
           pred_y[i] = idx
       # 更新类别中心点坐标
       for center in range(k):
           cluster_data = data[pred_y==center]
           centers[center,:] = np.mean(cluster_data, axis=0) # 求相同类别数据点的质心点
       print(centers)
   return centers, pred_y

if __name__ == '__main__':
   X, y = create_data()
   centers , pred_y = kmeans_process(data=X, k=5)
   plt.scatter(X[:,0], X[:,1], s=3, c=pred_y)
   plt.scatter(centers[:,0], centers[:,1], s=10, c='k')
   plt.show()

效果图

Python实现K-means聚类算法并可视化生成动图步骤详解

来源:https://blog.csdn.net/weixin_40756000/article/details/116484391

标签:Python,可视化,K-means,聚类算法
0
投稿

猜你喜欢

  • Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项

    2021-11-15 18:53:31
  • Python IDE Pycharm中的快捷键列表用法

    2022-12-12 19:21:12
  • 一文带你学会Mysql表批量添加字段

    2024-01-22 20:03:04
  • 简单的Python人脸识别系统

    2023-01-26 23:31:57
  • js 分页全选或反选标识实现代码

    2024-04-22 22:44:07
  • python中字典dict排序sorted的实现

    2023-02-20 13:21:45
  • 在前女友婚礼上用python把婚礼现场的WIFI名称改成了

    2023-05-26 15:15:49
  • Python爬取网页中的图片(搜狗图片)详解

    2023-06-24 00:34:45
  • sqlserver 快速生成汉字的首拼字母的函数(经典)

    2012-06-06 20:16:41
  • python调用excel_vba的两种实现方式

    2023-01-07 19:37:37
  • python 中open文件路径的选择问题解析

    2022-04-02 14:04:58
  • Sql2005注射辅助脚本[粗糙版]

    2024-01-24 18:53:47
  • Pytorch可视化的几种实现方法

    2023-06-11 17:44:57
  • Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解

    2021-10-15 16:14:07
  • mysql事务处理用法与实例代码详解

    2024-01-14 04:55:08
  • PHPwind整合最土系统用户同步登录实现方法

    2024-05-11 10:10:53
  • Python实现备份MySQL数据库的方法示例

    2024-01-27 18:20:04
  • Python3 获取文件属性的方式(时间、大小等)

    2022-05-06 09:13:41
  • php mysql获取表字段名称和字段信息的三种方法

    2023-11-18 22:47:26
  • python open读取文件内容时的mode模式解析

    2022-02-05 20:03:35
  • asp之家 网络编程 m.aspxhome.com