Kmeams聚类算法详解


一、聚类任务的简介

聚类是机器学习中一类重要的无监督学习任务,其核心目标是在没有预设标签的情况下,通过分析样本间的内在相似性,将数据集自动划分为若干个具有共同特征的“簇”(Cluster)。

1.1 聚类的核心特征

  • 无监督性:无需人工标注训练数据的类别标签,完全依赖数据自身的特征分布进行划分;
  • 相似性度量:通过距离(如欧式距离、曼哈顿距离)或相似度(如余弦相似度)判断样本关联程度,距离越小则样本越相似;
  • 簇内一致性:同一簇内的样本应具有较高的相似度,不同簇间的样本应具有显著差异。

1.2 聚类的典型应用场景

  • 用户分群:根据消费习惯、浏览行为等特征将用户划分为不同群体,支撑精准营销;
  • 异常检测:远离所有簇的样本可能是异常值(如信用卡欺诈交易、设备故障数据);
  • 数据降维与可视化:将高维数据聚成少数簇,简化分析复杂度;
  • 生物学研究:对基因表达数据聚类,发现功能相似的基因族群。

聚类算法种类繁多,其中Kmeans因原理简单、计算高效,成为实际应用中最广泛的聚类方法之一。


二、Kmeans的思想和数学原理

2.1 核心思想

Kmeans算法(K-均值聚类)的核心思想是:通过迭代优化K个簇中心,使每个样本被分配到距离最近的簇,最终实现“簇内样本紧凑、簇间样本分散”的目标

通俗来说,Kmeans就像“物以类聚”的过程:先随机选择K个“种子”(初始簇中心),然后让每个样本“投靠”最近的种子,再根据投靠的样本重新计算新的种子位置,重复此过程直到种子位置不再变化。

2.2 数学原理

  1. 距离度量
    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=1d(xici)2

  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=1KxCjd(x,cj)2
    其中:

    • K K K为预设的簇数量;
    • C j C_j Cj表示第 j j j个簇包含的样本集合;
    • c j c_j cj表示第 j j j个簇的中心(由簇内样本的均值计算得到)。
  3. 簇中心更新规则
    当样本分配完成后,每个簇的中心通过簇内所有样本的特征均值更新,公式为:
    c j = 1 ∣ C j ∣ ∑ x ∈ C j x c_j = \frac{1}{|C_j|} \sum_{x \in C_j} x cj=Cj1xCjx
    其中 ∣ C j ∣ |C_j| Cj为第 j j j个簇的样本数量。

  4. 迭代收敛条件
    算法通过反复执行“样本分配→更新簇中心”过程实现优化,当满足以下条件之一时停止迭代:

    • 簇中心的变化量小于预设阈值(如 1 0 − 4 10^{-4} 104);
    • 达到最大迭代次数(避免无限循环)。

三、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 (17)2+(27)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 (21)2+(12)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 (27)2+(17)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 (61)2+(52)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 (67)2+(57)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 (81)2+(62)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 (87)2+(67)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 (11.5)2+(21.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 (21.5)2+(11.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 (67)2+(56)2 1.41 → 仍属于簇2;
  • D 、 E D、E DE分配结果不变)。

簇划分未变化,且簇中心变化量( 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=1KxCjd(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)biai
    其中, 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聚类效果越优。

  • 计算逻辑

    1. 对每个样本 i i i,计算 a i a_i ai(同簇其他样本到 i i i的距离均值);
    2. 计算 b i b_i bi(最近异簇所有样本到 i i i的距离均值);
    3. 按公式计算 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)biai值更大;
    • 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/(nK)SSB/(K1)
    其中:

    • 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=1Knjd(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为簇数量。
  • 计算逻辑

    1. 计算全局中心 c ˉ \bar{c} cˉ(所有样本的特征均值);
    2. 计算每个簇的 SSB \text{SSB} SSB贡献( n j ⋅ d ( c j , c ˉ ) 2 n_j \cdot d(c_j, \bar{c})^2 njd(cj,cˉ)2),求和得总 SSB \text{SSB} SSB
    3. 计算 SSW \text{SSW} SSW(即SSE);
    4. 按公式计算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/(nK)SSB/(K1)值更大,聚类结构清晰;
    • 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-均值聚类算法的核心类,用于将数据集划分为指定数量的簇,使同一簇内样本相似度高、不同簇间样本差异大,以下按参数、方法、属性分类详解:

  1. 核心参数(初始化时配置聚类行为)
参数名含义与详细说明默认值及特殊说明
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' 效率更高
  1. 主要方法(训练模型、预测标签等操作)
方法名作用与详细说明入参、出参示例
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 是浮点数
  1. 结果属性(训练后查看聚类结果、指标)
属性名含义与详细说明用法示例
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,可能需调整 tolmax_iteriter_num = kmeans.n_iter_
  1. 适用场景与优缺点
    • 适用场景:数据分布相对规整(如球形簇)、对聚类效率要求较高、需快速探索数据粗粒度划分的场景(如用户初步分群、简单图像分割)。
    • 优点:原理简单易懂,计算效率较高(尤其是处理中低维度、样本量适中的数据),聚类结果可解释性强(簇中心直观反映簇的特征)。
    • 缺点:对初始簇中心敏感(n_init 可缓解但无法完全消除),只能发现球形簇结构,对非凸形状(如环形、月牙形)数据聚类效果差,需预先指定 K 值(难确定最优值)。

5.2 聚类评估指标 API

  1. silhouette_scorefrom 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)biai
        整体轮廓系数为所有样本 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 值或不同聚类算法的效果,辅助选择最优聚类方案。若轮廓系数低,需检查簇数量是否合理、数据是否需预处理(如去异常值)。

  1. calinski_harabasz_scorefrom 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_scorecalinski_harabasz_score 需传入训练好的簇标签 labels 和原始特征 X,通过对比不同 K 值下的指标,能找到更优聚类方案(如循环尝试 K=2 到 K=10,选指标最高的 K)。

通过理解这些 API 的参数、原理和用法,就能灵活运用 K-均值聚类及评估指标,解决实际无监督分类、数据探索问题啦,无论是分析用户行为分群,还是处理图像像素聚类,都能清晰把控聚类质量~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值