ML-For-Beginners 聚类模块实战:用尼日利亚音乐数据集走完“数据可视化 → K-Means 聚类”全流程 📅 发布时间:2026/9/8 16:31:32 👁 浏览次数: 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 周完整覆盖模块导读文档定义的核心脉络聚类的定义与适用场景、模块主题数据集Spotify 爬取的尼日利亚热门歌曲的结构与特征、Scikit-learn 聚类方法选型表与关键术语以及模块下两节课的实操代码——从 Pandas/Seaborn 数据探索到 K-Means 建模、肘部法则Elbow Method与轮廓系数Silhouette Score评估。读完并跟练后你将能够独立完成一次无监督聚类分析判断数据适合哪种聚类算法、用 K-Means 确定簇数、并对聚类质量做量化评估。聚类是什么无监督学习中的“自动分组”模块文档 translations/bg/5-Clustering/README.md 开宗明义聚类Clustering是机器学习中的一个任务目标是找到彼此相似的对象并将它们分组到称为“簇cluster”的组中。聚类与其他机器学习方法的区别在于分组过程是自动发生的——事实上可以认为它是监督学习的反面。这句话点出了聚类的本质属性无监督Unsupervised数据集不需要标签。文档特别强调当数据集缺少标签时聚类是最合适的工具如果数据有标签前面课程学过的分类classification技术可能更有用。自动分组算法自行从数据中“辨识模式”并产生分组不需要人预先规定“哪个样本属于哪一类”。模块导读还给出了一条实用提示存在低代码工具可以帮助理解聚类模型的搭建流程文档中推荐尝试 Azure Machine Learning 的聚类模型设计器适合想先建立直观感受再深入代码的读者。模块主题尼日利亚音乐听众的口味聚类 模块选择了一个有真实业务含义的场景尼日利亚听众的口味多样化课程使用从 Spotify 爬取的数据灵感来自一篇按国家做音乐口味可视分析的文章研究尼日利亚的热门歌曲。数据集文件为 nigerian-songs.csv共530 首歌曲、16 列。文档明确点出的核心音频特征包括特征含义danceability可舞动性歌曲适合跳舞程度的评分acousticness原声性歌曲原声非电声程度loudness响度歌曲响度speechiness人声占比歌曲中人声所占比重popularity流行度流行度评分可能出现0未获排名的歌曲energy能量歌曲能量完整 16 列为name、album、artist、artist_top_genre、release_date、length、popularity、danceability、acousticness、energy、instrumentalness、liveness、loudness、speechiness、tempo、time_signature。数据前几行示例name,album,artist,artist_top_genre,release_date,length,popularity,danceability,acousticness,energy,instrumentalness,liveness,loudness,speechiness,tempo,time_signature Sparky,Mandy The Jungle,Cruel Santino,alternative rb,2019,144000,48,0.666,0.851,0.42,0.534,0.11,-6.699,0.0829,133.015,5 shuga rush,EVERYTHING YOU HEARD IS TRUE,Odunsi (The Engine),afropop,2020,89488,30,0.71,0.0822,0.683,0.000169,0.101,-5.64,0.36,129.993,3模块导读文档中声明的图片来源与归属照片来自 Unsplash 摄影师 Marcela LaskoskiK-Means 过程动画采用 Allison Horst 的插画素材数据集为 “Nigerian Songs”Kaggle 上的尼日利亚歌曲 Spotify 数据集。模块的两节课结构模块文档的 “Уроци课程” 一节列出了本模块的两课这也是整个模块的内容骨架聚类入门Introduction to clustering1-Visualize —— 聚类方法选型、术语辨析与数据可视化探索配套练习 notebook.ipynb 与 参考解答 notebook。K-Means 聚类K-Means clustering2-K-Means —— 用 Scikit-learn 完成建模、选 k 与评估配套练习 notebook.ipynb、参考解答以及 RTidymodels与 Julia 语言版实现见 lesson_15.Rmd 与 Julia 方案说明。下面按“先选算法、再看数据、后建模评估”的顺序展开两节课的核心内容。聚类方法选型Scikit-learn 方法对照表与关键术语第一节课给出的第一份资产是一张简化版的 Scikit-learn 聚类方法对照表说明“选哪种方法取决于你的用例”方法名适用场景K-Means通用、归纳式inductiveAffinity propagation多簇、簇大小不均、归纳式Mean-shift多簇、簇大小不均、归纳式Spectral clustering少而均匀的簇、演绎式transductiveWard hierarchical clustering多簇、受限约束constrained的簇、演绎式Agglomerative clustering多簇、受限约束、非欧氏距离、演绎式DBSCAN非平坦几何、簇大小不均、演绎式OPTICS非平坦几何、密度可变的簇、演绎式Gaussian mixtures平坦几何、归纳式BIRCH含离群点的大数据集、归纳式要读懂这张表需要掌握课中给出的四组术语辨析Transductive演绎式vs. Inductive归纳式演绎式推理是从观测到的训练案例直接映射到特定测试案例归纳式推理是从训练案例中提炼出通用规则再应用到测试案例。课中举例若数据只有部分标签有的是“黑胶唱片”、有的是“CD”、有的空白归纳式做法是训练一个模型识别“黑胶”和“CD”再套用遇到实际上是“卡带”的样本就会出错演绎式做法则是把相似项聚到一起再给整组打标例如形成“圆形的音乐物件”和“方形的音乐物件”这样的簇对未知类型更稳健。Flat平坦vs. Non-flat非平坦几何源自数学术语指测量点间距离采用欧氏平坦即平面上两点间的线段长度还是非欧氏沿曲线度量方式。如果数据可视化后“看起来不在一个平面上”可能需要专门算法处理。距离Distances簇由其距离矩阵定义。欧氏簇由点值的均值定义含有“质心centroid”中心点距离按到该质心的距离度量非欧氏距离对应 “clustroid”最靠近其他各点的点其定义方式多样。Constrained约束聚类把“半监督”引入无监督方法——在点与点之间标注 “cannot link不可连” 或 “must-link必须连” 关系用规则约束算法的分组避免其自由发挥产生低质量簇。Density密度噪声大的数据被视为“稠密”数据各簇内部点间距疏密不均crowded需要用与之匹配的聚类方法分析。聚类算法的五大类别课中对“超过 100 种聚类算法”做了归类梳理层次聚类Hierarchical clustering对象按与邻近对象而非远处对象的接近程度分类簇由成员之间及与其他对象的距离形成。Scikit-learn 的 agglomerative clustering 属于层次聚类。质心聚类Centroid clustering需要先选定簇数 k随后算法确定每个簇的中心点并把数据“收集”到该点周围。K-Means 是质心聚类的流行版本——中心由“最近的均值”确定故名 K-Means算法最小化数据点到簇的平方距离。基于分布的聚类Distribution-based clustering建立在统计模型之上核心是估计某个数据点属于某个簇的概率并据此归类。高斯混合Gaussian mixture方法属于此类。基于密度的聚类Density-based clustering按数据点密度彼此围绕聚拢的程度归类远离群体的点视为离群点或噪声。DBSCAN、Mean-shift、OPTICS 属于此类。基于网格的聚类Grid-based clustering针对多维数据集建立网格数据被划分到网格单元中从而形成簇。第一节课实操用 Pandas 与 Seaborn 探索音乐数据第一节课的核心主张是“聚类技术非常依赖良好的可视化先可视化再决定算法”。以下代码步骤完整继承自 1-Visualize/README.md可直接在配套 notebook 中复现。1. 加载数据。安装 Seaborn 并读取数据集!pip install seaborn import matplotlib.pyplot as plt import pandas as pd df pd.read_csv(../data/nigerian-songs.csv) # 在 1-Visualize 目录下运行时 df.head()2. 检查数据概况。df.info()显示这是一个 530 行 × 16 列的 DataFrame其中float648 列、int644 列、object4 列。再用df.isnull().sum()复核空值——每列均为 0数据完整。df.describe()给出的统计摘要包括release_date均值约 2015.4范围 1998–2020、popularity均值约 17.5最小值为 0、danceability均值约 0.742、loudness均值约 -4.95。3. 查看最受欢迎的流派。import seaborn as sns top df[artist_top_genre].value_counts() plt.figure(figsize(10,7)) sns.barplot(xtop[:5].index, ytop[:5].values) plt.xticks(rotation45) plt.title(Top genres, colorblue)当某流派显示为 “Missing” 时意味着 Spotify 未对其分类应过滤掉df df[df[artist_top_genre] ! Missing] top df[artist_top_genre].value_counts() plt.figure(figsize(10,7)) sns.barplot(xtop.index, ytop.values) plt.xticks(rotation45) plt.title(Top genres, colorblue)4. 聚焦三大流派并去除噪声。该数据集中前三大流派占据绝对多数课中将其锁定为afro dancehall、afropop、nigerian pop同时删除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)] top df[artist_top_genre].value_counts() plt.figure(figsize(10,7)) sns.barplot(xtop.index, ytop.values) plt.xticks(rotation45) plt.title(Top genres, colorblue)5. 相关性检查。corrmat df.corr(numeric_onlyTrue) f, ax plt.subplots(figsize(12, 9)) sns.heatmap(corrmat, vmax.8, squareTrue)课中结论唯一强相关的是energy与loudness响亮的音乐通常也确实高能量其余相关性都比较弱——这让“聚类算法能从中看出什么”更有悬念。课中同时提醒相关不等于因果。6. 分布可视化KDE 散点。sns.set_theme(styleticks) g sns.jointplot( datadf, xpopularity, ydanceability, hueartist_top_genre, kindkde, )KDE核密度估计用连续概率密度曲线表示数据便于比较多个分布。课中观察到三个流派在 popularity 与 danceability 轴上围绕某个“收敛点”形成同心圆状分布说明三大流派在流行度—可舞动性上只是松散对齐——在这种松散对齐的数据上判定簇正是接下来的挑战。再画一个散点图佐证同样的收敛模式sns.FacetGrid(df, hueartist_top_genre, height5) \ .map(plt.scatter, popularity, danceability) \ .add_legend()散点图是展示数据簇最常用的可视化手段也是本模块反复使用的工具。第二节课实操K-Means 建模、选 k 与评估第二节课 2-K-Means 在上一课已导入并清洗的数据上继续学习术语包括Silhouette scoring轮廓系数、Elbow method肘部法则、Inertia惯性、Variance方差。K-Means 原理。K-Means 源自信号处理领域把数据划分为 k 个簇每条观测把数据点归到离它最近的“均值”簇中心点周围。簇可以可视化为 Voronoi泰森多边形图每个“种子”点与其对应区域构成一片。其执行是一个三步迭代过程从数据集中抽样选出 k 个中心点然后进入循环把每个样本分配给最近的质心用所有分配到该质心的样本的均值重新计算每个簇的新质心计算新旧质心的差异重复直到质心稳定。K-Means 的已知缺点是必须先给定 k质心个数肘部法则可以帮忙估算一个好的起始值。准备特征矩阵。先用箱线图sns.boxplot对 popularity、acousticness、energy、instrumentalness、liveness、loudness、speechiness、tempo、time_signature、danceability、length、release_date 逐列绘图观察每列的离群点——课中判断“数据有点噪声但逐条剔除离群点会让数据所剩无几”。随后选取范围相近的列并把artist_top_genre编码为数值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)跑第一次 K-Means 并算轮廓系数。既然数据里筛出了 3 个流派先试 3 簇from sklearn.cluster import KMeans nclusters 3 seed 0 km KMeans(n_clustersnclusters, random_stateseed) km.fit(X) # Predict the cluster for each data point y_cluster_kmeans km.predict(X) y_cluster_kmeans输出是一个数组每行对应预测的簇编号0、1 或 2。然后计算轮廓系数from sklearn import metrics score metrics.silhouette_score(X, y_cluster_kmeans) score轮廓系数Silhouette Score取值从 -1 到 1越接近 1 越好得分为 1 表示簇内部密集且与其他簇分离良好接近 0 表示簇互相重叠、样本紧贴相邻簇的决策边界。本例得分约0.53处于中间水平——说明这份数据并不特别适合这类聚类但课程选择继续走下去。构建模型WCSS 与肘部法则。from sklearn.cluster import KMeans wcss [] for i in range(1, 11): kmeans KMeans(n_clustersi, initk-means, random_state42) kmeans.fit(X) wcss.append(kmeans.inertia_)课中解释的关键参数range(1, 11)聚类过程的迭代次数尝试 1 到 10 个簇random_state决定质心初始化时的随机数生成保证结果可复现WCSSwithin-cluster sums of squares簇内平方和度量一个簇内所有数据点到该簇质心的平均平方距离inertia_惯性K-Means 算法选择质心以最小化惯性——衡量簇内部聚合程度的指标每次迭代把它的值追加进wcssk-meansScikit-learn 提供的质心初始化优化使初始质心“通常彼此相距较远”相比随机初始化大概率得到更好的结果。然后用肘部法则确认最优簇数plt.figure(figsize(10,5)) sns.lineplot(xrange(1, 11), ywcss, markero, colorred) plt.title(Elbow) plt.xlabel(Number of clusters) plt.ylabel(WCSS) plt.show()图中“肘部”的拐点指示最优簇数——在本例中确实可能就是 3。展示簇并核对“准确率”。from sklearn.cluster import KMeans kmeans KMeans(n_clusters3) kmeans.fit(X) labels kmeans.predict(X) plt.scatter(df[popularity], df[danceability], clabels) plt.xlabel(popularity) plt.ylabel(danceability) plt.show() labels kmeans.labels_ correct_labels sum(y labels) print(Result: %d out of %d samples were correctly labeled. % (correct_labels, y.size)) print(Accuracy score: {0:0.2f}.format(correct_labels / float(y.size)))课中的诚实结论这个模型的准确率并不好而簇的形状恰好揭示了原因——数据过于不均衡、相关性太弱、列值之间的方差variance过大形成的簇很可能被上面定义的三个流派类别本身所左右。“这正是一次学习过程。”Scikit-learn 文档中这类簇界不清晰的模型正是“方差问题”的典型。方差定义为“各数据与均值之差的平方的平均数”在此聚类问题语境中指数据集的数值偏离均值太多。课中给出的改进思路Challenge 部分进一步清洗数据例如去除离群点、换用不同的列、换用不同的算法或使用权重给特定样本更多权重最关键的提示是对数据做缩放scaling以归一化各列——notebook 中有一段被注释的标准缩放代码启用它让各列在取值范围上更接近。课中指出一个反直觉的现象缩放后轮廓系数会下降但肘部图中的“弯折”反而更平滑因为不缩放时低方差的列会获得不成比例的权重。多语言实现与延伸阅读从解决方案目录的结构看本模块对 K-Means 一课提供了多语言参考实现方便使用不同技术栈的读者对照学习Python 参考解答1-Visualize/solution/notebook.ipynb、2-K-Means/solution/notebook.ipynb后者还附有 tester.ipynb 用于验证解答RTidymodels 生态实现lesson_14.Rmd 与 lesson_15.Rmd。R 版 K-Means 解答把算法过程展开为更细的五步描述指定 k → 随机选 k 个初始质心 → 样本分配给最近质心 → 以均值更新质心 → 重复重分配直至收敛并特别强调由于初始质心是随机选取的每次运行结果可能略有不同因此强烈建议用多个nstart多次随机起点运行 K-Means并取 WCSS 最低的一次以避免掉入不良局部最优Julia 实现说明2-K-Means/solution/Julia/README.md。两课还各自配有挑战Challenge、课后测验链接与延伸阅读清单如用 K-Means 模拟器观察质心如何移动、斯坦福的 K-Means 讲义、不同数据形状下各聚类算法行为的综述文章等以及两份作业说明聚类可视化调研作业 与 尝试不同聚类方法作业。模块署名与翻译说明按模块文档的署名信息见 translations/bg/5-Clustering/README.md本系列课程由 Jen Looper 撰写Rishit Dagli 与 Muhammad Sakib Khan Inan 参与了审阅“Nigerian Songs” 数据集取自 Kaggle原始数据从 Spotify 爬取辅助本课编写的 K-Means 参考示例包括 iris 数据集上的 PCA/K-Means/GMM 聚类探索、一个 K-Means 入门 notebook以及一个假设性 NGO 聚类案例均为 Kaggle 上的公开 notebook此处不提供外链当前阅读的这份文档是保加利亚语译文由 AI 翻译服务 Co-op Translator 辅助生成。文档自带的免责说明指出自动翻译可能包含错误或不准之处以其母语原文为权威版本关键信息建议采用专业人工翻译。这也是判断“以哪份文档为准”的依据——本模块的英文原版即上文引用的 5-Clustering/README.md。小结本模块给出的方法论闭环把两节课串起来模块传递的完整工作流是选型先理解数据的几何与密度特性用方法对照表K-Means / DBSCAN / OPTICS / 高斯混合等初步判断算法家族可视化先行用箱线图看离群、用相关热图看列间关系、用 KDE/散点看分布收敛情况据此决定聚类特征建模K-Means 三步迭代分配 → 均值更新 → 收敛用k-means初始化并固定random_state保证可复现选 k 与评估WCSS 肘部法则确定簇数轮廓系数量化簇质量本例 0.53中等水平诚实复盘当准确率不佳时用方差、相关性、均衡性解释原因并用缩放、去离群、换列、换算法迭代改进。这个闭环既是一次具体的音乐口味分析也是一份可直接迁移到其他无标签数据集的聚类分析操作手册。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考