前面我们学习的线性回归、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:最大迭代次数,默认 300n_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 等更复杂算法的起点。
聚类的魅力在于发现——在看似杂乱无章的数据中,找出隐藏的结构和规律。就像在人群中找到志同道合的伙伴,在商品中发现相似的品类,在行为中识别共同的模式。这种"从无序中发现有序"的感觉,正是无监督学习最迷人的地方。
如果这篇文章对你有帮助,欢迎点赞收藏。下一篇我们将继续探索机器学习的新主题,敬请关注。