
ML-For-Beginners 聚类实战作业指南探索 K-Means 之外的分组方法【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners本篇技术指南以 ML-For-Beginners 课程「5-Clustering / 2-K-Means」的课后作业含 英文原版 与 希腊语翻译版为骨架完整拆解作业要求、评分标准并结合仓库内 K-Means 课程正文、尼日利亚音乐数据集与 R 语言参考答案深入讲解 K-Means 的局限性、替代聚类方法的选型逻辑以及如何用 Scikit-learn 实际构建一个不使用 K-Means 的聚类 notebook。读完本文你将能够独立完成该作业并掌握「数据不适合 K-Means 时该如何换方法」的完整决策路径与评估手段。作业速览任务要求与评估标准作业标题为「Try different clustering methods」尝试不同的聚类方法核心任务分三步回顾背景本课已学习 K-Means 聚类但有时 K-Means 并不适合你的数据动手实践使用本课程的数据如 nigerian-songs.csv或其他来源的数据必须注明来源创建一个 notebook展示一种不使用 K-Means的聚类方法总结反思写下你从中学会了什么What did you learn。作业的评分标准Rubric只有一列维度分为三档标准优秀Exemplary合格Adequate需改进Needs Improvement评分提交的 notebook 包含文档完善的聚类模型well-documented clustering model提交的 notebook 缺乏良好文档说明和/或不完整提交了不完整的作业从评分表可以看出这份作业的权重不在模型精度而在过程的完整性与可读性数据来源标注、方法选择的理由、代码注释、结果解释缺一不可。这也是后续所有章节组织文章内容的依据。为什么需要 K-Means 之外的聚类方法课程背景回顾要完成「换一种方法」的任务首先必须理解 K-Means 在什么情况下会失效。课程正文 5-Clustering/2-K-Means/README.md 给出了完整推导链。K-Means 的三步迭代算法K-Means 源于信号处理领域其流程在 Scikit-learn 文档中被描述为三步循环算法从数据集中采样选取 k 个中心点centroid然后进入循环每次循环中先把每个样本分配给最近的质心再取分配给各质心所有样本的均值作为新质心计算新旧质心之间的差异并重复直到质心稳定收敛。由此产生的一个直接缺陷是你必须事先指定 k质心数量。课程中用「肘部法则」elbow method来估计合理的 k 初值。本数据集上 K-Means 的实际表现课程 notebook.ipynb 使用的尼日利亚音乐数据来自 Spotify在预处理后被过滤为三个流派afro dancehall、afropop、nigerian pop。核心实验结论如下使用LabelEncoder将artist_top_genre编码为数值选择popularity、danceability、acousticness、loudness、energy等列构成特征矩阵X设定nclusters 3、random_state 0拟合 K-Means 后用metrics.silhouette_score(X, y_cluster_kmeans)计算轮廓系数轮廓系数得分约为 0.53处于中间水平说明「数据并不特别适合这种聚类方式」最终用sum(y labels)对比预测标签与真实流派标签准确率并不理想散点图显示簇之间严重交叠。课程的结论一语中的这份数据过于不平衡imbalanced、列之间相关性太低、列值方差过大too much variance导致聚类效果差且形成的簇很可能是被我们预先定义的三个流派类别强烈影响甚至扭曲的。这正是作业的出发点当 K-Means 给出的轮廓系数不上不下、簇形状交叠时问题可能不在调参而在算法与数据形态不匹配。替代方法全景Scikit-learn 支持的聚类方法选型表上一课 5-Clustering/1-Visualize/README.md 的正文中给出了 Scikit-learn 支持的聚类方法及其适用场景对照表这是挑选替代方案的第一手依据方法名适用场景K-Means通用、归纳式inductiveAffinity propagation簇数量多、不均匀归纳式Mean-shift簇数量多、不均匀归纳式Spectral clustering簇数量少、均匀直推式transductiveWard hierarchical clustering簇数量多、受约束的簇直推式Agglomerative clustering簇数量多、受约束、非欧氏距离直推式DBSCAN非平面几何、不均匀簇直推式OPTICS非平面几何、密度可变的不均匀簇直推式Gaussian mixtures平面几何归纳式BIRCH带离群点的大数据集归纳式作业要求「展示一种不使用 K-Means的聚类方法」上表中的 Agglomerative clustering、DBSCAN、Gaussian mixtures 都是现成且易于在 notebook 中演示的候选。选择时可参考课程中给出的两条关键概念线索直推式transductivevs 归纳式inductive直推式推理由观测到的训练样本直接映射到特定测试样本归纳式则先从训练样本归纳出一般规则再应用于测试样本。K-Means 属于归纳式它学习出簇中心作为通用规则而 DBSCAN、谱聚类等直推式方法直接基于样本间的相似结构分组。平面flatvs 非平面non-flat几何平面指欧氏几何用线段长度度量距离非平面指非欧氏几何沿曲线度量距离。若数据可视化后并不分布在一个平面上就需要专门的算法如 DBSCAN来处理。实操核心构建一个非 K-Means 聚类 notebook以下代码以课程 notebook.ipynb 的数据准备步骤为起点逐步演示三种替代方案。数据加载与清洗部分与课程一致数据文件位于 5-Clustering/data/nigerian-songs.csv相对 notebook 的导入路径为../data/nigerian-songs.csvimport matplotlib.pyplot as plt import pandas as pd import seaborn as sns df pd.read_csv(../data/nigerian-songs.csv) # 与课程一致仅保留三个主要流派过滤 popularity 为 0 的行 df df[(df[artist_top_genre] afro dancehall) | (df[artist_top_genre] afropop) | (df[artist_top_genre] nigerian pop)] df df[(df[popularity] 0)] # 特征编码将流派标签转为数值 from sklearn.preprocessing import LabelEncoder le LabelEncoder() X df.loc[:, (artist_top_genre, popularity, danceability, acousticness, loudness, energy)] y df[artist_top_genre] X[artist_top_genre] le.fit_transform(X[artist_top_genre]) y le.transform(y)方案一层次凝聚聚类Agglomerative Clustering层次聚类hierarchical clustering按照「对象与邻近对象的接近程度」来归类而非与更远对象的关系。Scikit-learn 的AgglomerativeClustering即属于此类其关键优势是不需要预先指定初始质心只需给出目标簇数且天然支持非欧氏距离from sklearn.cluster import AgglomerativeClustering from sklearn import metrics # n_clusters 对应课程中已知的三个流派linkage 控制簇间距离的计算方式 agg AgglomerativeClustering(n_clusters3, linkageward) y_cluster_agg agg.fit_predict(X) score_agg metrics.silhouette_score(X, y_cluster_agg) print(Agglomerative silhouette score: {0:0.2f}.format(score_agg))linkage参数决定簇合并策略ward最小化合并后的方差增量complete取两簇最远点距离average取平均距离。值得在 notebook 中对比不同 linkage 的轮廓系数作为「文档完善」的加分项。方案二基于密度的 DBSCAN课程在上一课中指出噪声数据往往「稠密」各簇内点的密度可能明显不同这类数据适合用密度聚类分析。DBSCAN 的核心思想是按点的密度分组远离群体的点视为离群点或噪声因此它完全不需要指定簇数 k这是与 K-Means 最本质的区别也是作业中最好的「对照论点」from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler # DBSCAN 基于距离必须先标准化否则量纲差异会主导密度判定 X_scaled StandardScaler().fit_transform(X) # eps 控制邻域半径min_samples 控制成为核心点的最少邻居数 db DBSCAN(eps2.5, min_samples10) y_cluster_db db.fit_predict(X_scaled) # 标签 -1 表示噪声点 print(Number of noise points:, (y_cluster_db -1).sum()) print(Unique clusters:, set(y_cluster_db))注意两个与 K-Means 完全不同的调参对象eps邻域半径与min_samples核心点最少邻居数。若数据本身存在密度不均DBSCAN 会自然地将其识别为不同密度层次的簇。eps过大则几乎所有点都会并入一个簇过小则噪声点激增——这两个参数的敏感性分析应当写入 notebook 的文档说明中。方案三高斯混合模型Gaussian Mixture课程将分布聚类distribution-based clustering描述为「基于统计建模判断数据点属于某个簇的概率再据此分配」高斯混合方法正属此类且属于归纳式方法适合对数据分布有概率建模需求时选用from sklearn.mixture import GaussianMixture # n_components 即簇数covariance_type 控制协方差结构 gmm GaussianMixture(n_components3, covariance_typefull, random_state0) gmm.fit(X) y_cluster_gmm gmm.predict(X) score_gmm metrics.silhouette_score(X, y_cluster_gmm) print(GMM silhouette score: {0:0.2f}.format(score_gmm))covariance_type可选full每个簇独立完整协方差、tied所有簇共享同一协方差、diag各向异性但对角、spherical球形簇。与 K-Means 的硬分配不同GMM 给出的是软分配——每个样本属于各簇的概率这也是 notebook 中值得展开讲解的点。评估与反思作业的灵魂「What did you learn」作业要求回答「你学到了什么」这是评分表里「文档完善」的直接体现。可以从以下三个层面组织回答全部有课程内容支撑1. 从轮廓系数读方法匹配度课程强调轮廓系数取值范围为 -1 到 1越接近 1 表示簇越稠密且与其他簇分离良好接近 0 表示簇重叠、样本紧贴相邻簇的决策边界。K-Means 在本数据集上约 0.53 的得分说明数据形态与算法不匹配。在作业 notebook 中应把三种替代方法的轮廓系数与 0.53 并列对比并解释为何某些方法得分更高或更低——这一步最能体现「文档完善」。2. 方差问题的启示课程明确指出本数据存在「方差问题」方差定义为「与均值之差的平方的平均值」在本例中指数据点偏离均值过大。数据过于不平衡、相关性太低、列间方差过大导致簇难以形成良好边界。课程给出的修正思路包括进一步清洗数据如剔除离群点、换用不同特征列、或换用不同算法。作业 notebook 中若记录了「尝试缩放数据后轮廓系数下降但肘部拐点变平滑」的现象课程挑战环节的提示会是非常扎实的反思材料。3. 参数自由度对比三种替代方法在参数上给了不同的自由度层次聚类需要指定n_clusters与linkageDBSCAN 完全免去簇数但引入eps与min_samplesGMM 需要n_components与covariance_type。对比「哪些参数是用户强加的、哪些是数据自动决定的」正是对 K-Means「必须预设 k」这一缺陷的最好回应。参考答案与扩展R 生态中的对应实现仓库中 5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb 提供了 R 语言tidymodels 生态的完整 K-Means 参考答案对作业有两点启发它使用了pacman::p_load(tidyverse, tidymodels, cluster, factoextra, patchwork)等包并用silhouette()来自cluster包计算平均轮廓宽度R 版本的轮廓得分约0.549与 Python 的 0.53 结论一致——跨语言验证了「数据不适合 K-Means」的判断它用factoextra::fviz_cluster()可视化聚类结果并强调「簇重叠说明数据不适合此类聚类」——作业如果选择 R 实现可仿照此 notebook 的结构把hclust()层次聚类或dbscan包作为替代方法展示。作业完成清单对照评分表自查在提交前逐项核对评分表的「优秀」档要求数据来源若使用课程外数据是否在 notebook 开头明确注明来源使用课程内数据是否说明了来自 5-Clustering/data/nigerian-songs.csv方法选择理由是否解释了「为什么不用 K-Means」可引用轮廓系数 0.53 与方差问题替代方法演示是否用代码完整实现了至少一种非 K-Means 方法层次凝聚、DBSCAN、GMM 三选一或全做并配有参数注释结果评估是否用轮廓系数或其他指标评估了替代方法并与 K-Means 对照反思总结是否回答了「What did you learn」至少覆盖方法差异、参数自由度、数据形态三个角度中的两个完成以上五项即达到「提交了文档完善的聚类模型」的评分标准。若只给出代码没有解释、或直接提交残缺 notebook则落入「合格」乃至「需改进」档——这正是本作业与普通编程作业最大的不同它考的是你对「方法选择」本身的理解深度。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考