基于K-Means聚类算法演示及可视化展示
作者:Eureka丶 发布时间:2023-02-08 16:01:39
K-Means聚类算法演示及可视化展示
#导入包
from sklearn.cluster import KMeans
X = [[0.0888, 0.5885], [0.1399, 0.8291], [0.0747, 0.4974], [0.0983, 0.5772], [0.1276, 0.5703],
[0.1671, 0.5835], [0.1906, 0.5276], [0.1061, 0.5523], [0.2446, 0.4007], [0.167, 0.477],
[0.2485, 0.4313], [0.1227, 0.4909], [0.124, 0.5668], [0.1461, 0.5113], [0.2315, 0.3788],
[0.0494, 0.559], [0.1107, 0.4799], [0.2521, 0.5735], [0.1007, 0.6318], [0.1067, 0.4326],
[0.1956, 0.428]]
# 输出数据集
print(X)
"""
KMeans聚类
clf = KMeans(n_clusters=3) 表示类簇数为3,聚成3类数据,clf即赋值为KMeans
y_pred = clf.fit_predict(X) 载入数据集X,并且将聚类的结果赋值给y_pred
"""
clf = KMeans(n_clusters=3)
y_pred = clf.fit_predict(X)
# 输出聚类预测结果,20行数据,每个y_pred对应X一行,聚成3类,类标为0、1、2
print(y_pred)
#可视化绘图
import matplotlib.pyplot as plt
# 获取第一列和第二列数据 使用for循环获取 n[0]表示X第一列
x = [n[0] for n in X]
print(x)
y = [n[1] for n in X]
print(y)
# 绘制散点图 参数:x横轴 y纵轴 c=y_pred聚类预测结果 marker类型 o表示圆点 *表示星型 x表示x
plt.scatter(x, y, c=y_pred, marker='o')
# 绘制标题
plt.title("Kmeans-Basketball Data")
# 绘制x轴和y轴坐标
plt.xlabel("assists_per_minute")
plt.ylabel("points_per_minute")
plt.legend([0,1,2])
# 显示图形
plt.show()
5分钟带你弄懂K-Means聚类
聚类与分类的区别
分类:类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。属于监督学习。
聚类:事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。属于无监督学习。
关于监督学习和无监督学习,这里给一个简单的介绍:是否有监督,就看输入数据是否有标签,输入数据有标签,则为有监督学习,否则为无监督学习。更详尽的解释会在后续博文更新,这里不细说。
k-means 聚类
聚类算法有很多种,K-Means 是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
K-Means 聚类算法的大致意思就是“物以类聚,人以群分”:
首先输入 k 的值,即我们指定希望通过聚类得到 k 个分组;
从数据集中随机选取 k 个数据点作为初始大佬(质心);
对集合中每一个小弟,计算与每一个大佬的距离,离哪个大佬距离近,就跟定哪个大佬。
这时每一个大佬手下都聚集了一票小弟,这时候召开选举大会,每一群选出新的大佬(即通过算法选出新的质心)。
如果新大佬和老大佬之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止。
如果新大佬和老大佬距离变化很大,需要迭代3~5步骤。
说了这么多,估计还是有点糊涂,下面举个非常形象简单的例子:
有6个点,从图上看应该可以分成两堆,前三个点一堆,后三个点另一堆。现在我手工地把 k-means 计算过程演示一下,同时检验是不是和预期一致:
1.设定 k 值为2
2.选择初始大佬(就选 P1 和 P2)
3.计算小弟与大佬的距离:
从上图可以看出,所有的小弟都离 P2 更近,所以次站队的结果是:
A 组:P1
B 组:P2、P3、P4、P5、P6
4.召开选举大会:
A 组没什么可选的,大佬就是自己
B 组有5个人,需要重新选大佬,这里要注意选大佬的方法是每个人 X 坐标的平均值和 Y 坐标的平均值组成的新的点,为新大佬,也就是说这个大佬是“虚拟的”。因此,B 组选出新大哥的坐标为:P 哥((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)。
综合两组,新大哥为 P1(0,0),P哥(6.2,5.6),而P2-P6重新成为小弟。
5.再次计算小弟到大佬的距离:
这时可以看到P2、P3离P1更近,P4、P5、P6离P哥更近,所以第二次站队的结果是:
A 组:P1、P2、P3
B 组:P4、P5、P6(虚拟大哥这时候消失)
6.第二届选举大会:
同样的方法选出新的虚拟大佬:P哥1(1.33,1),P哥2(9,8.33),P1-P6都成为小弟。
7.第三次计算小弟到大佬的距离:
这时可以看到 P1、P2、P3 离 P哥1 更近,P4、P5、P6离 P哥2 更近,所以第二次站队的结果是:
A 组:P1、P2、P3
B 组:P4、P5、P6
我们可以发现,这次站队的结果和上次没有任何变化了,说明已经收敛,聚类结束,聚类结果和我们最开始设想的结果完全一致。
K-Means 聚类 MATLAB 实现
关于 K-Means 的算法具体代码,网上有各种版本,这里也不赘述了,下面结合 MATLAB 中的一些函数给出一个较为简洁的版本:
X2 = zscore(X); % zscore方法标准化数据
Y2 = pdist(X2); % 计算距离(默认欧式距离)
Z2 = linkage(Y2); % 定义变量之间的连接,用指定的算法计算系统聚类树
T = cluster(Z2,6); % 创建聚类
H = dendrogram(Z2); %作出系谱图
最终聚类系谱图如下所示:
当然,MATLAB 也提供了 kmeans() 函数可供直接聚类使用,详情可参与其文档。
来源:https://blog.csdn.net/Jeremiah_/article/details/120724179
猜你喜欢
- 如下所示:def softmax(logits, axis=None, name=None, dim=None): ""
- 一 导入 pymongofrom pymongo import MongoClient二 连接服务器 端口号 27017连接MongoDB连
- 内容摘要: 当用户填写页面<FORM>内容时所提供的全部值,或在浏览器地址栏输入在URL后的值,通过Form和QueryStrin
- 我们在做表单的时候经常会使用到这样的结构:<fieldset> <lege
- 重读LukeW的《Web Form Design:Filling in the Blanks》感触很深,除佩服LukeW的钻研精神外,更多的
- PIL vs PillowPIL: Python Imaging Library,是python的图像处理库。由于PIL不兼容setupto
- 一、查询操作可以使用Dataframe的index属性和columns属性获取行、列索引。import pandas as pddata =
- 在本节描述的示例代码,提供真实的例子来示范在 FileSystemObject 对象模式中可用的许多功能。该代码显示了如何一起使用对象模式的
- SPAN 和 DIV 的区别在于,DIV(division)是一个块级元素,可以包含段落、标题、表格,乃至诸如章节、摘要和备注等。而SPAN
- .xls格式 Office2003及以下版本 .xlsx格式Offi
- ff默认不让改 statusopera9 测试通过ie6 测试通过这东西是给统计部门用的,分析用户习惯以改良网站布局
- 一、基本介绍logging 模块是python自带的一个包,因此在使用的时候,不必安装,只需要import即可。logging有 5 个不同
- 一、我们对XML的读取进行一波演示import xml.dom.minidom#负责解析xml文件的包from xml.dom.minido
- random 模块中的常用函数random()返回一个位于区间 [0,1] 内的实数;uniform(a, b)返回一个位于区间 [a,b]
- 前言favicon.ico是网站的图标也是网站的头像,简单来说,就是让我们的网站更加好看。本文主要给大家介绍了关于优雅处理Django中fa
- pandas基于numpy,所以其中的空值nan和numpy.nan是等价的。numpy中的nan并不是空对象,其实际上是numpy.flo
- 记录一些pandas选择数据的内容,此前首先说行列名的获取和更改,以方便获取数据。此文作为学习巩固。这篇博的内容顺序大概就是: 行列名的获取
- 变量(variable)是Python语言中一个非常重要的概念。变量的主要作用就是为Python程序中的某个值起一个名字。类似于“张三”、“
- 用python实现FTP文件传输,包括服务器端和客户端,要求(1)客户端访问服务器端要有一个验证功能(2)可以有多个客户端访问服务器端(3)
- 一、背景有一段代码,因为调用了封装的方法,所以会有一些本来不需要的返回值。这些返回值该怎么处理才能让它消失呢。有的人会说,清除变量不就好了吗