当前位置: 首页 > news >正文

从iris数据集实战出发:手把手教你用Python+sklearn玩转KMeans聚类与t-SNE可视化

从鸢尾花数据到视觉洞察:Python实战KMeans与t-SNE的降维艺术

鸢尾花数据集在机器学习领域就像"Hello World"之于编程新手。但不同于简单的分类任务,这次我们要用无监督学习的方式,让算法自己发现数据中隐藏的模式。本文将带你用Python和sklearn库,从数据加载到最终可视化,完整实现KMeans聚类分析,并借助t-SNE这一强大的降维工具,让高维数据的聚类结果跃然纸上。

1. 环境准备与数据初探

工欲善其事,必先利其器。我们先确保环境配置正确:

# 基础库导入 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from sklearn.cluster import KMeans from sklearn.manifold import TSNE from sklearn.datasets import load_iris

鸢尾花数据集包含150个样本,每个样本有4个特征:

  • 花萼长度(sepal length)
  • 花萼宽度(sepal width)
  • 花瓣长度(petal length)
  • 花瓣宽度(petal width)

加载数据只需几行代码:

iris = load_iris() X = iris.data # 特征矩阵 y = iris.target # 真实标签(仅用于后期评估) feature_names = iris.feature_names

提示:虽然我们有真实标签y,但聚类是无监督学习,算法不会使用这些标签信息。

初步查看数据分布:

pd.DataFrame(X, columns=feature_names).describe()

输出显示各特征的数值范围差异较大,这正是我们需要标准化的原因。

2. 数据预处理:标准化的必要性

不同特征的量纲差异会影响距离计算。比如花萼长度范围是4.3-7.9cm,而花瓣宽度只有0.1-2.5cm。如果不处理,KMeans会过度依赖数值范围大的特征。

我们采用MinMaxScaler将各特征缩放到[0,1]范围:

scaler = MinMaxScaler() X_scaled = scaler.fit_transform(X)

标准化前后的数据分布对比:

特征原始范围标准化后范围
花萼长度4.3-7.90-1
花萼宽度2.0-4.40-1
花瓣长度1.0-6.90-1
花瓣宽度0.1-2.50-1

3. KMeans聚类实战

KMeans的核心思想是迭代寻找最优的簇中心(质心),使得样本到所属簇中心的距离之和最小。在sklearn中实现非常简单:

kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X_scaled) y_pred = kmeans.labels_

几个关键输出:

  • cluster_centers_: 各簇的质心坐标
  • labels_: 每个样本的预测簇标签
  • inertia_: 簇内平方和(SSE),衡量聚类紧密程度

我们可以查看质心位置:

print("簇中心坐标:\n", kmeans.cluster_centers_) print("簇内平方和:", kmeans.inertia_)

4. 高维数据的可视化难题与t-SNE解决方案

四维数据难以直接可视化,我们需要降维。t-SNE(t-分布随机邻域嵌入)特别适合将高维数据降到2D或3D可视化:

  • 保留局部相似性:高维空间中相近的点在低维中也相近
  • 非线性降维:能捕捉复杂的流形结构
  • 对簇结构展示效果极佳

实现代码:

tsne = TSNE(n_components=2, random_state=42) X_tsne = tsne.fit_transform(X_scaled) plt.figure(figsize=(10,6)) plt.scatter(X_tsne[:,0], X_tsne[:,1], c=y_pred, cmap='viridis') plt.title('t-SNE可视化KMeans聚类结果') plt.colorbar() plt.show()

5. 聚类效果的多维度评估

虽然聚类是无监督学习,但我们仍需要评估结果质量。常用指标包括:

5.1 轮廓系数(Silhouette Score)

衡量一个样本与同簇和其他簇的相似度差异,范围在[-1,1]:

  • 接近1表示样本聚类合理
  • 接近0表示样本在两个簇的边界上
  • 接近-1表示样本可能被分错簇

计算代码:

from sklearn.metrics import silhouette_score score = silhouette_score(X_scaled, y_pred) print(f"轮廓系数:{score:.3f}")

5.2 Calinski-Harabasz指数

簇间离散度与簇内离散度的比值,值越大越好:

from sklearn.metrics import calinski_harabasz_score ch_score = calinski_harabasz_score(X_scaled, y_pred) print(f"Calinski-Harabasz指数:{ch_score:.1f}")

5.3 与真实标签的对比(可选)

虽然聚类不需要标签,但如果有的话可以对比:

from sklearn.metrics import adjusted_rand_score ari = adjusted_rand_score(y, y_pred) print(f"调整兰德指数:{ari:.3f}")

6. 参数调优与最佳K值选择

KMeans需要预先指定簇数量K。如何确定最佳K值?以下是几种实用方法:

6.1 肘部法则(Elbow Method)

绘制不同K值对应的SSE曲线,寻找拐点:

inertias = [] for k in range(1, 8): kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(X_scaled) inertias.append(kmeans.inertia_) plt.plot(range(1,8), inertias, marker='o') plt.xlabel('K值') plt.ylabel('SSE') plt.title('肘部法则选择最佳K值') plt.show()

6.2 轮廓系数法

计算不同K值的平均轮廓系数:

sil_scores = [] for k in range(2, 8): kmeans = KMeans(n_clusters=k, random_state=42) y_pred = kmeans.fit_predict(X_scaled) sil_scores.append(silhouette_score(X_scaled, y_pred)) plt.plot(range(2,8), sil_scores, marker='o') plt.xlabel('K值') plt.ylabel('平均轮廓系数') plt.title('轮廓系数法选择最佳K值') plt.show()

6.3 综合评估结果

将三种评估指标可视化对比:

K值SSE轮廓系数Calinski-Harabasz
272.60.68513.9
339.80.55561.6
428.60.50530.5

从表中可见,K=3时各项指标相对均衡,确实是鸢尾花数据的合理簇数。

7. 高级可视化技巧

为了让聚类结果更加直观,我们可以结合多种可视化手段:

7.1 平行坐标图

展示各特征在不同簇中的分布:

df = pd.DataFrame(X_scaled, columns=feature_names) df['cluster'] = y_pred pd.plotting.parallel_coordinates(df, 'cluster', colormap='viridis') plt.title('平行坐标图展示簇特征分布') plt.show()

7.2 热力图展示簇中心

centers = pd.DataFrame(kmeans.cluster_centers_, columns=feature_names) plt.figure(figsize=(10,4)) sns.heatmap(centers.T, cmap='YlGnBu', annot=True) plt.title('各簇中心特征值热力图') plt.show()

7.3 3D散点图

如果使用t-SNE降到3维,可以创建交互式3D图:

from mpl_toolkits.mplot3d import Axes3D tsne3d = TSNE(n_components=3, random_state=42) X_tsne3d = tsne3d.fit_transform(X_scaled) fig = plt.figure(figsize=(10,7)) ax = fig.add_subplot(111, projection='3d') ax.scatter(X_tsne3d[:,0], X_tsne3d[:,1], X_tsne3d[:,2], c=y_pred, cmap='viridis', depthshade=True) plt.title('3D t-SNE可视化') plt.show()

8. 实际应用中的注意事项

经过这个完整流程后,总结几点实践经验:

  • 数据预处理至关重要:标准化对基于距离的算法如KMeans影响很大
  • t-SNE参数调整:perplexity参数影响可视化效果,通常建议在5-50间尝试
  • KMeans的局限性:假设簇是凸形且大小相似,对复杂形状数据效果不佳
  • 多次运行取最优:KMeans受初始质心影响,可设置n_init参数多次运行
# 更稳健的KMeans实现 kmeans = KMeans(n_clusters=3, n_init=20, random_state=42)

对于更复杂的数据集,可能需要考虑层次聚类、DBSCAN等更高级的算法。但KMeans+t-SNE的组合仍然是探索性数据分析的强大工具。

http://www.zskr.cn/news/1398267.html

相关文章:

  • 跨模态Transformer模型:成像测井图像与常规测井曲线的特征融合及岩性分类
  • 保姆级教程:用yum downloadonly搞定Docker离线包,一份包适配麒麟V10/CentOS 8
  • PlayIntegrityFix终极指南:简单三步解决Android设备认证难题
  • EEG微状态序列分析新范式:用NLP词嵌入技术解码大脑动态语法
  • 从地理空间数据云到可游玩地图:一份给独立开发者的真实世界地形创建全流程指南
  • 观察使用Taotoken后API调用的成功率和响应时间变化
  • NVIDIA Profile Inspector技术深度解析:驱动程序配置管理架构与实践指南
  • 情感分析实战:用Python和jieba给你的微博评论自动‘打标签’(附完整代码与词典)
  • 揭秘进程管理:从PID到PCB全解析
  • AzurLaneAutoScript:5步实现碧蓝航线全自动化的终极解决方案
  • TransCAD 6.0 闪退别慌!手把手教你打补丁并搞定波士顿交通网络的最短路径分析
  • [吐槽] outlook 新版本
  • 别再只拿Amazon Review Dataset做推荐了!用Python玩转商品评论的情感分析与销量预测
  • 告别Transformer?手把手带你用Mamba搭建首个图像分类模型(附PyTorch代码)
  • Anthropic开源11个企业级插件,我全试了一遍——这是值得装的4个
  • AI Agent 认知模型与推理模式综述
  • 别再只会点按钮了!SPSS聚类分析实战:用31省产业数据手把手教你选对方法(附数据集)
  • 在银河麒麟V10上装VirtualBox增强工具,卡在SELinux policy.29错误?试试这个临时关闭SELinux的完整流程
  • Windows系统itss.dll文件丢失找不到问题解决
  • 多Agent虚拟开发:构造功能设想与开发方案(一)
  • A51汇编器行号偏移问题解析与调试优化
  • AI Agent Harness Engineering 的并发控制:多任务同时执行的挑战
  • 大语言模型SFT与ESSA超参数优化实践
  • 质数的庖丁解牛
  • 用STM32F103C8T6做个桌面小钢炮:0-30V/1.5A数控电源DIY全记录(附源码与PCB)
  • 人工智能通识课:多模态大模型
  • Win10/Win11系统版本兼容性实测:eNSP搭配VirtualBox 5.2.26如何避开AR 40错误?
  • 从 LangChain 到 LangGraph:AI Agent 时代的核心框架演进
  • 2026年中大力德一级授权代理商TOP5权威排行:广州LED驱动电源/广州减速电机/广州工业类开关电源/广州机壳电源/选择指南 - 优质品牌商家
  • Android开发板与Windows网络不通?原来是策略路由在作祟