ARTICLE DETAIL

资讯详情

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

K-means聚类可视化实战:肘部法则与轮廓系数分析Python代码

K-means聚类可视化实战:肘部法则与轮廓系数分析Python代码 简介这份资源是面向数据科学初学者与算法实践者的K-means聚类可视化Python代码包聚焦聚类分析中簇数选择这一核心难点通过肘部法则与轮廓系数两条路径帮助读者判断最优K值适用于课程作业、项目原型与自学练手。压缩包共27个文件约10.04MB其中7个py脚本承载聚类主流程与示例调用18张png图表直观呈现聚类效果与指标曲线另附txt依赖清单与md说明文档便于快速理解目录结构与运行方式。资源已有165人学习下载具备一定参考热度。读者可获得一套可直接运行的完整演示代码涵盖数据生成、模型训练、肘部法则与轮廓系数评估、结果可视化等环节并配有示例模块与结果输出目录既能对照图表理解算法原理也能在此基础上替换自有数据、调整参数快速搭建属于自己的聚类分析流程。1. 拿到一份 K-means 可视化代码先别急着跑 main.py很多人学聚类卡在第一步不是算法看不懂而是跑完只有一堆数字不知道聚类效果到底好不好。这份 K-means 聚类算法可视化 Python 代码核心价值就在于把「聚类结果」和「怎么判断 K 值合不合理」这两件事同时可视化了。它包含肘部法则和轮廓系数分析目录里有 main.py、src、examples、requirements.txt、results属于典型的可复现小项目结构。适合两类人一类是刚接触 python 数据分析与可视化、想找一个能直接跑通的聚类案例另一类是做实际项目需要快速验证某批数据该分几类、分完效果如何。它不解决数据清洗和特征工程那是你拿到代码前该想清楚的事。2. 拆开目录看结构main.py、src、examples 各自负责什么2.1 从文件布局判断这份代码能不能直接复用拿到一个压缩包我习惯先看目录再决定要不要装依赖。这份代码的结构是kmeans_clustering/ ├── main.py ├── src/ ├── examples/ ├── requirements.txt ├── results/ └── README.mdmain.py是入口负责串起数据生成、聚类、评估和绘图。src放核心逻辑通常包括 K-means 封装、肘部法则计算、轮廓系数计算和绘图函数。examples是不同数据分布下的调用示例比如球形簇、非球形簇、不同样本量。results是输出目录跑完图会落在这里。requirements.txt锁依赖版本。判断能不能复用看三点核心逻辑是否和入口分离、评估指标是否独立成函数、输出是否落盘。这份代码三点都满足所以你可以只改examples里的数据加载部分把内置数据换成自己的 CSV而不用动src。2.2 依赖安装与版本边界环境要求是 numpy、matplotlib、seaborn、scikit-learn、pandas。安装命令pip install numpy matplotlib seaborn scikit-learn pandas如果你用 requirements.txtpip install -r requirements.txt参数说明scikit-learn提供KMeans和silhouette_scorematplotlib和seaborn负责绘图pandas用于数据读取。常见坑是 seaborn 版本和 matplotlib 版本不匹配导致绘图报错建议先建虚拟环境再装。如果你在 vscode python 环境配置里遇到解释器选错跑main.py会提示找不到 sklearn先确认右下角解释器路径。提示不要全局装完直接跑先python -c import sklearn; print(sklearn.__version__)确认版本避免和已有环境冲突。3. 肘部法则怎么算从 SSE 曲线到 K 值候选3.1 原理与选型理由肘部法则的核心是计算不同 K 值下的簇内平方和SSE也称 inertia。随着 K 增大SSE 一定下降但下降速度会在某个点明显变缓那个拐点就是候选 K。它不告诉你唯一答案只缩小范围。很多人直接取曲线最陡处结果 K2 或 K3 就停实际业务可能需要更多簇。正确做法是结合轮廓系数一起看。3.2 可抄作业的肘部法则代码import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs # 生成模拟数据random_state 固定保证可复现 X, y_true make_blobs(n_samples500, centers4, cluster_std0.8, random_state42) sse [] k_range range(1, 11) for k in k_range: # n_init10 表示用 10 次不同初始化取最优避免陷入局部最优 kmeans KMeans(n_clustersk, n_init10, random_state42) kmeans.fit(X) sse.append(kmeans.inertia_) # inertia_ 即 SSE plt.figure(figsize(8, 5)) plt.plot(k_range, sse, markero) plt.xlabel(K) plt.ylabel(SSE (inertia)) plt.title(Elbow Method) plt.grid(True) plt.savefig(results/elbow.png, dpi150) plt.show()逻辑说明make_blobs生成 4 个中心的数据方便验证算法能否识别。n_init10是 scikit-learn 较新版本的默认行为显式写出避免版本差异。inertia_是拟合后属性必须在fit之后取。dpi150保证保存图片清晰。参数说明cluster_std控制簇的松散程度值越大簇越重叠肘部越不明显。random_state固定后每次结果一致方便对比。如果你换成自己的数据把X替换为df[[col1,col2]].values即可。3.3 怎么读肘部图跑完看results/elbow.png。如果曲线在 K4 附近出现明显拐点说明 4 是候选。如果曲线平滑下降没有拐点说明数据本身没有明显簇结构或者特征维度太高需要先降维。这时候不要硬选 K先做 PCA 看解释方差。注意肘部法则对cluster_std敏感模拟数据太干净会显得方法很准真实数据往往拐点模糊必须配合轮廓系数。4. 轮廓系数分析把聚类质量量化成 -1 到 14.1 轮廓系数在算什么轮廓系数衡量每个样本与自身簇的紧密度和与最近簇的分离度。公式是(b - a) / max(a, b)a 是样本到同簇其他点的平均距离b 是到最近其他簇的平均距离。取值 -1 到 1越接近 1 越好负值说明样本可能分错簇。整体轮廓系数是所有样本的平均值。它比 SSE 更适合比较不同 K因为 SSE 随 K 单调下降而轮廓系数有峰值。常见做法是遍历 K取轮廓系数最大的 K。4.2 轮廓系数计算与可视化代码from sklearn.metrics import silhouette_score, silhouette_samples import matplotlib.cm as cm sil_scores [] for k in range(2, 11): # 轮廓系数至少需要 2 个簇 kmeans KMeans(n_clustersk, n_init10, random_state42) labels kmeans.fit_predict(X) score silhouette_score(X, labels) sil_scores.append(score) print(fK{k}, silhouette{score:.4f}) # 选最佳 K 画轮廓图 best_k range(2, 11)[np.argmax(sil_scores)] kmeans KMeans(n_clustersbest_k, n_init10, random_state42) labels kmeans.fit_predict(X) sample_sil silhouette_samples(X, labels) plt.figure(figsize(8, 6)) y_lower 10 for i in range(best_k): ith_sil sample_sil[labels i] ith_sil.sort() size_i ith_sil.shape[0] y_upper y_lower size_i color cm.nipy_spectral(float(i) / best_k) plt.fill_betweenx(np.arange(y_lower, y_upper), 0, ith_sil, facecolorcolor, edgecolorcolor, alpha0.7) plt.text(-0.05, y_lower 0.5 * size_i, str(i)) y_lower y_upper 10 plt.axvline(xsilhouette_score(X, labels), colorred, linestyle--) plt.xlabel(Silhouette coefficient) plt.ylabel(Cluster label) plt.title(fSilhouette Plot (K{best_k})) plt.savefig(results/silhouette.png, dpi150) plt.show()逻辑说明silhouette_score返回整体均值silhouette_samples返回每个样本的值用于画图。np.argmax取最大轮廓系数对应的 K。红色虚线是整体均值每个簇的刀形宽度代表样本量长度代表轮廓系数。参数说明range(2, 11)从 2 开始因为 1 个簇无法计算轮廓系数。y_lower和间隔 10 是为了让不同簇的刀形分开。如果某个簇的刀形大量为负说明该簇内样本和别的簇更近考虑增加或减少 K。4.3 肘部法则和轮廓系数冲突时听谁的实际跑下来经常出现肘部说 K3、轮廓系数说 K2 的情况。我的经验是先看轮廓系数峰值是否明显如果峰值比相邻 K 高出一截优先信轮廓系数如果几个 K 的轮廓系数差不多回到肘部看拐点再结合业务解释性。比如社区服务需求分类分 3 类可能比 2 类更好落地即使轮廓系数略低。提示轮廓系数计算复杂度是 O(n²)样本超过 1 万时先抽样再算否则会卡住。5. 避坑与排查跑不通、图不对、结果不稳定5.1 现象报错ModuleNotFoundError: No module named sklearn原因解释器环境没装 scikit-learn或者 vscode/pycharm 选错了 python 解释器。解决先pip install scikit-learn再确认 IDE 右下角解释器路径和pip所在环境一致。用python -m pip install scikit-learn更稳。5.2 现象每次跑出来聚类结果不一样原因KMeans默认n_init和随机初始化导致。解决固定random_state42并显式设置n_init10。如果数据量大n_init可以调到 20但耗时增加。5.3 现象肘部图没有明显拐点原因数据本身没有簇结构或者特征量纲差异大。解决先做标准化StandardScaler再画肘部图。如果仍然平滑用 PCA 降维后看二维散点确认是否值得聚类。5.4 现象轮廓系数为负原因样本被分到了错误的簇常见于 K 选得过大或数据分布非球形。解决减小 K 重试或改用 DBSCAN 聚类算法处理非球形簇。K-means 假设簇是凸的且大小相近不满足时不要硬套。5.5 现象保存的图片空白或横坐标太密集原因plt.show()在无界面环境不显示或 K 范围太大导致刻度拥挤。解决用plt.savefig落盘设置dpi和figsize。横坐标密集时用plt.xticks(range(1,11))手动指定刻度。6. 进阶用法把内置数据换成自己的 CSV 并批量出图6.1 替换数据源的最小改动这份代码默认用make_blobs生成数据。换成自己的 CSV只需要改数据加载部分src里的评估和绘图函数不用动。常见做法是import pandas as pd from sklearn.preprocessing import StandardScaler df pd.read_csv(your_data.csv) features [feature1, feature2, feature3] X df[features].values # 标准化避免量纲影响距离计算 scaler StandardScaler() X_scaled scaler.fit_transform(X)然后把后续KMeans的输入从X换成X_scaled。参数说明StandardScaler做 Z-score 标准化均值 0 方差 1。如果特征里有类别变量先做独热编码再标准化。6.2 批量跑不同 K 并汇总指标手动改 K 太慢我一般写个循环把肘部和轮廓系数一起跑输出表格import pandas as pd records [] for k in range(2, 11): km KMeans(n_clustersk, n_init10, random_state42) labels km.fit_predict(X_scaled) records.append({ K: k, SSE: km.inertia_, Silhouette: silhouette_score(X_scaled, labels) }) result_df pd.DataFrame(records) result_df.to_csv(results/k_selection.csv, indexFalse) print(result_df)逻辑说明一次循环同时拿到 SSE 和轮廓系数落成 CSV 方便对比。参数说明indexFalse避免多一列索引。跑完看k_selection.csv选轮廓系数最大且 SSE 拐点附近的 K。6.3 一个我踩过的坑有次我直接拿原始数据跑轮廓系数一直在 0.2 左右换了好几个 K 都不理想。后来发现是某个特征数值范围是 0 到 10000其他特征是 0 到 1距离计算完全被大特征主导。标准化之后轮廓系数升到 0.6。从那以后我每次做聚类前都强制走一遍StandardScaler不管数据看起来多干净。希望帮到你。本文还有配套的精品资源点击获取
返回列表