ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

《Python Machine Learning》(第 2 版)第 11 章实战:基于 scikit-learn 的无标签数据聚类分析(K-means、层次聚类与 DBSCAN)完整代码指南

《Python Machine Learning》(第 2 版)第 11 章实战:基于 scikit-learn 的无标签数据聚类分析(K-means、层次聚类与 DBSCAN)完整代码指南 示例工程机器学习深度学习【免费下载链接】python-machine-learning-book-2nd-editionThe Python Machine Learning (2nd edition) book code repository and info resource项目地址https://gitcode.com/gh_mirrors/py/python-machine-learning-book-2nd-edition点击查看免费下载本文以开源仓库 python-machine-learning-book-2nd-edition 中第 11 章的配套文档 code/ch11/README.md 为主体骨架结合同目录下的 ch11.ipynb 与 ch11.py 源码系统讲解三类最经典的聚类算法基于相似性分组的 K-means、把簇组织成层次树的凝聚层次聚类以及基于密度定位高密度区域的 DBSCAN。读完本文你将掌握这些算法在 scikit-learn / SciPy 中的完整调用链、每个核心参数的取值与含义、聚类数量与质量的评估方法肘部法则、轮廓系数并能直接复现书中全部图表。章节全景无标签数据下的三大聚类范式本章Working with Unlabeled Data – Clustering Analysis围绕一个核心问题展开当数据没有类别标签时如何根据样本间的相似度自动发现分组结构。配套文档给出的章节大纲Chapter Outline完整覆盖了三条技术路线按相似度对对象分组k-means使用 scikit-learn 进行 K-means 聚类使用 k-means 更聪明地放置初始聚类中心硬聚类与软聚类hard versus soft clustering使用肘部法则elbow method寻找最优簇数通过轮廓图silhouette plots量化聚类质量把簇组织成层次树hierarchical tree自底向上bottom-up合并簇在距离矩阵上执行层次聚类把树状图dendrogram附加到热力图heat map通过 scikit-learn 应用凝聚聚类agglomerative clustering通过 DBSCAN 定位高密度区域最后以 Summary 收尾。可以说这一章就是一份从最简单的划分聚类到任意形状簇的渐进式路线图。代码示例的运行环境Jupyter Notebook 与 .py 脚本推荐的交互方式Jupyter Notebook文档明确指出与本书代码示例交互的推荐方式是 Jupyter Notebook即各章节的.ipynb文件。使用 Jupyter Notebook你可以逐步执行代码并让所有输出包括绘图和图像集中在一个便利的文档中。仓库在 code/ch02/images/ 目录下放置了 Jupyter 界面截图如jupyter-example-1.png、jupyter-example-2.png用于直观展示 notebook 的运行形态。如果你使用的是 Anaconda Python 发行版安装 Jupyter Notebook 只需在终端执行conda install jupyter notebook然后通过以下命令启动jupyter notebook执行后浏览器会打开一个窗口你可以用它导航到目标目录打开想查看的.ipynb文件如 code/ch11/ch11.ipynb。文档还给出了两条重要补充更多的安装与配置说明请参见 code/ch01/README.md原文链接../ch01/README.md对应的仓库根目录相对路径。即使不安装 Jupyter Notebook也可以直接在 GitHub 上点击浏览 ch11.ipynb 查看 notebook 内容。便于导航与交互的细节除了代码示例之外作者还为每个 Jupyter notebook 添加了目录table of contents以及与书中内容一致的章节标题section headers。同时notebook 中直接嵌入了原始图片和插图期望让读者在阅读书籍时更轻松地导航和交互式地操作代码。从 ch11.ipynb 可以看到其 Overview 段落内置了指向K-means clustering using scikit-learn、k-means、elbow method、silhouette plots、AgglomerativeClustering、DBSCAN等章节的锚点链接。不想用 Notebook还有 .py 脚本如果你不希望使用 Jupyter Notebook作者也已将这些 notebook 转换成可在任何纯文本编辑器中查看和编辑的普通 Python 脚本文件.py文件即本仓库中的 ch11.py。该文件由jupyter nbconvert之类的脚本生成notebook 末尾使用python ../.convert_notebook_to_script.py --input ch11.ipynb --output ch11.py完成转换与 notebook 内容一一对应。仓库级验证测试用例仓库还提供了一套自动执行 notebook 的单元测试 code/tests/test_notebooks.py。其中test_ch11测试用例会通过jupyter nbconvert --execute --inplace完整执行../ch11/ch11.ipynb见 code/tests/test_notebooks.py这意味着本章所有代码都是可运行、可复现的——你可以把它当作代码可以原样跑通的仓库级证据。基于相似性分组的 K-means生成示例数据make_blobs本章先用sklearn.datasets.make_blobs生成一组带已知真实结构的二维模拟数据150 个样本、3 个中心、标准差 0.5、打乱顺序、固定随机种子from sklearn.datasets import make_blobs import matplotlib.pyplot as plt X, y make_blobs(n_samples150, n_features2, centers3, cluster_std0.5, shuffleTrue, random_state0)见 ch11.py。注意这里y只是上帝视角的真值聚类分析过程中并不会使用它——这正是无标签数据的含义。使用 scikit-learn 进行 K-means 聚类核心代码在 ch11.pyfrom sklearn.cluster import KMeans km KMeans(n_clusters3, initrandom, n_init10, max_iter300, tol1e-04, random_state0) y_km km.fit_predict(X)这里涉及的 KMeans 参数及其影响n_clusters3期望的簇数量即最终的类中心个数。initrandom初始质心采用完全随机放置。这一版代码刻意选择了random以引出下一节 k-means 的改进动机。n_init10以不同随机初始质心独立运行 10 次取误差最小的结果以缓解对初始质心敏感的问题。max_iter300单次运行的迭代次数上限。tol1e-04相对容差当连续迭代中心移动量小于该阈值时提前收敛。random_state0固定随机种子保证结果可复现。拟合后可以绘制聚类结果用不同颜色和标记方形、圆形、倒三角区分三个簇并用红色星形*在km.cluster_centers_位置标出三个质心见 ch11.py。更聪明的初始质心k-means章节大纲中的 A smarter way of placing the initial cluster centroids using k-means 指出随机放置初始质心可能导致较慢的收敛甚至次优解。k-means 的思想是让初始质心彼此尽可能分散先随机选第一个质心再按距已有质心距离的平方成正比的概率依次选取其余质心。在 scikit-learn 中只需把init参数改为k-means事实上这也是KMeans的默认值。本章后续所有实验肘部法则、轮廓系数都改用了initk-means。在 ch11.ipynb 中该小节仅保留了 ... 占位说明具体原理请参见原书正文。硬聚类与软聚类同样地Hard versus soft clustering 小节在 notebook 中为 ... 占位。概念上硬聚类hard clustering要求每个样本严格归属到唯一一个簇K-means 就是典型代表软聚类soft clustering / fuzzy clustering则给每个样本输出一组属于各簇的概率例如模糊 C-meansFCM。K-means 输出的labels_是硬标签而软聚类更适合存在交叉或不确定边界的场景。用肘部法则寻找最优簇数K-means 需要预先给定簇数 k而k 取多少合适正是聚类最常见的开放问题。肘部法则通过观察簇内畸变distortion随 k 的变化曲线来决策。畸变即样本到其所属质心的距离平方和平方误差在 scikit-learn 中可以直接从KMeans对象的inertia_属性读出。先用 k3 训练后打印出的值为Distortion: 72.48见 ch11.py 附近。随后在 1~10 之间循环训练并记录畸变distortions [] for i in range(1, 11): km KMeans(n_clustersi, initk-means, n_init10, max_iter300, random_state0) km.fit(X) distortions.append(km.inertia_) plt.plot(range(1, 11), distortions, markero) plt.xlabel(Number of clusters) plt.ylabel(Distortion) plt.show()见 ch11.py。畸变曲线会随 k 增大而单调下降其下降速度由陡变缓的肘部拐点对应的 k就是肘部法则建议的簇数——本数据集在 k3 附近出现明显拐点。用轮廓图量化聚类质量仅凭肘部法则还不够严谨本章进一步用轮廓分析silhouette analysis验证聚类质量。核心函数是sklearn.metrics.silhouette_samples它基于欧氏距离metriceuclidean为每个样本计算轮廓系数该值越接近 1 表示样本与同簇样本越紧密、与最近邻簇越疏离接近 0 表示位于边界接近 -1 表示可能被错误分簇。代码见 ch11.pyfrom sklearn.metrics import silhouette_samples km KMeans(n_clusters3, initk-means, n_init10, max_iter300, tol1e-04, random_state0) y_km km.fit_predict(X) cluster_labels np.unique(y_km) n_clusters cluster_labels.shape[0] silhouette_vals silhouette_samples(X, y_km, metriceuclidean)随后把每个簇内样本的轮廓系数按升序排列用水平条形图分段绘制并用红色虚线标出所有样本轮廓系数的平均值silhouette_avg np.mean(silhouette_vals)见 ch11.py。若各簇的条形都明显越过平均线说明分簇质量良好。与坏聚类对比同一小节后半部分刻意把n_clusters2强行套在天然是 3 簇的数据上见 ch11.py再画一次轮廓图。两图对照可以直观看到簇数选择错误时轮廓条形的形态退化——这正是本书教学设计的巧妙之处用可视化而不是数字教会你如何看出聚类质量的差异。把簇组织成层次树层次聚类自底向上合并簇与 K-means 这类划分式聚类不同凝聚层次聚类agglomerative hierarchical clustering从每个样本自成一簇出发反复合并距离最近的两个簇直至满足停止条件最终形成一棵层次树。本节先用 5 个随机样本构造一个小数据框作为演示import pandas as pd import numpy as np np.random.seed(123) variables [X, Y, Z] labels [ID_0, ID_1, ID_2, ID_3, ID_4] X np.random.random_sample([5, 3]) * 10 df pd.DataFrame(X, columnsvariables, indexlabels)见 ch11.py。5 行 3 列、带 ID 索引的 DataFrame 足够小便于读者手工核对每一步合并的距离。在距离矩阵上执行层次聚类三种输入的坑先计算成对距离矩阵from scipy.spatial.distance import pdist, squareform row_dist pd.DataFrame(squareform(pdist(df, metriceuclidean)), columnslabels, indexlabels)见 ch11.py。pdist返回的是压缩距离矩阵condensed distance matrix即只保留上三角的向量squareform负责把它还原成对称方阵。随后用scipy.cluster.hierarchy.linkage执行合并methodcomplete表示簇间距离 两簇成员之间最远距离完全连接法。代码注释特意演示了三种输入方式的区别见 ch11.py错误方式直接传入 squareform 方阵row_clusters linkage(row_dist, methodcomplete, metriceuclidean)把对称方阵当作原始观测矩阵传入会得到明显偏大的距离值合并距离变成 6.52、6.73、8.54、12.44 等并触发 scipy 的ClusterWarning警告。正确方式一传入 pdist 的压缩距离矩阵row_clusters linkage(pdist(df, metriceuclidean), methodcomplete)合并距离变为 3.835、4.347、5.900、8.317符合真实欧氏距离。正确方式二直接传原始样本矩阵 指定 metricrow_clusters linkage(df.values, methodcomplete, metriceuclidean)得到与方式二完全相同的结果。要点linkage接受压缩距离矩阵或原始数据 metric但绝不要传squareform的方阵——那会产生不同的距离值虽然总体聚类树可能恰好相似但数值上是错的。这是实战中极易踩的坑。绘制树状图 dendrogramfrom scipy.cluster.hierarchy import dendrogram row_dendr dendrogram(row_clusters, labelslabels, # [ID_0, ID_1, ID_2, ID_3, ID_4] ) plt.tight_layout() plt.ylabel(Euclidean distance) plt.show()见 ch11.py。树状图中纵轴是合并时的欧氏距离横轴是按聚类顺序重排的样本 ID合并高度越低表示越早、越相似地被聚在一起。注释中还保留了set_link_color_palette([black])与color_thresholdnp.inf的可选代码用于把分支全部染成黑色以便印刷。把树状图附加到热力图为了同时看到样本间的距离矩阵和聚类结构本章把树状图与热力图拼在同一张图上见 ch11.py。关键步骤用fig.add_axes([0.09, 0.1, 0.2, 0.6])为树状图划分左侧区域绘制时用dendrogram(row_clusters, orientationleft)让树向左伸展matplotlib 1.5.1 请用orientationright。用row_dendr[leaves]拿到叶子样本在树中的顺序据此对 DataFrame 重排df_rowclust df.iloc[row_dendr[leaves][::-1]][::-1]是为了匹配左侧树状图自底向上的方向。在右侧[0.23, 0.1, 0.6, 0.6]区域用axm.matshow(df_rowclust, interpolationnearest, cmaphot_r)绘制热力图并加颜色条。这样热力图中的行列顺序就与树状图的分支结构完全对齐读者可以一眼看出哪些样本互为近邻。通过 scikit-learn 应用凝聚聚类不想手工操作linkage/dendrogram时可以直接用sklearn.cluster.AgglomerativeClustering见 ch11.pyfrom sklearn.cluster import AgglomerativeClustering ac AgglomerativeClustering(n_clusters3, affinityeuclidean, linkagecomplete) labels ac.fit_predict(X) print(Cluster labels: %s % labels) # Cluster labels: [1 0 0 2 1]n_clusters3 / 2直接把层次树拦腰截断成指定数量的簇。affinityeuclidean样本间距离度量。linkagecomplete簇间合并准则这里与前面的 SciPy 示例保持一致。把n_clusters改为 2 再次拟合得到Cluster labels: [0 1 1 0 0]——可以看到只需改一个参数同一棵层次树就可以切成不同粒度的簇划分这正是层次聚类相对于 K-means 的优势之一不需要重新训练即可获得不同层级的聚类视图。基于高密度区域定位簇DBSCANK-means 和层次聚类都倾向于找到球形/凸形的簇遇到非凸形状例如两个交错的半月形就会失效。本章用make_moons生成 200 个呈月牙形分布、带 0.05 噪声的样本见 ch11.pyfrom sklearn.datasets import make_moons X, y make_moons(n_samples200, noise0.05, random_state0) plt.scatter(X[:, 0], X[:, 1]) plt.show()为什么 K-means 与层次聚类会失败代码先在同一张 1×2 的子图里分别用 K-means 与AgglomerativeClustering(n_clusters2, affinityeuclidean, linkagecomplete)拟合这些月牙数据见 ch11.py。两者的共同问题是它们按全局几何划分会把两个交错缠绕的半月形从中间一刀切开导致每个簇都混入了另一簇的样本——这正是非凸簇场景下距离型聚类的典型失败模式。密度聚类DBSCANDBSCANDensity-Based Spatial Clustering of Applications with Noise不依赖簇的几何形状而依赖样本局部密度以每个样本为中心、半径eps内的邻居数达到min_samples即成为核心点由核心点密度相连的区域构成一个簇孤立的不达标样本则被标记为噪声。本节的调用是from sklearn.cluster import DBSCAN db DBSCAN(eps0.2, min_samples5, metriceuclidean) y_db db.fit_predict(X)见 ch11.py。参数含义eps0.2邻域半径。半径太小会导致簇被切碎、噪声变多太大则会把本应分开的簇粘连在一起是需要结合数据尺度调参的关键量。min_samples5判定核心点所需的最少邻居数。metriceuclidean样本间距离度量。随后按y_db用不同标记绘制两个簇浅蓝圆形与红色方块见 ch11.py。DBSCAN 成功把两个交错的月牙完整地分离开来——这正是本章要传达的核心结论当数据存在任意形状或密度不均的簇时基于密度的 DBSCAN 往往优于基于距离的 K-means 与层次聚类。小结与延伸围绕 code/ch11/README.md 的章节大纲本章代码给出了一个完整的无标签数据分析工具箱K-meansch11.py适合凸形簇用initk-means改善初始质心用n_init多次运行取最优簇数不确定时结合肘部法则inertia_畸变曲线与轮廓图silhouette_samples来定夺。层次聚类ch11.pypdist/squareform/linkage/dendrogram构成 SciPy 侧的完整链路注意不要误传方阵AgglomerativeClustering提供 sklearn 侧的一键封装树状图还能与热力图拼合直观呈现样本亲疏。DBSCANch11.py以eps与min_samples驱动密度连通擅长任意形状簇且能天然识别噪声点。无论你选择 ch11.ipynb 逐格执行还是直接阅读 ch11.py仓库自带的测试 code/tests/test_notebooks.py 都保证了这些示例的可复现性。下一步的延伸方向包括为真实数据调优eps/min_samples、用silhouette_score对多种算法做量化对比以及在更大规模数据上比较三种算法的计算开销——这些都可以在上述代码骨架上继续展开。赞分享示例工程机器学习深度学习【免费下载链接】python-machine-learning-book-2nd-editionThe Python Machine Learning (2nd edition) book code repository and info resource项目地址https://gitcode.com/gh_mirrors/py/python-machine-learning-book-2nd-edition点击查看免费下载相关推荐Python Machine Learning 第 11 章使用 k-means、层次聚类与 DBSCAN 处理无标签数据聚类分析实战Python Machine Learning 第 11 章使用 k means、层次聚类与 DBSCAN 处理无标签数据聚类分析实战 导读 聚类Clu机器学习教程革命性微前端框架Piral10分钟快速搭建你的第一个应用外壳革命性微前端框架Piral10分钟快速搭建你的第一个应用外壳 你是否正在寻找一种简单高效的方式来构建现代化Web应用 Piral 正是你需要的革命性微终极指南swirl_courses聚类分析实战——从K-means到层次聚类的完整教程终极指南swirl_courses聚类分析实战——从K means到层次聚类的完整教程 swirl_courses是一个为swirl R包设计的交互式课程集合教程教育上一篇Node-RED Dashboard 2.0深度解析构建企业级可视化控制面板的5大核心架构下一篇AWS Lambda Base Images安全最佳实践漏洞修复与合规检查实用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表