机器学习无监督学习sklearn实战一:K-Means 算法聚类对葡萄酒数据集进行聚类分析和可视化( 主成分分析PCA特征降维)

article/2025/8/3 16:31:33

本项目代码在个人github链接:https://github.com/KLWU07/Machine-learning-Project-practice/tree/main/1-Wine%20cluster%20analysis

  如果对于聚类算法理论不理解可参考这篇之前文章机器学习中无监督学习方法的聚类:划分式聚类、层次聚类、密度聚类;如果降维方法主成分分析PCA降维理解可参考这篇文章机器学习数据降维方法。数据wine.data可在个人github链接下载。

一、聚类分析功能说明

1. 数据准备与预处理

  从wine.data文件加载葡萄酒数据集,包含 178 个样本和 14 个特征;将类别标签从 1/2/3 重新编码为 0/1/2;提取特征数据(X)和类别标签(y)。

2. 数据降维和标准化

  使用 PCA(主成分分析)将原始 13 个特征降至 3 个维度;对数据进行标准化处理,确保各特征具有相同尺度。

3. 聚类分析

  使用 K-Means 算法进行聚类,指定聚类数为 3;计算每个样本到三个聚类中心的距离并打印;输出聚类结果的标签和聚类中心坐标。

4. 模型评估

计算并打印六项评估指标:
(1)同质性得分(Homogeneity)
  衡量聚类结果中每个簇是否仅包含同一类别的样本(即聚类结果的 “纯度”)。若所有簇中的样本都属于同一真实类别,则同质性为 1;若簇中样本混杂不同类别,则得分越低,随机聚类时接近 0。
(2)完整性得分(Completeness)
  衡量同一真实类别中的样本是否都被分配到同一个簇中(即真实类别的 “完整性”)。若同一真实类别的所有样本都被聚到同一簇,则完整性为 1;若真实类别样本被分到多个簇,则得分越低,随机聚类时接近 0。
(3)V-measure 得分
  同质性(Homogeneity)和完整性(Completeness)的调和平均,用于综合评估聚类结果的准确性。
(4)调整兰德指数(ARI)
  衡量聚类结果与真实类别之间的一致性,考虑了随机聚类的影响(“调整” 即扣除随机因素)。
(5)调整互信息(AMI)
  衡量聚类标签与真实类别之间的互信息(MI),同样扣除了随机因素的影响。互信息(MI)表示两个变量的共享信息量,调整互信息(AMI)通过标准化使结果更易解释。
(6)轮廓系数(Silhouette Score)
  衡量单个样本与其所在簇的紧密程度(内聚性)和与其他簇的分离程度(分离性),适用于评估聚类数 k 的合理性。

5. 三维可视化

  创建 3D 图形展示 PCA 降维后的聚类结果;使用不同颜色区分三个聚类;用红色星形标记聚类中心;添加坐标轴标签、标题和图例;优化图形布局和视角,提升可视化效果。

二、代码演示

# 导入必要的库(保持不变)
from pandas import read_csv
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from sklearn import metrics# 数据加载和预处理(保持不变)
filename = 'wine.data'
names = ['class', 'Alcohol', 'MalicAcid', 'Ash', 'AlclinityOfAsh', 'Magnesium', 'TotalPhenols', 'Flavanoids','NonflayanoidPhenols', 'Proanthocyanins', 'ColorIntensiyt', 'Hue', 'OD280/OD315', 'Proline']
dataset = read_csv(filename, names=names)
dataset['class'] = dataset['class'].replace(to_replace=[1, 2, 3], value=[0, 1, 2])
array = dataset.values
X = array[:, 1:13]
y = array[:, 0]# 数据降维和聚类(保持不变)
pca = PCA(n_components=3)
X_scale = StandardScaler().fit_transform(X)
X_reduce = pca.fit_transform(X_scale)model = KMeans(n_clusters=3, n_init=10)
model.fit(X_reduce)
labels = model.labels_
centers = model.cluster_centers_
print(model.transform(X_reduce))# 输出模型评估指标(保持不变)
print('%.3f   %.3f   %.3f   %.3f   %.3f    %.3f' % (metrics.homogeneity_score(y, labels),metrics.completeness_score(y, labels),metrics.v_measure_score(y, labels),metrics.adjusted_rand_score(y, labels),metrics.adjusted_mutual_info_score(y, labels),metrics.silhouette_score(X_reduce, labels)
))# 绘制模型的分布图(修改部分)
fig = plt.figure(figsize=(10, 6))  # 添加图形尺寸
ax = fig.add_subplot(111, projection='3d', elev=30, azim=120)  # 修改3D轴创建方式,调整视角
ax.scatter(X_reduce[:, 0], X_reduce[:, 1], X_reduce[:, 2], c=labels, cmap='tab10', s=60, alpha=0.8)  # 优化散点图配置
ax.scatter(centers[:, 0], centers[:, 1], centers[:, 2], marker='*', color='red', s=300, label='Cluster Centers')  # 添加图例标签# 添加坐标轴标签和标题
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_zlabel('PC3')
ax.set_title('KMeans Clustering Result (3D PCA)')
ax.legend()  # 显示图例plt.tight_layout()  # 优化布局
plt.show()
0.740   0.736   0.738   0.740   0.735    0.413 #评估指标六个值

在这里插入图片描述

三、K-Means 算法13个特征无降维聚类3类

# 导入必要的库(保持不变)
from pandas import read_csv
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn import metrics# 数据加载和预处理(保持不变)
filename = 'wine.data'
names = ['class', 'Alcohol', 'MalicAcid', 'Ash', 'AlclinityOfAsh', 'Magnesium', 'TotalPhenols', 'Flavanoids','NonflayanoidPhenols', 'Proanthocyanins', 'ColorIntensiyt', 'Hue', 'OD280/OD315', 'Proline']
dataset = read_csv(filename, names=names)
dataset['class'] = dataset['class'].replace(to_replace=[1, 2, 3], value=[0, 1, 2])
array = dataset.values
X = array[:, 1:14]  # 选择所有13个特征
y = array[:, 0]# 数据标准化(保持不变)
X_scale = StandardScaler().fit_transform(X)# 聚类(使用全部13个特征)
model = KMeans(n_clusters=3, n_init=10)
model.fit(X_scale)
labels = model.labels_
centers = model.cluster_centers_# 输出模型评估指标(保持不变)
print('%.3f   %.3f   %.3f   %.3f   %.3f    %.3f' % (metrics.homogeneity_score(y, labels),metrics.completeness_score(y, labels),metrics.v_measure_score(y, labels),metrics.adjusted_rand_score(y, labels),metrics.adjusted_mutual_info_score(y, labels),metrics.silhouette_score(X_scale, labels)
))
0.879   0.873   0.876   0.897   0.875    0.285 # 评价指标

三、K-Means 算法13个特征降维维聚类3类

# 导入必要的库(保持不变)
from pandas import read_csv
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from matplotlib import pyplot as plt
import numpy as np
from sklearn import metrics# 数据加载和预处理(保持不变)
filename = 'wine.data'
names = ['class', 'Alcohol', 'MalicAcid', 'Ash', 'AlclinityOfAsh', 'Magnesium', 'TotalPhenols', 'Flavanoids','NonflayanoidPhenols', 'Proanthocyanins', 'ColorIntensiyt', 'Hue', 'OD280/OD315', 'Proline']
dataset = read_csv(filename, names=names)
dataset['class'] = dataset['class'].replace(to_replace=[1, 2, 3], value=[0, 1, 2])
array = dataset.values
X = array[:, 1:13]
y = array[:, 0]# 数据降维和聚类(修改降维部分)
pca = PCA(n_components=2)  # 修改为2维降维
X_scale = StandardScaler().fit_transform(X)
X_reduce = pca.fit_transform(X_scale)model = KMeans(n_clusters=3, n_init=10)
model.fit(X_reduce)
labels = model.labels_
centers = model.cluster_centers_
print(model.transform(X_reduce))# 输出模型评估指标(保持不变)
print('%.3f   %.3f   %.3f   %.3f   %.3f    %.3f' % (metrics.homogeneity_score(y, labels),metrics.completeness_score(y, labels),metrics.v_measure_score(y, labels),metrics.adjusted_rand_score(y, labels),metrics.adjusted_mutual_info_score(y, labels),metrics.silhouette_score(X_reduce, labels)
))# 绘制模型的分布图(修改为2D散点图)
plt.figure(figsize=(10, 6))  # 添加图形尺寸
plt.scatter(X_reduce[:, 0], X_reduce[:, 1], c=labels, cmap='tab10', s=60, alpha=0.8)  # 优化散点图配置
plt.scatter(centers[:, 0], centers[:, 1], marker='*', color='red', s=300, label='Cluster Centers')  # 添加图例标签# 添加坐标轴标签和标题
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('KMeans Clustering Result (2D PCA)')
plt.legend()  # 显示图例plt.tight_layout()  # 优化布局
plt.show()
0.740   0.738   0.739   0.726   0.737    0.521 # 六个评价指标

在这里插入图片描述


http://www.hkcw.cn/article/gprqOMtnFg.shtml

相关文章

接口的概念及特性

目录 1、接口的概念2、语法规则2.1 接口的定义2.2、接口的使用 3、特性4、实现多个接口5、接口中的继承6、接口使用实例 1、接口的概念 在现实生活中,接口的例子有很多,比如:笔记本的 USB 接口,电源插座等。在电脑的 USB 口上&am…

品牌控价维护渠道生态与品牌价值的关键

在品牌发展的征程中,随着经销商队伍不断壮大,价格管控已成为关乎品牌存亡的核心命题。价格体系一旦失控,渠道乱象便如潮水般涌来。低价倾销不仅挤压正规经销商的生存空间,削弱其市场竞争力,更会引发消费者对产品价值的…

2011肠衣问题

1 D类竞赛题目---具体题目 D题 天然肠衣搭配问题 天然肠衣(以下简称肠衣)制作加工是我国的一个传统产业,出口量占世界首位。肠衣经过清洗整理后被分割成长度不等的小段(原料),进入组装工序。 传统的生产…

Express教程【001】:Express创建基本的Web服务器

文章目录 1、初识express1.1 什么是Express1.2 主要特点1.3 Express的基本使用1.3.1 安装1.3.2 创建基本的Web服务器 1、初识express 目标: 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创…

CentOS 7 环境中部署 LNMP(Linux + Nginx + MySQL 5.7 + PHP)

在 CentOS 7 环境中部署 LNMP(Linux Nginx MySQL 5.7 PHP) 环境的详细步骤如下。此方案确保各组件版本兼容,并提供完整的配置验证流程。 1. 更新系统 sudo yum update -y 2. 安装 MySQL 5.7 2.1 添加 MySQL 官方 YUM 仓库 由于MySQL并不…

从零打造算法题刷题助手:Agent搭建保姆级攻略

我用Trae 做了一个有意思的Agent 「大厂机试助手」。 点击 https://s.trae.com.cn/a/d2a596 立即复刻,一起来玩吧! Agent 简介 Agent名称为大厂机试助手,主要功能有以下三点。 解题: 根据用户给出的题目给出具体的解题思路引导做…

华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机

5月21日,信创论坛于上海漕河泾会议中心举办。本次论坛以“聚力融合,繁荣生态”为主题,话题聚焦工业制造、交通运输、金融、教育、医疗等领域。华院计算技术(上海)股份有限公司(以下简称“华院计算”&#x…

MyBatis操作数据库

1.MyBatis:MyBatis是一款优秀的持久层框架,用于简化JDBC的开发.(持久层通常指数据访问层,用来操作数据库). 创建userInfo表,并插入如下数据: 在model中建立userinfo实体类,属性与之一一对应. 配置数据库连接字符串,Mybatis中要连接数据库,需要数据库相关参数配置. 接下来就可…

OCC笔记:BRepMesh_IncrementalMesh的使用

1. 函数接口 2. 线性偏转与角度偏转 2.1. theLineDeflection:线性偏转 根据文档推导下 isRelative传入Standard_True时,theLineDeflection为相对值。 参看isRelative说明 //! param isRelative if TRUE deflection used for discretization of //! ea…

调试技巧总结

目录 一.调试1.什么是调试2.调试语义的分类2.1 静态语义2.2 动态语义 二.实用的调试技巧1.屏蔽代码2.借助打印3.查看汇编代码4.调试技巧总结 一.调试 1.什么是调试 调试,通俗易懂地说就是不断排查代码的错误,进行修正的过程,在写代码的时候…

通过实时动作捕捉加速人形机器人训练

通过实时动作捕捉加速人形机器人训练 用于训练、控制和性能优化的精确实时运动学——受到全球机器人创新者的信赖! 为什么选择 Xsens 进行人形机器人训练? 无与伦比的运动数据精度-经过科学验证的运动数据,用于简化AI/ML训练。 轻松集成到…

【UE5 C++】绘制地表贴合线

目录 原理 效果 步骤 源码 原理 先设置绘制线段的起点和终点,然后我们将起点和终点的高度升高,然后通过插值,在起点和终点之间添加多个点,再由这些点向地心发出射线,这样我们就可以获取到这些点在地表的投影点&…

01 redis 的环境搭建

前言 这一系列文章主要包含的内容主要是 各种常用软件的调试环境的搭建 主要的目的是 搭建一个可打断点的一个调试环境 c 系列 主要是基于 clion 调试, java 系列主要是基于 idea 调试, js 系列主要是基于 webstorm 调试 需要有一定的 c, c, java, js 相关基础 基于的…

python打卡训练营打卡记录day40

知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练代码…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(五):语音合成输出与交互增强

Tailwind CSS 实战,基于Kooboo构建AI对话框页面(一) Tailwind CSS 实战,基于Kooboo构建AI对话框页面(二):实现交互功能 Tailwind CSS 实战,基于 Kooboo 构建 AI 对话框页面&#x…

【MySQL】MVCC与Read View

目录 一、数据库并发的三种场景 二、读写场景的MVCC (一)表中的三个隐藏字段 (二)undo 日志 (三)模拟MVCC (四)Read View (五)当前读和快照读 三、RC和…

代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )

图论part11 Floyd 算法精讲 代码随想录链接 题目链接 代码 三维DP数组 import java.util.Scanner;public class Main {// 定义最大距离值,避免使用Integer.MAX_VALUE防止加法溢出public static final int INF 100000000; // 10^8足够大且不会溢出public static…

CSS Day07

1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 (1)Favicon图标 (2)版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…

leetcode hot100刷题日记——29.合并两个有序链表

解答: 方法一:递归 递归的边界条件是啥呢? 递归别想那么多具体步骤,考虑大步骤,小的递归自己会去做的 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//递归比较大小//先考虑…

Spring Boot 整合 Spring Security

DAY30.1 Java核心基础 Spring Boot 整合安全框架 Spring Security 、Shiro Spring Security Spring Security 的核心功能包括认证、授权、攻击防护,通过大量的过滤器和拦截器进行请求的拦截和验证,实现安全校验的功能。 Spring Security 将校验逻辑…