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
投稿
猜你喜欢
- 需求是这样的,我从本科到现在硬盘里存了好多照片,本来是按类别分的,有一天,我突然想,要是能按照时间来分类可能会更好。可以右键查看照片的属性,
- 前言在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,
- 前言OpenCV是图像处理常用的库,作为初学者,往往从图片的读取、保存、查询图片的信息开始,下面将分享Python下OpenCV的一些基本使
- 需求:需要在v-html的html字符串的button中绑定点击事件,需要点击后做一些操作,必须渲染成html,但是渲染后的html里面写绑
- 这篇文章主要介绍了使用python远程操作linux过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- Microsoft SQL Server 7.0安全问题Microsoft Corporation【「Microsoft SQL Serve
- 大家好,之前分享过很多关于 Pandas 的文章,今天我给大家分享5个小而美的 Pandas 实战案例。内容主要分为:如何自行模拟数据多种数
- 1. 文件操作Python中的文件操作通常使用内置的open()函数来打开文件。以下是一个简单的示例:with open("fil
- 将mat文件转为png花费了很大力气做这件事,总是出现各种错误,现在终于解决了from PIL import Imageimport mat
- HTML实体符号被用作实现保留字符(reserved characters)或者表达键盘无法输入的一些常用字符。在大多数浏览器中默认的字符集
- 本文实例为大家分享了python调用百度语音REST API的具体代码,供大家参考,具体内容如下(百度的rest接口的部分网址发生了一定的变
- 一、通过eval实现 常用内置函数(不用import就可以直接使用) :help(obj) 在线帮助, obj可是任何类型call
- watch介绍vue中watch用来监听数据的响应式变化.获取数据变化前后的值watch的完整入参watch(监听的数据,副作用函数,配置对
- 设计模式:迭代迭代是一种设计模式,解决有序便利序列的问题。通用的可迭代对象需要支持done和next方法。伪代码如下:while not i
- 对于DBA来说,丢失超管用户root的密码是致命的,可以通过添加--ship-grant-tables参数来跳过权限表。1、忘记root密码
- 引言大纲这个月我会整理分享一系列后端工程师求职面试相关的文章,知识脉络图如下:JAVA/GO/PHP 面试常问的知识点DB:MySql Pg
- 目录1.自定义行索引2. 按普通索引选择数据2.1 按普通索引选择单行数据2.2 按行索引选择多行数据3.按位置索引选择数据3.2 按位置索
- 使用python3+opencv3.3.1环境将视频流保存为本地视频文件,具体内容如下1、利用opencv中的VideoCapture类获取
- 两大类索引使用的存储引擎:MySQL5.7 InnoDB聚簇索引* 如果表设置了主键,则主键就是聚簇索引* 如果表没有主键,则会默认第一个N
- 什么是生成器?生成器是一个包含了特殊关键字yield的函数。当被调用的时候,生成器函数返回一个生成器。可以使用send,throw,clos