【机器学习】——无监督学习:KMeans

embedded/2024/12/20 18:53:42/

文章目录

  • 聚类
  • 代码实现:
  • 练习案例:葡萄酒风格聚类
    • 可视化: 聚类之后的可视化 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fa7b067d49b346f78890fe23af7e0006.png) 原始数据可视化: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c9609cd8e8884c3fb5e4da7f13dc6b51.png)
    • 无监督学习虽然不要标签,但是效果没有监督学习好啊

聚类

将未标记的样本自动划分成多个类簇(无标签数据)

  • 在销售领域,利用聚类分析对客户历史数据进行分析,对客户划分类别,刻画不同客户群体的特征,从而深入挖掘客户潜在需求,改善服务质量,增强客户黏性
  • 在医学领域,对图像进行分析,挖掘疾病的不同临床特征,辅助医生进行临床诊断。聚类算法被用于图像分割,把原始图像分成若干个特定的、具有独特性质的区域并提取目标
  • 在生物领域,将聚类算法用于推导动植物分类,以往对动植物的认知往往是基于外表和习性,应用聚类分析按照功能对基因聚类,获取不同种类物种之间的基因关联。

聚类目标:得到较高的簇内相似度和较低的簇间相似度,使得簇间的距离尽可能大,簇内样本与簇中心的距离尽可能小(簇内距离尽可能小,簇间距离尽可能大)
聚类得到的簇可以用聚类中心、簇大小、簇密度和簇描述等来表示

  1. 聚类中心是一个簇中所有样本点的均值(质心)
  2. 簇大小表示簇中所含样本的数量
  3. 簇密度表示簇中样本点的紧密程度
  4. 簇描述是簇中样本的业务特征

k-均值聚类是基于划分的聚类算法,计算样本点与类簇质心的距离,与类簇质心相近的样本点划分为同一类簇。k-均值通过样本间的距离来衡量它们之间的相似度,两个样本距离越远,则相似度越低,否则相似度越高

k-均值算法聚类步骤如下:

  • 首先选取𝑘个类簇(𝑘需要用户进行指定)的质心,通常是随机选取。
  • 对剩余的每个样本点,计算它们到各个质心的欧式距离,并将其归入到相互间距离最小的质心所在的簇。计算各个新簇的质心。
  • 在所有样本点都划分完毕后,根据划分情况重新计算各个簇的质心所在位置,然后迭代计算各个样本点到各簇质心的距离,对所有样本点重新进行划分。
  • 重复第(2)步和第(3)步, 直到迭代计算后,所有样本点的划分情况保持不变,此时说明k-均值算法已经得到了最优解,将运行结果返回

【【五分钟学习>机器学习】物以类聚的Kmeans】

代码实现:

#!/usr/bin/python
# -*- coding: utf-8 -*-import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_scoreplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data# 应用k-Means算法
kmeans = KMeans(n_clusters=3)  # 鸢尾花数据集有3个类别
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
print(y_kmeans)
# #效果评估# 计算Calinski-Harabasz分数
CH = calinski_harabasz_score(X, y_kmeans)
print('Calinski-Harabasz Score:', CH)# 创建一个3D图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')# 提取花瓣宽度、萼片长度、花瓣长度作为x、y、z轴
x = X[:, 2]  # 花瓣宽度
y = X[:, 0]  # 萼片长度
z = X[:, 3]  # 花瓣长度
# 绘制聚类结果
for i in range(3):ax.scatter(x[y_kmeans == i], y[y_kmeans == i], z[y_kmeans == i], label=f'Cluster {i}')# 设置图形标题和轴标签
ax.set_xlabel('花瓣宽度')
ax.set_ylabel('萼片长度')
ax.set_zlabel('花瓣长度')
ax.set_title("鸢尾花数据K-Means聚类")
plt.legend()
plt.show()# 创建一个3D图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
Y=iris.target
# 绘制聚类结果
for i in range(3):ax.scatter(x[Y == i], y[Y == i], z[Y == i], label=f'Cluster {i}')# 设置图形标题和轴标签
ax.set_xlabel('花瓣宽度')
ax.set_ylabel('萼片长度')
ax.set_zlabel('花瓣长度')
ax.set_title("鸢尾花数据")
plt.legend()
plt.show()

#可视化:
在这里插入图片描述
在这里插入图片描述
注意:

  1. 聚类确实能聚类成你想要的类别数量,但是每个类别标签是啥就不一定了,需要你自己定义或者指定。
  2. 聚类算法由于是非监督学习算法,所以衡量标准也不一样(没有标签数据了),自行百度吧。

练习案例:葡萄酒风格聚类

在这里插入图片描述

在这里插入图片描述

可视化:
聚类之后的可视化
在这里插入图片描述
原始数据可视化:
在这里插入图片描述

无监督学习虽然不要标签,但是效果没有监督学习好啊


http://www.ppmy.cn/embedded/147331.html

相关文章

51单片机--- 串口控制仿真

51单片机--- 串口控制仿真 实验目标:51单片机接收串口数据,根据数据点亮LED。 实验步骤: 在Proteus里画出原理图 在Keil里用C语言编写程序 在Proteus中导入HEX文件,启动仿真 实验协议: 波特率115200 数据位:8位,停止位:1位,校验位:无。 命令格式: 一条命令为…

基于智能电能表的智能家居能源管理系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 电能测量模块数据传输模块能源管理模块控制算法 数据采集与处理算法能源优化算法代码实现 电能测量模块实现数据传输模块实现系统调试与优化结论与展望 1. 引言 随着智能家居的发展,电能管理成为智能家居系统中的…

unity shader中的逐像素光源和逐顶点光源

在Unity Shader中,逐像素光源和逐顶点光源是两种不同的光照计算方法,它们之间存在显著的区别。 一、基本原理 逐顶点光源:这种方法在顶点着色器中计算每个顶点的光照值。然后,在片段着色器中,通过插值算法将这些顶点…

网络编程 03:端口的定义、分类,端口映射,通过 Java 实现了 IP 和端口的信息获取

一、概述 记录时间 [2024-12-19] 前置文章: 网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型 网络编程 02:IP 地址,IP 地址的作用、分类,通过 …

Springboot静态资源

默认位置 静态资源访问目录下的资源可以直接访问,默认的四个位置 classpath:/META-INF/resources/(默认加载,不受自定义配置的影响) classpath:/resources/ classpath:/static/ classpath:/public/ 如果在静态目录下存在favic…

【docker】列出与特定镜像名相关的镜像

目录 1. 说明2. 列出所有镜像3. 使用镜像名过滤4. 列出特定标签的镜像5. 结合多个过滤条件6. 使用 JSON 格式和 jq 工具 1. 说明 1.在 Docker 中,如果你想列出与特定镜像名相关的镜像,可以使用 docker images 命令并结合过滤选项(如 --filte…

如何更新项目中的 npm 或 Yarn 依赖包至最新版本

要升级 package.json 文件中列出的包,你可以使用 npm(Node Package Manager)或 yarn。以下是两种工具的命令来更新你的依赖项: 使用 npm 更新所有包到最新版本 npm update如果你想将所有依赖项更新到其各自最新的大版本&#xf…

java使用itext生成复杂数据的pdf

上一篇文章是 java使用itext生成pdf标签 使用了 Adobe Acrobat 软件 设置域 本篇文章不使用其他工具,纯代码手写 pdf表格 首先,什么是Itext Apache iText 是一个开源 Java 库,支持 PDF 文档的开发和转换。 在本教程中,我们将学…