聚类算法入门指南:从 K-Means 到无监督学习的奥秘
发布时间:2026/9/27 21:00:29来源:尧图网络
前面我们学习的线性回归、KNN、决策树都属于有监督学习——数据有标签模型照着答案学。但现实世界中大量数据是没有标签的给你一万个用户的行为数据没有高价值低价值的标注给你一千篇新闻没有财经科技体育的分类。这时候就轮到无监督学习登场了。聚类是无监督学习中最核心、最常用的方法它能自动从数据中发现隐藏的结构和分组。今天这篇文章我们就来系统梳理聚类的知识体系——从基本概念到算法分类从 K-Means 的完整原理到评估指标带你走进无监督学习的世界。一、什么是聚类聚类是一种无监督学习方法数据有特征但没有标签算法利用样本之间的相似性自动将相似的样本归为一类不相似的归为不同类。打个比方给你一筐水果没有标签让你自己分堆。你可能会按颜色分成红色的、黄色的、绿色的也可能按大小分成大的、小的。聚类算法做的就是这件事——它不知道正确答案是什么但它能根据数据本身的特征把长得像的放在一起。聚类和分类的区别在于分类是先有类别再归类聚类是先分组再看组是什么。分类是有答案的聚类是自己找答案。二、聚类的分类聚类算法不是只有一种根据不同的标准可以分成不同类型。按颗粒度分细聚类细粒度聚类分的类别多每一类内部样本相似度很高。比如把新闻分成财经-股票-A股这样三级细分。粗聚类粗粒度聚类分的类别少只做大致分组。比如只把新闻分成财经科技体育三大类。粗细不是绝对的取决于业务需求——需要细致洞察就用细聚类只需要宏观分类就用粗聚类。按实现方式分这是更重要的分类方式不同的算法思路差异很大KMeans按照质心聚类。以每个簇的中心点质心为代表样本归到距离最近的质心所在的簇。这是最经典、最常用的聚类算法。层次聚类按照数据的层次结构聚类。有两种思路一种是凝聚式自下而上从每个点自己成簇开始每一步合并距离最近的两个簇直到所有样本合并成一个大簇另一种是分裂式自上而下从所有点在一个簇开始逐步分裂。最终形成一棵树形的层次结构叫做系统树图Dendrogram。层次聚类的好处是不需要预先指定 K——你可以在树的任意高度切一刀得到任意数量的簇。缺点是计算量大不适合大数据集。DBSCAN基于数据的密度聚类。核心思想是只要一个区域内的样本密度足够高邻域内样本数超过阈值就把它们连成一个簇。它能发现任意形状的簇——不管是球形、月牙形还是环形只要是密度连通的区域都能聚成一类。更棒的是DBSCAN 能自动识别噪声点离群值不需要预先指定 K 值。但它也有缺点对密度不均匀的数据效果不好而且需要调两个参数邻域半径和最小样本数调起来比 K 值更难。谱聚类基于图论的思想。把每个样本看作图的一个节点相似的样本之间连边然后通过图的切割来实现聚类。它对非凸形状的数据效果好数学理论也很优美但计算复杂度高不适合大规模数据。四种算法各有侧重KMeans 简单高效适合球形簇层次聚类能给出层级关系适合探索性分析DBSCAN 擅长发现不规则形状和噪声谱聚类理论优美但计算昂贵。实际项目中KMeans 是首选——先跑 KMeans 打个底如果效果不理想再考虑换更复杂的算法。三、K-Means 算法原理K-Means 是聚类算法的代言人原理清晰、实现简单、效果稳定是入门聚类的必学算法。K-Means 的名字来自两个关键K表示要聚成 K 个簇Means表示每个簇的中心是簇内样本的均值质心。它的完整流程分为五步第一步确定 K 值先告诉算法要分成几个簇。K 是 K-Means 最重要的超参数直接影响聚类效果。怎么选 K 是后面要重点讲的话题。第二步初始化 K 个质心点在数据空间中随机放置 K 个点作为初始的簇中心。初始质心的选择会影响最终结果——选得不好可能收敛到局部最优。为了解决这个问题实际中通常用 K-Means 初始化策略让初始质心之间尽量离得远一些。第三步样本分组计算每个样本与 K 个质心之间的欧氏距离将每个样本分配给距离最近的那个质心所在的簇。这一步之后所有样本都被分到了 K 个簇中。第四步更新质心点对于每个簇计算簇内所有样本点的均值把这个均值作为新的质心。因为样本重新分组了原来的质心位置可能不再是中心需要更新。第五步判断收敛检查质心的位置是否已经稳定——如果多次更新后质心点的位置几乎没有变化说明算法收敛了停止迭代反之回到第三步继续分组、更新直到收敛为止。整个过程就是分组 → 更新质心 → 再分组 → 再更新的循环直到质心不再移动。用一句话总结 K-Means 的核心质心在哪簇就在哪样本归谁质心就移向谁。两者相互调整最终达到稳定。四、API 调用scikit-learn 中的 KMeans 调用同样简洁from sklearn.cluster import KMeans kmeans KMeans(n_clusters3, initk-means, random_state42) kmeans.fit(X) # 获取每个样本的簇标签 labels kmeans.labels_ # 获取质心坐标 centroids kmeans.cluster_centers_ # 对新数据预测属于哪个簇 new_labels kmeans.predict(new_X)重要参数n_clustersK 值即簇的数量这是最关键的参数init初始化方式默认k-means智能初始化比随机好max_iter最大迭代次数默认 300n_init用不同初始质心运行的次数取最优结果默认 10KMeans 的输出是每个样本的簇标签0、1、2……注意这些标签只是编号没有实际含义——簇 0 不一定就是第一类只是个标识而已。拿到标签后你需要根据簇内样本的特征来解释每个簇代表什么。五、聚类效果怎么评估有监督学习的评估很简单——和真实标签比一比就行。但聚类是无监督的没有真实标签怎么判断聚得好不好这就需要专门的评估指标。SSE误差平方和SSE 是簇内样本到质心距离的平方和衡量的是簇内的紧凑程度。SSE Σ(每个样本到其质心的距离)²SSE 越小越好说明每个簇内部的样本越集中、越紧凑K 值越大SSE 越小因为簇分得越细每个簇自然越紧凑。当 K 等于样本数时每个样本自己一个簇SSE 0SSE 本身不能直接用来选最优 K因为 K 越大 SSE 一定越小。但它的变化趋势可以——这就是肘部法。肘部法找最优 K肘部法Elbow Method的思路是画出 K 从 1 到 N 的 SSE 曲线找SSE 下降突然变缓的那个拐点就是最优的 K 值。为什么叫肘部因为 SSE 曲线的形状像人的手臂——一开始下降很快上臂到某个点后突然变缓手肘之后几乎平着走前臂。手肘那个拐点就是最佳平衡点——再增加 K 值SSE 的改善已经不明显了得不偿失。肘部法简单直观但缺点是有些数据集的曲线很平滑没有明显的拐点判断起来比较主观。SC 轮廓系数轮廓系数Silhouette Coefficient是一个更综合的评估指标同时考虑了簇内紧凑度和簇间分离度。对于每个样本 i轮廓系数的计算涉及两个值a样本 i 到同簇内其他样本的平均距离越小越好说明簇内越紧密b样本 i 到最近的其他簇所有样本的平均距离越大越好说明簇间越远轮廓系数公式s(i) (b - a) / max(a, b)轮廓系数的范围是-1 到 1越接近1说明样本所在的簇内紧密、簇间分离聚类效果好接近0说明样本在两个簇的边界上聚类效果一般接近-1说明样本被分到了错误的簇所有样本的轮廓系数取平均值就是整体的轮廓系数。轮廓系数越接近 1 越好。轮廓系数可以和肘部法结合使用——肘部法给出大致的 K 值范围轮廓系数在范围内精挑细选找到效果最好的那个 K。CH 指数CH 指数Calinski-Harabasz Index也是一个综合指标衡量簇间离散度和簇内离散度的比值。值越大越好簇间距离越远越好簇内越紧密越好CH 指数的计算基于方差分析的思想计算速度比轮廓系数快适合大规模数据。三个指标的对比指标衡量内容最优方向特点SSE簇内紧凑度越小越好简单直观需结合肘部法轮廓系数簇内紧 簇间远越接近1越好综合评估计算较慢CH 指数簇间/簇内比越大越好计算快适合大数据六、实战案例用户分群理论讲完了来看一个实际应用。用户分群是聚类最经典的应用场景之一——根据用户的行为数据自动把用户分成几个群体帮助运营团队做精细化运营。import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt # 1. 准备数据模拟用户行为数据 data pd.DataFrame({ 消费金额: [200, 300, 150, 800, 1200, 950, 50, 30, 80, 250, 280, 180, 900, 1100, 850], 消费频次: [10, 12, 8, 25, 30, 28, 2, 1, 3, 15, 14, 9, 22, 27, 20] }) # 2. 特征标准化KMeans基于距离必须标准化 scaler StandardScaler() X_scaled scaler.fit_transform(data) # 3. 用肘部法找最优K sse [] k_range range(1, 10) for k in k_range: kmeans KMeans(n_clustersk, random_state42, n_init10) kmeans.fit(X_scaled) sse.append(kmeans.inertia_) # inertia_ 就是 SSE plt.plot(k_range, sse, o-) plt.xlabel(K值) plt.ylabel(SSE) plt.title(肘部法选K) plt.show() # 4. 用轮廓系数验证 for k in range(2, 8): kmeans KMeans(n_clustersk, random_state42, n_init10) labels kmeans.fit_predict(X_scaled) score silhouette_score(X_scaled, labels) print(fK{k}, 轮廓系数: {score:.4f}) # 5. 用最优K聚类假设K3效果最好 kmeans KMeans(n_clusters3, random_state42, n_init10) labels kmeans.fit_predict(X_scaled) # 6. 分析每个簇的特征 data[簇标签] labels print(data.groupby(簇标签).mean())最后一步非常关键——聚类不是得到标签就完事了你需要解读每个簇的含义。通过查看每个簇的平均特征你可以给每个簇起个名字高消费高频次 → 高价值活跃用户中消费中频次 → 普通用户低消费低频次 → 沉睡用户有了这些标签运营团队就可以针对不同群体制定不同策略——高价值用户做 VIP 维护沉睡用户做召回活动。聚类的价值最终要体现在业务决策上。七、K-Means 的优缺点K-Means 是最常用的聚类算法但它不是万能的。了解它的优缺点才能在正确的场景使用它。优点原理简单容易理解。找 K 个中心样本归最近的直觉性强学习成本低。收敛速度快。通常几十次迭代就能收敛处理百万级数据也不在话下。效果稳定解释性好。聚类结果可以通过质心和簇内特征来解释便于和业务沟通。扩展性好。数据量增大时K-Means 仍然能较好地运行还有 Mini Batch K-Means 等优化版本专门处理大数据。缺点必须手动指定 K 值。这是 K-Means 最大的痛点——K 选得好不好直接决定效果。虽然有肘部法、轮廓系数辅助但最终还是要结合业务判断。对初始质心敏感。初始质心选得不好可能收敛到局部最优解。K-Means 初始化在一定程度上缓解了这个问题但没有完全解决。只能发现球形簇。K-Means 假设簇是球形的、各向同性的对于非凸形状如月牙形、环形的簇效果很差。对异常值敏感。异常值会拖拽质心的位置影响整个簇的形状。在聚类前做异常值检测和处理很重要。对特征量纲敏感。和 KNN 一样K-Means 基于距离计算必须做标准化或归一化否则大量纲特征会主导距离计算。八、学习心得与建议第一聚类的核心是相似性。不管什么聚类算法本质都是在定义什么样本算相似。K-Means 用距离定义相似DBSCAN 用密度定义相似谱聚类用图连接定义相似。理解了这一点你就知道为什么不同算法在不同数据集上表现差异那么大——因为它们对相似的理解不同。第二K 值的选择要结合业务。肘部法、轮廓系数都是数学指标最终 K 选多少还要看业务场景。比如做用户分群运营团队能不能同时 handle 5 个群体3 个会不会更实际技术指标是参考业务需求才是最终的决策依据。第三聚类结果的解读比聚类本身更重要。很多初学者沉迷于调参、比指标却忽略了最关键的一步——聚类出来的簇到底代表什么能给业务带来什么价值算法只是手段创造业务价值才是目的。拿到聚类结果后一定要深入分析每个簇的特征给它们起有意义的名字。第四聚类不是一次性的。数据会变化用户行为会变化聚类模型也需要定期更新。建议建立一个机制每隔一段时间重新跑一次聚类看看群体结构有没有发生变化。写在最后从有监督学习到无监督学习我们进入了一个全新的领域——没有标准答案算法自己找规律。聚类是这个领域的敲门砖而 K-Means 是聚类的入门钥匙。今天我们梳理了聚类的完整知识体系聚类的定义和分类、K-Means 的五步原理、三大评估指标SSE/肘部法、轮廓系数、CH指数、用户分群实战以及 K-Means 的优缺点。这些是聚类算法的基础也是后续学习层次聚类、DBSCAN 等更复杂算法的起点。聚类的魅力在于发现——在看似杂乱无章的数据中找出隐藏的结构和规律。就像在人群中找到志同道合的伙伴在商品中发现相似的品类在行为中识别共同的模式。这种从无序中发现有序的感觉正是无监督学习最迷人的地方。如果这篇文章对你有帮助欢迎点赞收藏。下一篇我们将继续探索机器学习的新主题敬请关注。
网站建设高端定制企业官网