机器学习之聚类算法
一、聚类算法基础
1.核心概念
聚类算法是一种无监督学习算法,核心逻辑是依据样本间的相似性将数据自动划分到不同类别,无需预先标注类别标签。其核心目标是在缺乏先验知识的情况下,挖掘数据集中隐藏的内在结构与模式。
相似性度量:常用欧式距离(适用于连续型数据,计算两点在多维空间中的直线距离),但并非唯一方式,还包括曼哈顿距离(适用于高维数据,降低异常值影响)、余弦相似度(适用于文本、图像等向量数据,衡量方向相似性)等。
聚类准则:不同准则会产生不同结果,例如 “最小化簇内样本距离”“最大化簇间样本距离” 等,需根据业务场景选择。
2.应用场景
聚类算法在实际业务中应用广泛,核心价值是实现 “数据分组” 与 “模式识别”,典型场景包括:
用户运营:用户画像构建(如按消费能力、年龄、兴趣划分用户群体)、精准广告推荐(向同类用户推送相似产品)。
互联网服务:搜索引擎流量推荐(将用户搜索行为聚类,匹配同类内容)、新闻聚类(按主题将新闻分类,便于用户筛选)。
风险控制:恶意流量识别(聚类异常访问行为)、信用卡异常消费检测(识别与用户常规消费模式差异大的交易)。
技术领域:图像分割(将图像中相似像素聚类,提取目标区域)、基因片段分析(发掘功能相同的基因片段)、基于位置的商业推送(向同一区域用户推送周边服务)。
3.算法分类
聚类算法可从 “颗粒度” 和 “实现方法” 两个维度划分:
分类维度 | 具体类型 | 核心特点 |
---|---|---|
颗粒度 | 粗聚类 | 聚类结果类别数量少,每个类别包含大量样本,适用于快速概览数据分布 |
细聚类 | 聚类结果类别数量多,每个类别样本更精细,适用于精准分群场景 | |
实现方法 | K-means 聚类 | 基于 “质心” 划分,通用性强、效率高,是工业界最常用的聚类算法 |
层次聚类 | 通过逐层合并或拆分簇实现聚类,可形成树状聚类结构( dendrogram ),适用于需明确层级关系的数据 | |
DBSCAN 聚类 | 基于密度的算法,无需预先指定簇数量,能识别任意形状的簇,同时检测离群点,适用于含噪声、非凸分布的数据 | |
谱聚类 | 基于图论的算法,将数据转化为图结构,通过图切割实现聚类,适用于高维数据或非线性分布数据 |
二、K-means算法详解
1.核心原理
K-means 是基于 “距离” 的聚类算法,核心思想是通过迭代优化,使 “簇内样本距离最小化、簇间样本距离最大化”,最终得到稳定的聚类结果。
2.实现流程
(1)确定K值:根据业务需求或数据特征,预先设定最终聚类的类别数量 K(K 的选择需结合后续评估方法优化)。
(2)初始化质心:从所有样本中随机选择 K 个样本作为初始聚类中心(质心),初始质心的选择会影响最终结果,优化方式包括 “多次随机初始化取最优”“K-means++ 算法(使初始质心尽可能分散)”。
(3)样本分配:计算每个样本到 K 个质心的距离(默认欧式距离),将样本分配到距离最近的质心所属的簇。
(4)更新质心:对每个簇内的所有样本,计算其在各特征维度上的平均值,作为该簇新的质心。
(5)迭代终止:对比新质心与旧质心的位置,若质心不再变化(或变化小于设定阈值),则聚类收敛,停止迭代;否则返回步骤 3,重复样本分配与质心更新过程。
3.关键示例
以 15 个样本点(含 X、Y 坐标)聚类为例:
- 设定 K=2,随机选择 P1(7,7)、P2(2,3)作为初始质心。
- 计算其他样本(如 P3(6,8)、P4(1,4))到 P1、P2 的欧式距离,将 P3 分配到 P1 簇(距离更近),P4 分配到 P2 簇。
- 计算 P1 簇所有样本的 X、Y 平均值,得到新质心 P1'(7.3,7.2);同理得到 P2 簇新质心 P2'(2.3,3.3)。
- 重复步骤 2-3,直至新质心与旧质心完全一致,最终将 15 个样本分为 2 个簇,簇内样本相似度高。
三、聚类算法API与实践
1.核心API(基于sklearn)
sklearn 库提供了简洁的聚类算法接口,以 K-means 为例:
类定义:sklearn.cluster.KMeans(n_clusters=8, random_state=None, max_iter=300)
关键参数:
n_clusters=8:聚类类别数量,默认 8,需结合业务或评估方法调整。
random_state=None:随机种子,用于固定初始质心,确保实验可复现。
max_iter=300:最大迭代次数,默认 300,防止算法陷入无限循环。
核心方法:
fix(x):仅对数据 X 进行聚类训练,计算质心,不返回样本类别。
predict(x):基于已训练的模型,预测数据 X 中每个样本的类别。
fit_predict(x):同时完成训练与预测,返回每个样本的类别,等价于fit(X)
后调用predict(X)
。
2.实践步骤(以随机二维数据集为例)
(1)环境准备:导包
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs # 生成模拟聚类数据
from sklearn.metrics import calinski_harabasz_score # 聚类评估指标
(2)创建数据集
X, y = make_blobs(n_samples=1000, # 样本数量n_features=2, # 特征维度centers=[[-1,-1], [0,0], [1,1], [2,2]], # 真实质心位置cluster_std=[0.4, 0.2, 0.2, 0.2], # 各簇数据标准差random_state=22 # 固定随机种子
)
(3)模型训练与预测
# 设定K=3,训练并预测
y_pred = KMeans(n_clusters=3, random_state=22).fit_predict(X)
(4)结果可视化:绘制聚类效果
plt.scatter(X[:, 0], X[:, 1], c=y_pred) # 按预测类别着色
plt.title("K-means Clustering Result")
plt.show()
(5)模型评估:适用CH系数评估效果
print("CH Score:", calinski_harabasz_score(X, y_pred)) # 数值越大,聚类效果越好
四、聚类模型评估方法
聚类评估的核心是量化 “簇内紧凑性” 与 “簇间分离性”,常用指标包括以下四类:
(1):误差平方和(SSE)
定义:计算所有样本到其所属簇质心的距离平方和
公式:(k为簇数,(C_i)为第i个簇,p为簇内样本,(m_i)为第i个簇的质心)。
解读:SSE 越小,说明簇内样本越集中,聚类效果越好;但 SSE 会随簇数 K 的增加持续减小(K=n 时 SSE=0),因此不能单独用于确定最优 K 值,需结合 “肘部法” 使用。
(2)肘部法(Elbow Method)
作用:基于 SSE 确定最优 K 值,解决 SSE 随 K 增大持续下降的问题。
原理:
1.遍历K 从 1 到 n(样本总数),对每个 K 训练 K-means 模型,计算对应的 SSE。
2.绘制“K-SSE” 曲线,曲线下降过程中会出现一个 “拐点”(类似手肘形状),拐点处 K 值即为最优值 —— 此时增加 K 值,SSE 下降率突然变缓,继续增加 K 会导致过拟合(簇划分过细,失去业务意义)。
示例:在含 4 个真实簇的数据集上,K=4 时 SSE 下降趋缓,故最优 K=4。
(3)轮廓系数(SC)
定义:综合考虑 “簇内紧凑性” 与 “簇间分离性”
公式:(a为样本到簇内其他样本的平均距离,b为样本到其他所有簇的平均距离的最小值)。
解读:1.SC 取值范围为 [-1,1],值越接近 1,说明样本在簇内越紧凑、与其他簇越分离,聚类效果越好。2.SC=0 时,样本处于两个簇的边界;SC<0 时,样本可能被分配到错误的簇。
优势:无需依赖真实类别标签,适用于无监督场景;但计算复杂度较高(需遍历所有样本与簇),大数据集下效率较低。
五、扩展与注意事项
(1)算法局限性与优化
局限性:
需预先指定 K 值,对初始质心敏感(易陷入局部最优),可通过 K-means++(优化初始质心选择)、多次初始化取最优解缓解。
对非凸分布数据(如环形、螺旋形数据)聚类效果差,此时需改用 DBSCAN、谱聚类等算法。
对异常值敏感(异常值会严重偏离质心),需先通过箱线图、Z-score 等方法处理异常值。
适用场景
数据含噪声 / 非凸分布:优先 DBSCAN(无需指定 K,可识别离群点)。
需明确层级关系(如公司组织架构、物种分类):选择层次聚类。
高维数据(如文本向量、图像特征):优先谱聚类(降维后聚类,避免维度灾难)。
(2)实战技巧
1.特征预处理:聚类算法对特征尺度敏感(如 “年收入(千级)” 与 “消费指数(0-100)”),需先通过 StandardScaler(标准化)或 MinMaxScaler(归一化)统一特征尺度。
2.多指标综合评估:单一指标可能存在偏差,例如 SSE 最小化可能导致 K 过大,需结合肘方法、SC、CH 共同确定最优 K 值。
3.业务验证:聚类结果需结合业务逻辑验证,例如 “客户聚类” 需与运营经验匹配,避免仅追求技术指标而脱离实际需求。