news 2026/9/27 21:00:22

聚类算法入门指南:从 K-Means 到无监督学习的奥秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
聚类算法入门指南:从 K-Means 到无监督学习的奥秘

前面我们学习的线性回归、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_clusters=3, init='k-means++', random_state=42) kmeans.fit(X) # 获取每个样本的簇标签 labels = kmeans.labels_ # 获取质心坐标 centroids = kmeans.cluster_centers_ # 对新数据预测属于哪个簇 new_labels = kmeans.predict(new_X)

重要参数:

  • n_clusters:K 值,即簇的数量,这是最关键的参数

  • init:初始化方式,默认k-means++(智能初始化,比随机好)

  • max_iter:最大迭代次数,默认 300

  • n_init:用不同初始质心运行的次数,取最优结果,默认 10

KMeans 的输出是每个样本的簇标签(0、1、2……),注意这些标签只是编号,没有实际含义——簇 0 不一定就是"第一类",只是个标识而已。拿到标签后,你需要根据簇内样本的特征来解释每个簇代表什么。


五、聚类效果怎么评估?

有监督学习的评估很简单——和真实标签比一比就行。但聚类是无监督的,没有真实标签,怎么判断聚得好不好?这就需要专门的评估指标。

SSE(误差平方和)

SSE 是簇内样本到质心距离的平方和,衡量的是簇内的紧凑程度。

SSE = Σ(每个样本到其质心的距离)²
  • SSE 越小越好:说明每个簇内部的样本越集中、越紧凑

  • K 值越大,SSE 越小:因为簇分得越细,每个簇自然越紧凑。当 K 等于样本数时,每个样本自己一个簇,SSE = 0

SSE 本身不能直接用来选最优 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_clusters=k, random_state=42, n_init=10) 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_clusters=k, random_state=42, n_init=10) labels = kmeans.fit_predict(X_scaled) score = silhouette_score(X_scaled, labels) print(f"K={k}, 轮廓系数: {score:.4f}") # 5. 用最优K聚类(假设K=3效果最好) kmeans = KMeans(n_clusters=3, random_state=42, n_init=10) 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 等更复杂算法的起点。

聚类的魅力在于发现——在看似杂乱无章的数据中,找出隐藏的结构和规律。就像在人群中找到志同道合的伙伴,在商品中发现相似的品类,在行为中识别共同的模式。这种"从无序中发现有序"的感觉,正是无监督学习最迷人的地方。


如果这篇文章对你有帮助,欢迎点赞收藏。下一篇我们将继续探索机器学习的新主题,敬请关注。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 21:00:00

MATLAB模式识别算法实战:从数据预处理到CNN分类器完整实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 20:59:41

云服务器可以用来做网站么适合什么场景

云服务器做网站多少钱?搞懂域名服务器避坑指南 很多刚入行的朋友或者想自己搞个网站的朋友,一上来就被“域名”、“服务器”、“备案”这些词搞晕了。是不是觉得这行门槛极高?其实没那么复杂,核心就三件事:买地皮(域名)、盖房子(网站代码)、租房子(服务器)。 今天就把话说明白, 云服务器完全可以用来做网站…

作者头像 李华
网站建设 2026/9/27 20:59:24

顺德大良那里做网站好避坑指南新手必看

顺德大良那里做网站好避坑指南新手必看 自己一行代码都不会写,却急着要在顺德大良落地一个靠谱的网站?别慌,这太正常了。很多老板找“顺德大良那里做网站好”的服务商,最怕的就是交钱后网站被黑、数据泄露,或者根本没人管售后。这份避坑指南不是教你写代码,而是教你怎么在不懂技术的情况下,通过安全配置和验收标准,…

作者头像 李华
网站建设 2026/9/27 20:59:20

3个实战案例揭秘二手房公司网站源码避坑指南

3个实战案例揭秘二手房公司网站源码避坑指南 别信那些花里胡哨的模板,真做二手房业务,源码才是命根子。 我见过太多中介公司,花大几千买了套通用模板,上线三天就被客户吐槽“像2010年的页面”。 更惨的是,后台改个房源图片都要找外包,改一次收五百,这钱花得冤枉吗?…

作者头像 李华
网站建设 2026/9/27 20:59:11

告别网页编辑软件绿色版陷阱:新手入门避坑指南

告别网页编辑软件绿色版陷阱:新手入门避坑指南 网站被黑挂马,后台登录不了,页面弹出博彩广告,这种噩梦新手常遇。别慌,90%的根源是你用了所谓的“网页编辑软件绿色版”或盗版工具,这些非官方版本往往植入后门,导致服务器权限失控。对于刚转行做网站的新手入门者来说,认清工具真伪与部署规范,比盲目写代码更重要…

作者头像 李华