速通机器学习 11| K-Means 聚类

目录

前言

[一、K-Means 四大基础核心概念](#一、K-Means 四大基础核心概念)

[1. 簇数量 K](#1. 簇数量 K)

[2. 距离度量(衡量样本相似度)](#2. 距离度量(衡量样本相似度))

[3. 簇质心(聚类中心)](#3. 簇质心(聚类中心))

[4. 优化目标:簇内平方和 SSE(损失函数)](#4. 优化目标:簇内平方和 SSE(损失函数))

[二、K-Means 迭代流程](#二、K-Means 迭代流程)

算法终止条件满足其一即可:

三、核心难点:簇质心初始化方法

[1. 传统随机初始化(流程图原始方案)](#1. 传统随机初始化(流程图原始方案))

[2. K-Means++(sklearn 默认优化方案,推荐)](#2. K-Means++(sklearn 默认优化方案,推荐))

[3. 手动自定义初始化](#3. 手动自定义初始化)

[配套参数 n_init](#配套参数 n_init)

[四、如何选择最优 K 值?两大实用方法](#四、如何选择最优 K 值?两大实用方法)

[方法 1:肘部法则(基于 SSE 损失)](#方法 1:肘部法则(基于 SSE 损失))

[方法 2:轮廓系数(量化聚类好坏,核心评价指标)](#方法 2:轮廓系数(量化聚类好坏,核心评价指标))

[1. 单个样本轮廓系数公式](#1. 单个样本轮廓系数公式)

[2. 轮廓系数判定规则](#2. 轮廓系数判定规则)

[六、Sklearn 完整实战代码(全流程:标准化 + 双方法寻K + 模型训练 + 量化评估)](#六、Sklearn 完整实战代码(全流程:标准化 + 双方法寻K + 模型训练 + 量化评估))

代码核心解析与参数说明

KMeans核心参数详解

七、全文总结


前言:什么是聚类?和分类有什么区别?

前面学习的逻辑回归、SVM、随机森林都属于有监督学习 ,训练数据自带标签,模型学习「特征→标签」的映射关系。 而K-Means 是经典无监督聚类算法 ,数据集没有任何标签,算法仅依靠样本特征的相似度,自动把相似样本划分到同一簇,实现 "物以类聚"。

核心区分:

  • 分类:已知类别标签,有标准答案;

  • 聚类:无标签,仅靠数据分布自动分组。

一、K-Means 四大基础核心概念

1. 簇数量 K

人为预先指定的超参数,代表最终要把数据划分成多少组,算法无法自动求解最优 K。

2. 距离度量(衡量样本相似度)

距离越小,两个样本特征越相似,K-Means 默认使用欧式距离 ,同时支持曼哈顿距离。 1)曼哈顿距离(二维样本)

欧式距离(二维样本,算法首选)

3. 簇质心(聚类中心)

单个簇内所有样本各维度特征的算术平均值,作为该簇的代表中心点。 设某簇包含$$$$个样本x_1,x_2,...,x_,质心公式:

4. 优化目标:簇内平方和 SSE(损失函数)

K-Means 迭代全程只为最小化所有样本到自身簇质心的距离平方和,数学公式:

:第i簇质心;:对应簇内样本;SSE 越小,簇内样本越紧凑。

二、K-Means 迭代流程

完整 6 步循环逻辑:

  1. 图 (a) 原始数据:无标签样本自然分为 3 堆;

  2. 图 (b) 初始化质心:选出K个点作为初始簇中心(红色叉号);

  3. 图 (c) 样本分配:计算每个样本到K个质心的欧式距离,归入距离最近的簇;

  4. 图 (d)(e) 更新质心:分别计算每个簇全部样本均值,生成全新簇中心;

  5. 循环迭代:重复「分配样本→更新质心」两步;

  6. 图 (f) 收敛停止:质心位置几乎无偏移 / 达到最大迭代次数,算法结束。

算法终止条件满足其一即可:

  1. 前后两轮所有质心变化量小于极小阈值;

  2. 样本所属簇标签不再发生变动;

  3. 达到预设最大迭代次数(sklearn 默认 300 轮)。

三、核心难点:簇质心初始化方法

初始化直接决定聚类是否收敛到全局最优,共 3 种实现方式:

1. 传统随机初始化(流程图原始方案)

操作:从全部样本中随机不放回抽取$$$$个真实样本作为初始质心。 缺陷:随机性极强,若初始质心距离很近,极易收敛到局部最优 ;抽到离群点会严重破坏聚类结果。 代码写法:init="random"

2. K-Means++(sklearn 默认优化方案,推荐)

解决随机初始化局部最优问题,核心逻辑:让初始质心尽可能相互远离

  1. 随机选取 1 个样本作为第一个质心;

  2. 计算所有样本到已有全部质心的最短距离 d(x;样本被选为下一个质心的概率与成正比,离现有中心越远,选中概率越高;

  3. 循环执行,直到选出K个质心。 优势:收敛更快、聚类结果稳定,工业场景全部默认使用。

3. 手动自定义初始化

业务已知数据分布时,人工输入K组特征向量作为初始中心:

python 复制代码
# 自定义3组初始质心 
init_center = [[1.2,3.5], [5.1,2.2], [2.8,7.4]]

kmeans = KMeans(n_clusters=3, init=init_center)

配套参数 n_init

无论哪种初始化,n_init=10代表程序自动重复 10 次完整聚类,对比每组 SSE 损失,最终输出损失最小的最优结果,进一步削弱初始化随机性带来的误差。

四、如何选择最优 K 值?两大实用方法

K 是人工指定超参数,无法自动求解,业务中结合两种方法综合判断。

方法 1:肘部法则(基于 SSE 损失)

  1. 遍历 K=2,3,4...10,分别训练模型,记录每个 K 对应的 SSE;

  2. K 越大,SSE 一定单调下降;K 过小分组粗糙,K 过大簇被过度拆分;

  3. 绘制 K-SSE 折线图,找到曲线下降速率骤缓的拐点(手肘),拐点对应数值即为推荐 K。

方法 2:轮廓系数(量化聚类好坏,核心评价指标)

1. 单个样本轮廓系数公式

等价分段形式:

变量释义:

  • a(i):样本x_与同簇所有样本的平均距离,代表簇内凝聚度,越小越好;

  • b(i):样本x_到其他任意一簇的最小平均距离,代表簇间分离度,越大越好。

2. 轮廓系数判定规则

  1. 取值范围 数值越接近 1,聚类效果越好

  2. :样本划分合理,簇内紧凑、簇间区分明显;

  3. :样本归属错误,应划分至其他簇;

  4. :样本落在两个簇交界处,簇边界重叠严重。

整体评价标准:计算全部样本轮廓系数平均值,均值越靠近 1,整体聚类质量越高。

六、Sklearn 完整实战代码(全流程:标准化 + 双方法寻K + 模型训练 + 量化评估)

本次实战基于无标签数据集,完整复现K-Means工业建模全流程:数据读取→特征标准化→肘部法则寻参→轮廓系数择优→模型训练→结果评估,代码可直接运行,适配教学与实验场景。

代码核心解析与参数说明

python 复制代码
# 导入所需工具库
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

# 1. 数据读取与特征筛选
# 读取空白分隔符数据集,适配无标签聚类数据
datas = pd.read_table(r'D:\pythoncode2\bigdata_ai40\机械学习\data\data.txt', sep='\s+')
# 剔除无关列,保留纯特征数据
data = datas.iloc[:, 1:]

# 2. 特征标准化(K-Means必备预处理,消除量纲影响)
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

# 3. 肘部法则:遍历K值,基于SSE损失初步筛选最优聚类数
sse_list = []
k_range = range(2, 10)
for k in k_range:
    km = KMeans(n_clusters=k, init="k-means++", n_init=10, random_state=42)
    km.fit(data_scaled)
    sse_list.append(km.inertia_)

# 绘制SSE-K肘部曲线,直观观察拐点
plt.figure(figsize=(8, 4))
plt.plot(k_range, sse_list, 'o-', linewidth=2, color='steelblue')
plt.xlabel("聚类数量 K")
plt.ylabel("簇内平方和 SSE")
plt.title("肘部法则筛选最优K值")
plt.grid(alpha=0.3)
plt.show()

# 4. 轮廓系数精准择优:量化各K值聚类效果,确定全局最优K
best_k = 2
best_score = -1.0
print("===== 各聚类数量轮廓系数评估结果 =====")
for k in k_range:
    km = KMeans(n_clusters=k, init="k-means++", n_init=10, random_state=42)
    cluster_labels = km.fit_predict(data_scaled)
    # 计算整体轮廓系数
    score = silhouette_score(data_scaled, cluster_labels)
    print(f"聚类数={k} | 轮廓系数={score:.4f}")
    # 更新最优聚类参数
    if score > best_score:
        best_score = score
        best_k = k

# 输出最优聚类参数
print("\n===== 最优聚类结果 =====")
print(f"最优聚类数量: {best_k}")
print(f"对应最优轮廓系数: {best_score:.4f}")

# 5. 基于最优K训练最终聚类模型
final_kmeans = KMeans(n_clusters=best_k, init="k-means++", n_init=10, random_state=42)
final_labels = final_kmeans.fit_predict(data_scaled)

# 输出最终模型核心指标
print(f"模型最终SSE损失值: {final_kmeans.inertia_:.4f}")
print("各簇样本数量分布:")
print(pd.Series(final_labels).value_counts().sort_index())

本次优化补齐K-Means建模必备标准化流程,融合肘部法则与轮廓系数双择优方案,贴合工业建模标准,核心要点如下:

  1. 数据预处理:新增标准化操作,彻底解决特征量纲不一致问题,规避大数特征主导距离计算的缺陷,是K-Means建模的必要前提。

  2. 优化初始化策略 :统一采用k-means++优化初始化,搭配n_init=10多次迭代择优,有效避免局部最优解,聚类结果更稳定。

  3. 双维度K值寻优:结合SSE肘部曲线可视化+轮廓系数量化评分,兼顾直观判断与精准数值评估,筛选的K值更贴合数据真实分布。

  4. 结果完整输出:不仅输出最优K值与轮廓系数,同时返回最终模型SSE损失、各簇样本分布,全方位评估聚类质量。

  5. 实验可复现:固定随机种子,所有参数可追溯,适配课程实验、作业报告场景。

KMeans核心参数详解

python 复制代码
KMeans(
    n_clusters=3,      # 核心超参:手动指定聚类簇数量K
    init="k-means++",  # 质心初始化方式:默认优化版,规避局部最优
    n_init=10,         # 重复初始化次数,自动选取SSE最小的最优模型
    max_iter=300,      # 单次训练最大迭代次数,达到上限强制终止
    random_state=42    # 固定随机种子,保证实验结果可复现
)

七、全文总结

  1. K-Means 无监督聚类,核心逻辑:随机初始化质心→分配样本→更新质心,循环至收敛;

  2. 优化目标最小化 SSE,距离默认使用欧式距离;

  3. 初始化优先选择 K-Means++,规避局部最优;

  4. 最优 K 值结合肘部法则 + 轮廓系数综合判定;

  5. 使用前必须标准化数据,仅适合球状分布、中小规模数据集。

相关推荐
罗西的思考3 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
过期的秋刀鱼!11 小时前
带替换的采样
人工智能·python·算法·决策树·机器学习
过期的秋刀鱼!11 小时前
使用多个决策树
人工智能·算法·决策树·机器学习·数据挖掘
databook11 小时前
如何快速构建一个数据科学应用?从零到上线
python·机器学习·scikit-learn
doubt。13 小时前
大模型prompt工程Zero-Shot与Few-Shot以及json格式
人工智能·深度学习·机器学习·语言模型·json·prompt
过期的秋刀鱼!15 小时前
使用都热编码的分类特征
人工智能·算法·决策树·机器学习·分类·数据挖掘
watersink16 小时前
机器学习FM、FFM
人工智能·机器学习
eric-sjq1 天前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html