一、聚类任务的简介
聚类是机器学习中一类重要的无监督学习任务,其核心目标是在没有预设标签的情况下,通过分析样本间的内在相似性,将数据集自动划分为若干个具有共同特征的“簇”(Cluster)。
1.1 聚类的核心特征
- 无监督性:无需人工标注训练数据的类别标签,完全依赖数据自身的特征分布进行划分;
- 相似性度量:通过距离(如欧式距离、曼哈顿距离)或相似度(如余弦相似度)判断样本关联程度,距离越小则样本越相似;
- 簇内一致性:同一簇内的样本应具有较高的相似度,不同簇间的样本应具有显著差异。
1.2 聚类的典型应用场景
- 用户分群:根据消费习惯、浏览行为等特征将用户划分为不同群体,支撑精准营销;
- 异常检测:远离所有簇的样本可能是异常值(如信用卡欺诈交易、设备故障数据);
- 数据降维与可视化:将高维数据聚成少数簇,简化分析复杂度;
- 生物学研究:对基因表达数据聚类,发现功能相似的基因族群。
聚类算法种类繁多,其中Kmeans因原理简单、计算高效,成为实际应用中最广泛的聚类方法之一。
二、Kmeans的思想和数学原理
2.1 核心思想
Kmeans算法(K-均值聚类)的核心思想是:通过迭代优化K个簇中心,使每个样本被分配到距离最近的簇,最终实现“簇内样本紧凑、簇间样本分散”的目标。
通俗来说,Kmeans就像“物以类聚”的过程:先随机选择K个“种子”(初始簇中心),然后让每个样本“投靠”最近的种子,再根据投靠的样本重新计算新的种子位置,重复此过程直到种子位置不再变化。
2.2 数学原理
-
距离度量
Kmeans采用欧式距离衡量样本与簇中心的相似度。对于d维特征空间中的样本 x = ( x 1 , x 2 , . . . , x d ) x=(x_1,x_2,...,x_d) x=(x1,x2,...,xd)和簇中心 c = ( c 1 , c 2 , . . . , c d ) c=(c_1,c_2,...,c_d) c=(c1,c2,...,cd),欧式距离公式为:
d ( x , c ) = ∑ i = 1 d ( x i − c i ) 2 d(x,c) = \sqrt{\sum_{i=1}^d (x_i - c_i)^2} d(x,c)=i=1∑d(xi−ci)2 -
目标函数
Kmeans的优化目标是最小化所有样本到其所属簇中心的距离平方和(SSE,误差平方和),公式为:
min J = ∑ j = 1 K ∑ x ∈ C j d ( x , c j ) 2 \min \quad J = \sum_{j=1}^K \sum_{x \in C_j} d(x, c_j)^2 minJ=j=1∑Kx∈Cj∑d(x,cj)2
其中:- K K K为预设的簇数量;
- C j C_j Cj表示第 j j j个簇包含的样本集合;
- c j c_j cj表示第 j j j个簇的中心(由簇内样本的均值计算得到)。
-
簇中心更新规则
当样本分配完成后,每个簇的中心通过簇内所有样本的特征均值更新,公式为:
c j = 1 ∣ C j ∣ ∑ x ∈ C j x c_j = \frac{1}{|C_j|} \sum_{x \in C_j} x cj=∣Cj∣1x∈Cj∑x
其中 ∣ C j ∣ |C_j| ∣Cj∣为第 j j j个簇的样本数量。 -
迭代收敛条件
算法通过反复执行“样本分配→更新簇中心”过程实现优化,当满足以下条件之一时停止迭代:- 簇中心的变化量小于预设阈值(如 1 0 − 4 10^{-4} 10−4);
- 达到最大迭代次数(避免无限循环)。
三、Kmeans计算过程示例
以一个简单的二维数据集为例,详细演示Kmeans的聚类步骤(取 K = 2 K=2 K=2)。
3.1 数据集
假设有5个样本,特征坐标如下:
A
(
1
,
2
)
A(1, 2)
A(1,2)、
B
(
2
,
1
)
B(2, 1)
B(2,1)、
C
(
6
,
5
)
C(6, 5)
C(6,5)、
D
(
7
,
7
)
D(7, 7)
D(7,7)、
E
(
8
,
6
)
E(8, 6)
E(8,6)
3.2 步骤1:确定K值并初始化簇中心
- 设定 K = 2 K=2 K=2(目标是将数据分为2个簇);
- 随机选择2个样本作为初始簇中心:
c 1 = A ( 1 , 2 ) c_1 = A(1, 2) c1=A(1,2)(簇1的初始中心), c 2 = D ( 7 , 7 ) c_2 = D(7, 7) c2=D(7,7)(簇2的初始中心)。
3.3 步骤2:计算样本到簇中心的距离并分配簇
分别计算每个样本到 c 1 c_1 c1和 c 2 c_2 c2的欧式距离,将样本分配给距离更近的簇:
-
A A A到 c 1 c_1 c1的距离: d ( A , c 1 ) = 0 d(A,c_1)=0 d(A,c1)=0;到 c 2 c_2 c2的距离: ( 1 − 7 ) 2 + ( 2 − 7 ) 2 ≈ 7.81 \sqrt{(1-7)^2+(2-7)^2}≈7.81 (1−7)2+(2−7)2≈7.81 → 分配给簇1;
-
B B B到 c 1 c_1 c1的距离: ( 2 − 1 ) 2 + ( 1 − 2 ) 2 ≈ 1.41 \sqrt{(2-1)^2+(1-2)^2}≈1.41 (2−1)2+(1−2)2≈1.41;到 c 2 c_2 c2的距离: ( 2 − 7 ) 2 + ( 1 − 7 ) 2 ≈ 7.81 \sqrt{(2-7)^2+(1-7)^2}≈7.81 (2−7)2+(1−7)2≈7.81 → 分配给簇1;
-
C C C到 c 1 c_1 c1的距离: ( 6 − 1 ) 2 + ( 5 − 2 ) 2 ≈ 5.83 \sqrt{(6-1)^2+(5-2)^2}≈5.83 (6−1)2+(5−2)2≈5.83;到 c 2 c_2 c2的距离: ( 6 − 7 ) 2 + ( 5 − 7 ) 2 ≈ 2.24 \sqrt{(6-7)^2+(5-7)^2}≈2.24 (6−7)2+(5−7)2≈2.24 → 分配给簇2;
-
D D D到 c 1 c_1 c1的距离≈7.81;到 c 2 c_2 c2的距离: 0 0 0 → 分配给簇2;
-
E E E到 c 1 c_1 c1的距离: ( 8 − 1 ) 2 + ( 6 − 2 ) 2 ≈ 8.06 \sqrt{(8-1)^2+(6-2)^2}≈8.06 (8−1)2+(6−2)2≈8.06;到 c 2 c_2 c2的距离: ( 8 − 7 ) 2 + ( 6 − 7 ) 2 ≈ 1.41 \sqrt{(8-7)^2+(6-7)^2}≈1.41 (8−7)2+(6−7)2≈1.41 → 分配给簇2。
-
当前簇划分:
簇1: { A , B } \{A, B\} {A,B},簇2: { C , D , E } \{C, D, E\} {C,D,E}
3.4 步骤3:更新簇中心
根据簇内样本的均值重新计算簇中心:
-
簇1新中心 c 1 ′ c_1' c1′:
x x x坐标: 1 + 2 2 = 1.5 \frac{1+2}{2}=1.5 21+2=1.5, y y y坐标: 2 + 1 2 = 1.5 \frac{2+1}{2}=1.5 22+1=1.5 → c 1 ′ = ( 1.5 , 1.5 ) c_1'=(1.5, 1.5) c1′=(1.5,1.5); -
簇2新中心 c 2 ′ c_2' c2′:
x x x坐标: 6 + 7 + 8 3 = 7 \frac{6+7+8}{3}=7 36+7+8=7, y y y坐标: 5 + 7 + 6 3 = 6 \frac{5+7+6}{3}=6 35+7+6=6 → c 2 ′ = ( 7 , 6 ) c_2'=(7, 6) c2′=(7,6)。
3.5 步骤4:再次分配样本(判断是否收敛)
使用新簇中心重新计算距离并分配样本:
- A A A到 c 1 ′ c_1' c1′的距离: ( 1 − 1.5 ) 2 + ( 2 − 1.5 ) 2 ≈ 0.71 \sqrt{(1-1.5)^2+(2-1.5)^2}≈0.71 (1−1.5)2+(2−1.5)2≈0.71;到 c 2 ′ c_2' c2′的距离≈7.81 → 仍属于簇1;
- B B B到 c 1 ′ c_1' c1′的距离: ( 2 − 1.5 ) 2 + ( 1 − 1.5 ) 2 ≈ 0.71 \sqrt{(2-1.5)^2+(1-1.5)^2}≈0.71 (2−1.5)2+(1−1.5)2≈0.71;到 c 2 ′ c_2' c2′的距离≈7.81 → 仍属于簇1;
- C C C到 c 1 ′ c_1' c1′的距离≈5.83;到 c 2 ′ c_2' c2′的距离: ( 6 − 7 ) 2 + ( 5 − 6 ) 2 ≈ 1.41 \sqrt{(6-7)^2+(5-6)^2}≈1.41 (6−7)2+(5−6)2≈1.41 → 仍属于簇2;
- ( D 、 E D、E D、E分配结果不变)。
簇划分未变化,且簇中心变化量( c 1 c_1 c1到 c 1 ′ c_1' c1′的距离≈0.71, c 2 c_2 c2到 c 2 ′ c_2' c2′的距离=1)可接受,算法收敛。
最终聚类结果
- 簇1: { A , B } \{A, B\} {A,B}(左下角密集样本);
- 簇2: { C , D , E } \{C, D, E\} {C,D,E}(右上角密集样本),符合数据的自然分布。
四、聚类任务的评估指标分析
在聚类分析中,需借助量化指标评估不同簇数量(K值)下的聚类质量,以下结合生成的随机数据及可视化结果,保留数学公式与计算逻辑,解读常用指标的含义与分析过程。
聚类示意图:
评估指标折线图:
4.1 误差平方和(SSE)
-
定义与公式:
所有样本到其所属簇中心的距离平方和,反映簇内样本的紧凑程度。公式为:
SSE = ∑ j = 1 K ∑ x ∈ C j d ( x , c j ) 2 \text{SSE} = \sum_{j=1}^K \sum_{x \in C_j} d(x, c_j)^2 SSE=j=1∑Kx∈Cj∑d(x,cj)2
其中, K K K为簇数量, C j C_j Cj为第 j j j个簇的样本集合, c j c_j cj为第 j j j个簇的中心, d ( x , c j ) d(x, c_j) d(x,cj)为样本 x x x到簇中心 c j c_j cj的欧式距离。 -
计算逻辑:
对每个样本,计算其到所属簇中心的欧式距离并平方,所有样本的该值求和即为SSE。 -
图片解读:
观察“SSE折线图”,横轴为K值(簇数量),纵轴为SSE值。随着K增大,SSE呈现单调递减趋势——K越小,样本被迫“挤”进少数簇,簇内距离大,SSE高;K越大,簇划分越细,样本更贴近簇中心,SSE低(极端情况K等于样本数时,每个样本为一个簇,SSE趋近于0)。实际分析中,需找**“拐点”**判断最优K:当K增加到某一值后,SSE下降幅度突然变缓(如K=7~8后),说明继续增大K对簇内紧凑度提升有限,此K值可平衡聚类效果与复杂度。
4.2 肘方法(Elbow Method)
-
原理与公式:
基于SSE曲线的“拐点”筛选最优K,核心逻辑是判断SSE下降率的变化。拐点处满足:
拐点后SSE下降率 ≪ 拐点前SSE下降率 \text{拐点后SSE下降率} \ll \text{拐点前SSE下降率} 拐点后SSE下降率≪拐点前SSE下降率 -
图片解读:
从SSE折线图看,K较小时(如K=25)曲线陡峭下降(SSE下降率大),说明增加K能大幅降低簇内距离;当K增大到78后,曲线逐渐平缓(SSE下降率骤减),形成“肘形”拐点。结合业务需求,若追求高效聚类,可选择拐点对应的K值(如K=6~8),既保证簇内紧凑(SSE较低),又避免过度细分(计算复杂度与过拟合风险可控)。
4.3 轮廓系数(Silhouette Coefficient,SC)
-
定义与公式:
综合衡量样本的簇内凝聚度(同簇样本的平均距离,越小越好)与簇间分离度(样本到最近异簇的平均距离,越大越好),公式为:
s i = b i − a i max ( a i , b i ) s_i = \frac{b_i - a_i}{\max(a_i, b_i)} si=max(ai,bi)bi−ai
其中, a i a_i ai为样本 i i i的簇内平均距离(同簇其他样本到 i i i的平均距离), b i b_i bi为样本 i i i到最近异簇的平均距离。整体SC为所有样本 s i s_i si的均值,取值范围 [ − 1 , 1 ] [-1, 1] [−1,1],值越接近1聚类效果越优。 -
计算逻辑:
- 对每个样本 i i i,计算 a i a_i ai(同簇其他样本到 i i i的距离均值);
- 计算 b i b_i bi(最近异簇所有样本到 i i i的距离均值);
- 按公式计算 s i s_i si,再求所有样本的平均SC。
-
图片解读:
SC折线图中,横轴为K值,纵轴为所有样本的平均SC。观察曲线:- K较小时(如K=2~4),SC逐步上升,说明簇划分更合理,样本的簇内凝聚( a i a_i ai减小)与簇间分离( b i b_i bi增大)平衡度提升;
- K在7~9附近达到峰值(SC最高),此时聚类效果最优——样本在簇内更紧密( a i a_i ai小)、与其他簇更分离( b i b_i bi大), b i − a i max ( a i , b i ) \frac{b_i - a_i}{\max(a_i, b_i)} max(ai,bi)bi−ai值更大;
- K继续增大(如K≥10),SC下降,因过度细分导致簇间差异模糊( b i b_i bi减小),部分样本被错误分配( a i a_i ai增大),聚类质量降低。
4.4 Calinski-Harabasz指数(CH指数)
-
定义与公式:
通过簇间离散度(SSB,越大说明簇间差异越显著)与簇内离散度(SSW,越小说明簇内越集中)的比值评估,公式为:
CH = SSB / ( K − 1 ) SSW / ( n − K ) \text{CH} = \frac{\text{SSB}/(K-1)}{\text{SSW}/(n-K)} CH=SSW/(n−K)SSB/(K−1)
其中:- SSB = ∑ j = 1 K n j ⋅ d ( c j , c ˉ ) 2 \text{SSB} = \sum_{j=1}^K n_j \cdot d(c_j, \bar{c})^2 SSB=∑j=1Knj⋅d(cj,cˉ)2( n j n_j nj为第 j j j个簇的样本数, c j c_j cj为第 j j j个簇的中心, c ˉ \bar{c} cˉ为全局中心, d ( c j , c ˉ ) d(c_j, \bar{c}) d(cj,cˉ)为簇中心到全局中心的欧式距离);
- SSW = SSE \text{SSW} = \text{SSE} SSW=SSE(即误差平方和);
- n n n为总样本数, K K K为簇数量。
-
计算逻辑:
- 计算全局中心 c ˉ \bar{c} cˉ(所有样本的特征均值);
- 计算每个簇的 SSB \text{SSB} SSB贡献( n j ⋅ d ( c j , c ˉ ) 2 n_j \cdot d(c_j, \bar{c})^2 nj⋅d(cj,cˉ)2),求和得总 SSB \text{SSB} SSB;
- 计算 SSW \text{SSW} SSW(即SSE);
- 按公式计算CH指数,值越大聚类质量越好。
-
图片解读:
CH折线图中,横轴为K值,纵轴为CH指数。分析曲线:- K较小时(如K=2~6),CH指数缓慢上升但整体偏低,因簇数量少,簇间差异未充分体现( SSB \text{SSB} SSB小);
- K在7~8附近出现明显峰值,此时簇间离散度大( SSB \text{SSB} SSB大)、簇内离散度小( SSW \text{SSW} SSW小), SSB / ( K − 1 ) SSW / ( n − K ) \frac{\text{SSB}/(K-1)}{\text{SSW}/(n-K)} SSW/(n−K)SSB/(K−1)值更大,聚类结构清晰;
- K继续增大(如K≥9),CH指数回落,因过度细分导致簇间差异被削弱( SSB \text{SSB} SSB减小),指标反映聚类质量下降。
4.5 演示代码
# 1.导包
from sklearn.datasets import make_blobs # 用于生成模拟聚类数据的工具
import matplotlib.pyplot as plt # 数据可视化库
from sklearn.cluster import KMeans # K均值聚类算法
from sklearn.metrics import silhouette_score, calinski_harabasz_score # 聚类评估指标
# 导入calinski_harabasz_score包 - 用于计算CH指数评估聚类质量
# 导入silhouette_score包 - 用于计算轮廓系数评估聚类质量
# 2.生成随机数据
# 创建400个样本,每个样本8个特征,分为8个簇,簇内标准差0.8,随机种子44确保结果可复现
X, y = make_blobs(n_samples=400, n_features=8,
centers=8,
cluster_std=0.8, random_state=44)
# 3.展示原始散点图
plt.scatter(X[:, 0], X[:, 1]) # 绘制所有样本的前两个特征(仅可视化二维投影)
plt.show() # 显示图形
# 4.使用KMeans算法进行聚类
km_model = KMeans(n_clusters=8) # 初始化KMeans模型,指定8个簇
y_pre = km_model.fit_predict(X) # 拟合模型并预测聚类结果
# 5.展示聚类结果
# 绘制散点图,根据聚类结果着色,点大小50,使用viridis色图
plt.scatter(X[:, 0], X[:, 1], c=y_pre, s=50, cmap='viridis')
plt.show() # 显示聚类结果图
print(km_model.inertia_) # 打印SSE(误差平方和),评估聚类紧密程度
# 计算不同K值下的评估指标
sse_list = [] # 存储SSE值
sc_list = [] # 存储轮廓系数值
ch_list = [] # 存储CH指数值
# 遍历K值从2到20
for i in range(2, 21):
km_model = KMeans(n_clusters=i, random_state=44) # 初始化KMeans模型
km_model.fit(X) # 拟合模型
pre = km_model.predict(X) # 预测聚类结果
sse_list.append(km_model.inertia_) # 记录SSE(簇内误差平方和)
sc_list.append(silhouette_score(X, pre)) # 计算并记录轮廓系数
ch_list.append(calinski_harabasz_score(X, pre)) # 计算并记录CH指数
# 绘图
# 创建一个12×8英寸的画布
fig = plt.figure(figsize=(12, 8))
# 绘制SSE折线图(3行1列的第1个子图)
fig.add_subplot(311)
plt.plot(range(2, 21), sse_list) # 横轴K值,纵轴SSE
plt.xlabel('k') # X轴标签
plt.ylabel('sse') # Y轴标签
plt.title('sse折线图') # 图表标题
# 绘制轮廓系数折线图(3行1列的第2个子图)
fig.add_subplot(312)
plt.plot(range(2, 21), sc_list) # 横轴K值,纵轴轮廓系数
plt.xlabel('k') # X轴标签
plt.ylabel('sc') # Y轴标签
plt.title('sc折线图') # 图表标题
# 绘制CH指数折线图(3行1列的第3个子图)
fig.add_subplot(313)
plt.plot(range(2, 21), ch_list) # 横轴K值,纵轴CH指数
plt.xlabel('k') # X轴标签
plt.ylabel('ch') # Y轴标签
plt.title('ch折线图') # 图表标题
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 确保负号正确显示
plt.show() # 显示所有图表
五、Sklearn中Kmeans的相关API
Sklearn的sklearn.cluster.KMeans
类提供了Kmeans的高效实现,以下是核心参数、方法及示例。
5.1 KMeans
类(from sklearn.cluster import KMeans
)
KMeans
是 scikit-learn 中实现 K-均值聚类算法的核心类,用于将数据集划分为指定数量的簇,使同一簇内样本相似度高、不同簇间样本差异大,以下按参数、方法、属性分类详解:
- 核心参数(初始化时配置聚类行为)
参数名 | 含义与详细说明 | 默认值及特殊说明 |
---|---|---|
n_clusters | 要生成的簇的数量(K值),必选参数。需结合业务需求(如用户分群数)或通过肘部法、轮廓系数等指标确定合理值 | 无默认,必须手动设置(如 n_clusters=3 ) |
n_init | 初始化簇中心的随机次数。K-均值对初始簇中心敏感,多次初始化后取最优结果(SSE最小),平衡稳定性和计算成本 | 默认 10 ,若计算资源充足可增大(如 n_init=20 ) |
max_iter | 单次聚类迭代的最大步数。迭代过程中不断更新簇中心,若达到该次数仍未收敛则强制停止 | 默认 300 ,数据量大或簇复杂时可适当增大 |
tol | 收敛阈值。当连续两次迭代中,所有簇中心的变化量(欧式距离)都小于该值时,认为算法收敛并停止迭代 | 默认 1e-4 (0.0001),对精度要求高可减小 |
random_state | 随机种子,用于控制初始簇中心的随机选择。设置固定值可让实验结果可复现,方便调试和对比不同参数效果 | 无默认(不设置时每次结果可能不同),建议设置(如 random_state=42 ) |
algorithm | 选择用于计算的优化算法,可选 'auto' (自动根据数据规模选)、'full' (经典 K-均值)、'elkan' (针对欧式距离优化) | 默认 'auto' ,数据量大时 'elkan' 效率更高 |
- 主要方法(训练模型、预测标签等操作)
方法名 | 作用与详细说明 | 入参、出参示例 |
---|---|---|
fit(X) | 用特征矩阵 X 训练 K-均值模型,计算出最终的簇中心。X 需是二维数组,形状为 [n_samples, n_features] | kmeans.fit(X) ,无返回值,训练后模型存储簇中心等信息 |
predict(X) | 对新的特征矩阵 X (可为训练数据或新数据)预测样本所属的簇标签,返回每个样本对应的簇索引(从 0 开始) | labels = kmeans.predict(X) ,labels 是一维数组 |
fit_predict(X) | 等价于先 fit(X) 训练模型,再 predict(X) 预测标签,一步完成训练和预测,返回训练样本的簇标签 | labels = kmeans.fit_predict(X) |
transform(X) | 将样本 X 转换为到各簇中心的距离矩阵,形状为 [n_samples, n_clusters] ,可用于后续降维、分析样本与簇的关系 | distances = kmeans.transform(X) |
score(X) | 返回负的 SSE(误差平方和),值越小表示聚类效果越好(因内部优化目标是最小化 SSE,所以返回负值方便排序对比) | score = kmeans.score(X) ,score 是浮点数 |
- 结果属性(训练后查看聚类结果、指标)
属性名 | 含义与详细说明 | 用法示例 |
---|---|---|
cluster_centers_ | 训练后得到的簇中心坐标,形状为 [n_clusters, n_features] ,每行代表一个簇中心在各特征维度上的值 | centers = kmeans.cluster_centers_ |
labels_ | 训练样本对应的簇标签,一维数组,长度为 n_samples ,每个元素是样本所属簇的索引 | labels = kmeans.labels_ |
inertia_ | 所有样本到其所属簇中心的距离平方和(SSE),是 K-均值算法的优化目标,值越小说明簇内样本越紧凑 | sse = kmeans.inertia_ |
n_iter_ | 实际迭代收敛所用的步数,若远小于 max_iter ,说明数据易收敛;若接近 max_iter ,可能需调整 tol 或 max_iter | iter_num = kmeans.n_iter_ |
- 适用场景与优缺点
- 适用场景:数据分布相对规整(如球形簇)、对聚类效率要求较高、需快速探索数据粗粒度划分的场景(如用户初步分群、简单图像分割)。
- 优点:原理简单易懂,计算效率较高(尤其是处理中低维度、样本量适中的数据),聚类结果可解释性强(簇中心直观反映簇的特征)。
- 缺点:对初始簇中心敏感(
n_init
可缓解但无法完全消除),只能发现球形簇结构,对非凸形状(如环形、月牙形)数据聚类效果差,需预先指定 K 值(难确定最优值)。
5.2 聚类评估指标 API
-
silhouette_score
(from sklearn.metrics import silhouette_score
)
用于计算轮廓系数,综合衡量聚类结果的簇内凝聚度和簇间分离度,评估聚类质量。-
计算逻辑与公式:
对每个样本 i i i,计算:- 簇内平均距离 a i a_i ai:样本 i i i 与同簇其他所有样本的平均欧式距离(值越小,簇内越紧凑);
- 最近异簇平均距离
b
i
b_i
bi:样本
i
i
i 与距离最近的其他簇所有样本的平均欧式距离(值越大,簇间越分离);
单个样本的轮廓系数: s i = b i − a i max ( a i , b i ) s_i = \frac{b_i - a_i}{\max(a_i, b_i)} si=max(ai,bi)bi−ai;
整体轮廓系数为所有样本 s i s_i si 的均值,取值范围 [ − 1 , 1 ] [-1, 1] [−1,1],越接近 1 表示聚类效果越好,负值说明样本可能被错误分配到簇。
-
函数参数与用法:
-
silhouette_score(X, labels, metric='euclidean', ...)
- `X`:特征矩阵(二维数组,`[n_samples, n_features]`);
- `labels`:样本对应的簇标签(一维数组,长度 `n_samples`);
- `metric`:距离度量方式,默认 `'euclidean'`(欧式距离),也可选 `'manhattan'`(曼哈顿距离)等;
- 返回值:浮点数,整体轮廓系数。
- **适用场景与意义**:
用于对比不同 K 值或不同聚类算法的效果,辅助选择最优聚类方案。若轮廓系数低,需检查簇数量是否合理、数据是否需预处理(如去异常值)。
-
calinski_harabasz_score
(from sklearn.metrics import calinski_harabasz_score
)
计算Calinski-Harabasz 指数(CH 指数),通过簇间离散度与簇内离散度的比值评估聚类质量。- 函数参数与用法:
calinski_harabasz_score(X, labels)
-
X
:特征矩阵(二维数组,[n_samples, n_features]
); -
labels
:样本对应的簇标签(一维数组,长度n_samples
); -
返回值:浮点数,CH 指数。
-
适用场景与意义:
适合对比不同聚类算法或不同 K 值的效果,尤其在数据量较大、需快速筛选聚类方案时常用。若 CH 指数低,可能是簇数量不合理或数据分布复杂需换算法(如 DBSCAN 处理非凸数据)。
5.3 实际应用示例补充说明
在之前的完整示例代码中:
# 聚类(假设已知K=4)
kmeans = KMeans(n_clusters=4, random_state=42) # 初始化模型,指定4个簇、固定随机种子
labels = kmeans.fit_predict(X) # 训练+预测,得到每个样本的簇标签
# 评估聚类效果
print(f"轮廓系数:{silhouette_score(X, labels):.2f}") # 传入特征矩阵和标签,计算并打印轮廓系数
print(f"CH指数:{calinski_harabasz_score(X, labels):.2f}") # 传入特征矩阵和标签,计算并打印CH指数
KMeans
初始化时,n_clusters=4
是根据数据预设的簇数量,实际应结合肘部法(看 SSE 曲线拐点)、轮廓系数、CH 指数等指标调整;silhouette_score
和calinski_harabasz_score
需传入训练好的簇标签labels
和原始特征X
,通过对比不同 K 值下的指标,能找到更优聚类方案(如循环尝试 K=2 到 K=10,选指标最高的 K)。
通过理解这些 API 的参数、原理和用法,就能灵活运用 K-均值聚类及评估指标,解决实际无监督分类、数据探索问题啦,无论是分析用户行为分群,还是处理图像像素聚类,都能清晰把控聚类质量~