Python实现K-means聚类算法并可视化生成动图步骤详解
作者:黑夜里游荡 发布时间:2021-06-20 23:10:40
标签:Python,可视化,K-means,聚类算法
K-means算法介绍
简单来说,K-means算法是一种无监督算法,不需要事先对数据集打上标签,即ground-truth,也可以对数据集进行分类,并且可以指定类别数目 牧师-村民模型
K-means 有一个著名的解释:牧师—村民模型:
有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。
听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。
牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……
就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。
牧师的目的非常明显,就是要让每个来上自己课的村民走的路程最少
算法步骤
指定k个中心点
更新数据点所属类别:计算每个数据点到这k个点的欧氏距离,距离最小即为这个数据点的类别
更新中心点坐标:对每一个类别的数据点求平均,平均值即为新的中心点位置
伪代码
获取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()
效果图
来源:https://blog.csdn.net/weixin_40756000/article/details/116484391
0
投稿
猜你喜欢
- 之前都是直接拿sax,或dom等库去解析xml文件为Python的数据类型再去操作,比较繁琐,如今在写Django网站ajax操作时json
- 我查了资料:setRequestHeader,单独指定请求的某个http头语法oXMLHttpRequest.setRequestHeade
- 初识项目打开VS2015,创建Web项目,选择ASP.NET Web Application,在弹出的窗口里选择ASP.NET 5 Webs
- 出自: 编程中国 http://www.bc-cn.net作者: 天涯听雨 &nbs
- 做图像识别的时候需要在图片中画出特定大小和角度的矩形框,自己写了一个函数,给定的输入是图片名称,矩形框的位置坐标,长宽和角度,直接输出画好矩
- 在ASP中,如何获得ADO的连接信息? 具体方法见下列代码:<%Sub Connecti
- try { int readByte = 0;  
- INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的
- Linux终端里面可谓是奇妙无限,很多优秀的软件都诞生在终端里面。相较之下,Windows本身的理念和Linux就不一致,所以,你懂得。 下
- 0. 学习目标栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作
- 【原文地址】 Tip/Trick: How to upload a .SQL file to a Hoster and
- 本文实例讲述了Yii开启片段缓存的方法。分享给大家供大家参考,具体如下:1、main.php文件中的components中添加:cache&
- 不得不承认,傲游在用户体验方面是做得比较好的,所以它的用户群非常大。也正因为如此,它的某些不好的特性也造成了开发人员不可忽略的浏览器兼容问题
- 1、灵活运用样式熟悉网页设计的网友就知道,调用Style的方法很多,我们可以单击鼠标右键选择Custon Style来调用Style标准,也
- 前言相信看到这个题目,可能大家都觉得是一个老生常谈的月经topic了。一直以来其实把握一个“值传递”基本上就能理解各种情况了,不过最近遇到了
- 在asp里通过以下两个函数实现javascript里的escape函数和unescape函数加密功能。在ajax post或get时内容存在
- 我把数据库操作类整理了一下,它包含了常用的数据库操作,由三种方式:简单的SQL拼接字符串的形式,SQL语句使用参数的形式和存储过程的形式,每
- 一、无镜像安装 pip install 库名打开命令提示符【win + r】,输入cmd,在命令提示窗口输入pip install 库名,
- Ajax 技术改变了大型商业 Web 应用程序的外观,但是许多较小的 Web 站点都不具备足够的资源重新构建完整的用户界面(UI)。Ajax
- 微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地,今天我们要将便是如何用Python来生成一个微信机器