当前位置: 首页 > news >正文

Kmeams聚类算法详解

文章目录

    • 一、聚类任务的简介
      • 1.1 聚类的核心特征
      • 1.2 聚类的典型应用场景
    • 二、Kmeans的思想和数学原理
      • 2.1 核心思想
      • 2.2 数学原理
    • 三、Kmeans计算过程示例
      • 3.1 数据集
      • 3.2 步骤1:确定K值并初始化簇中心
      • 3.3 步骤2:计算样本到簇中心的距离并分配簇
      • 3.4 步骤3:更新簇中心
      • 3.5 步骤4:再次分配样本(判断是否收敛)
    • 四、聚类任务的评估指标分析
      • 4.1 误差平方和(SSE)
      • 4.2 肘方法(Elbow Method)
      • 4.3 轮廓系数(Silhouette Coefficient,SC)
      • 4.4 Calinski-Harabasz指数(CH指数)
      • 4.5 演示代码
    • 五、Sklearn中Kmeans的相关API
      • 5.1 `KMeans` 类(`from sklearn.cluster import KMeans`)
      • 5.2 聚类评估指标 API
      • 5.3 实际应用示例补充说明


一、聚类任务的简介

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

1.1 聚类的核心特征

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

1.2 聚类的典型应用场景

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

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


二、Kmeans的思想和数学原理

2.1 核心思想

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

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

2.2 数学原理

  1. 距离度量
    Kmeans采用欧式距离衡量样本与簇中心的相似度。对于d维特征空间中的样本x=(x1,x2,...,xd)x=(x_1,x_2,...,x_d)x=(x1,x2,...,xd)和簇中心c=(c1,c2,...,cd)c=(c_1,c_2,...,c_d)c=(c1,c2,...,cd),欧式距离公式为:
    d(x,c)=∑i=1d(xi−ci)2d(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=1K∑x∈Cjd(x,cj)2\min \quad J = \sum_{j=1}^K \sum_{x \in C_j} d(x, c_j)^2minJ=j=1KxCjd(x,cj)2
    其中:

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

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

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

三、Kmeans计算过程示例

以一个简单的二维数据集为例,详细演示Kmeans的聚类步骤(取K=2K=2K=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=2K=2K=2(目标是将数据分为2个簇);
  • 随机选择2个样本作为初始簇中心:
    c1=A(1,2)c_1 = A(1, 2)c1=A(1,2)(簇1的初始中心),c2=D(7,7)c_2 = D(7, 7)c2=D(7,7)(簇2的初始中心)。

3.3 步骤2:计算样本到簇中心的距离并分配簇

分别计算每个样本到c1c_1c1c2c_2c2的欧式距离,将样本分配给距离更近的簇:

  • AAAc1c_1c1的距离:d(A,c1)=0d(A,c_1)=0d(A,c1)=0;到c2c_2c2的距离:(1−7)2+(2−7)2≈7.81\sqrt{(1-7)^2+(2-7)^2}≈7.81(17)2+(27)27.81 → 分配给簇1;

  • BBBc1c_1c1的距离:(2−1)2+(1−2)2≈1.41\sqrt{(2-1)^2+(1-2)^2}≈1.41(21)2+(12)21.41;到c2c_2c2的距离:(2−7)2+(1−7)2≈7.81\sqrt{(2-7)^2+(1-7)^2}≈7.81(27)2+(17)27.81 → 分配给簇1;

  • CCCc1c_1c1的距离:(6−1)2+(5−2)2≈5.83\sqrt{(6-1)^2+(5-2)^2}≈5.83(61)2+(52)25.83;到c2c_2c2的距离:(6−7)2+(5−7)2≈2.24\sqrt{(6-7)^2+(5-7)^2}≈2.24(67)2+(57)22.24 → 分配给簇2;

  • DDDc1c_1c1的距离≈7.81;到c2c_2c2的距离:000 → 分配给簇2;

  • EEEc1c_1c1的距离:(8−1)2+(6−2)2≈8.06\sqrt{(8-1)^2+(6-2)^2}≈8.06(81)2+(62)28.06;到c2c_2c2的距离:(8−7)2+(6−7)2≈1.41\sqrt{(8-7)^2+(6-7)^2}≈1.41(87)2+(67)21.41 → 分配给簇2。

  • 当前簇划分
    簇1:{A,B}\{A, B\}{A,B},簇2:{C,D,E}\{C, D, E\}{C,D,E}

3.4 步骤3:更新簇中心

根据簇内样本的均值重新计算簇中心:

  • 簇1新中心c1′c_1'c1
    xxx坐标:1+22=1.5\frac{1+2}{2}=1.521+2=1.5yyy坐标:2+12=1.5\frac{2+1}{2}=1.522+1=1.5c1′=(1.5,1.5)c_1'=(1.5, 1.5)c1=(1.5,1.5)

  • 簇2新中心c2′c_2'c2
    xxx坐标:6+7+83=7\frac{6+7+8}{3}=736+7+8=7yyy坐标:5+7+63=6\frac{5+7+6}{3}=635+7+6=6c2′=(7,6)c_2'=(7, 6)c2=(7,6)

3.5 步骤4:再次分配样本(判断是否收敛)

使用新簇中心重新计算距离并分配样本:

  • AAAc1′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)20.71;到c2′c_2'c2的距离≈7.81 → 仍属于簇1;
  • BBBc1′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)20.71;到c2′c_2'c2的距离≈7.81 → 仍属于簇1;
  • CCCc1′c_1'c1的距离≈5.83;到c2′c_2'c2的距离:(6−7)2+(5−6)2≈1.41\sqrt{(6-7)^2+(5-6)^2}≈1.41(67)2+(56)21.41 → 仍属于簇2;
  • D、ED、EDE分配结果不变)。

簇划分未变化,且簇中心变化量(c1c_1c1c1′c_1'c1的距离≈0.71,c2c_2c2c2′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=1K∑x∈Cjd(x,cj)2\text{SSE} = \sum_{j=1}^K \sum_{x \in C_j} d(x, c_j)^2SSE=j=1KxCjd(x,cj)2
    其中,KKK为簇数量,CjC_jCj为第jjj个簇的样本集合,cjc_jcj为第jjj个簇的中心,d(x,cj)d(x, c_j)d(x,cj)为样本xxx到簇中心cjc_jcj的欧式距离。

  • 计算逻辑
    对每个样本,计算其到所属簇中心的欧式距离并平方,所有样本的该值求和即为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)

  • 定义与公式
    综合衡量样本的簇内凝聚度(同簇样本的平均距离,越小越好)与簇间分离度(样本到最近异簇的平均距离,越大越好),公式为:
    si=bi−aimax⁡(ai,bi)s_i = \frac{b_i - a_i}{\max(a_i, b_i)}si=max(ai,bi)biai
    其中,aia_iai为样本iii的簇内平均距离(同簇其他样本到iii的平均距离),bib_ibi为样本iii到最近异簇的平均距离。整体SC为所有样本sis_isi的均值,取值范围[−1,1][-1, 1][1,1],值越接近1聚类效果越优。

  • 计算逻辑

    1. 对每个样本iii,计算aia_iai(同簇其他样本到iii的距离均值);
    2. 计算bib_ibi(最近异簇所有样本到iii的距离均值);
    3. 按公式计算sis_isi,再求所有样本的平均SC。
  • 图片解读
    SC折线图中,横轴为K值,纵轴为所有样本的平均SC。观察曲线:

    • K较小时(如K=2~4),SC逐步上升,说明簇划分更合理,样本的簇内凝聚(aia_iai减小)与簇间分离(bib_ibi增大)平衡度提升;
    • K在7~9附近达到峰值(SC最高),此时聚类效果最优——样本在簇内更紧密(aia_iai小)、与其他簇更分离(bib_ibi大),bi−aimax⁡(ai,bi)\frac{b_i - a_i}{\max(a_i, b_i)}max(ai,bi)biai值更大;
    • K继续增大(如K≥10),SC下降,因过度细分导致簇间差异模糊(bib_ibi减小),部分样本被错误分配(aia_iai增大),聚类质量降低。

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=1Knj⋅d(cj,cˉ)2\text{SSB} = \sum_{j=1}^K n_j \cdot d(c_j, \bar{c})^2SSB=j=1Knjd(cj,cˉ)2njn_jnj为第jjj个簇的样本数,cjc_jcj为第jjj个簇的中心,cˉ\bar{c}cˉ为全局中心,d(cj,cˉ)d(c_j, \bar{c})d(cj,cˉ)为簇中心到全局中心的欧式距离);
    • SSW=SSE\text{SSW} = \text{SSE}SSW=SSE(即误差平方和);
    • nnn为总样本数,KKK为簇数量。
  • 计算逻辑

    1. 计算全局中心cˉ\bar{c}cˉ(所有样本的特征均值);
    2. 计算每个簇的SSB\text{SSB}SSB贡献(nj⋅d(cj,cˉ)2n_j \cdot d(c_j, \bar{c})^2njd(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
    用于计算轮廓系数,综合衡量聚类结果的簇内凝聚度和簇间分离度,评估聚类质量。

    • 计算逻辑与公式
      对每个样本 iii,计算:

      • 簇内平均距离 aia_iai:样本 iii 与同簇其他所有样本的平均欧式距离(值越小,簇内越紧凑);
      • 最近异簇平均距离 bib_ibi:样本 iii 与距离最近的其他簇所有样本的平均欧式距离(值越大,簇间越分离);
        单个样本的轮廓系数:si=bi−aimax⁡(ai,bi)s_i = \frac{b_i - a_i}{\max(a_i, b_i)}si=max(ai,bi)biai
        整体轮廓系数为所有样本 sis_isi 的均值,取值范围 [−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-均值聚类及评估指标,解决实际无监督分类、数据探索问题啦,无论是分析用户行为分群,还是处理图像像素聚类,都能清晰把控聚类质量~

http://www.dtcms.com/a/278840.html

相关文章:

  • CSS手写题
  • 精密模具冷却孔内轮廓检测方法探究 —— 激光频率梳 3D 轮廓检测
  • Redis单线程详解
  • H2 与高斯数据库兼容性解决方案:虚拟表与类型处理
  • Ai问答之空间站星等
  • MMKV 存储json list数据(kotlin)
  • Spring Boot 设置滚动日志logback
  • RocketMq部署模式简介
  • 高斯代数基本定理的一种证明
  • 【论文阅读】Thinkless: LLM Learns When to Think
  • Foundry 私钥管理指南:方法与安全最佳实践
  • 《大数据技术原理与应用》实验报告一 熟悉常用的Linux操作和Hadoop操作
  • PHP password_hash() 函数
  • Fiddler——抓取https接口配置
  • 【解决办法】越疆Dobot CR5 桌面客户端DobotStudio Pro连不上机器人
  • 在Ubuntu系统下使用mpstat工具监控CPU性能
  • 深地之下的智慧触角:Deepoc具身智能如何为矿业机器人铸就“感知之核”
  • CSS3 粘性定位解析:position sticky
  • Go从入门到精通(23) - 一个简单web项目-使用数据库存储数据
  • 解决chrome v2 版本插件不支持
  • 上下文管理器 和 contextlib 模块
  • [硬件电路-22]: 为什么模拟电路信号处理运算的精度不如数字信号处理运算?
  • 《Llava:Visual Instruction Tuning》论文精读笔记
  • 基于Chinese-CLIP与ChromaDB的中文图像检索功能实现
  • 人工智能如何重构能源系统以应对气候变化?
  • 动态规划题解——单词拆分【LeetCode】
  • openEuler系统PCIE降速方法简介
  • 【2025/07/14】GitHub 今日热门项目
  • Self - RAG工作步骤
  • 【HTML】五子棋(精美版)