机器学习_05_k-means算法

详解 k-Means 算法

一、概念

k-Means 是一种无监督学习的聚类算法,用于将数据划分为 k 个互不重叠的簇 (clusters)。 其核心思想是:通过迭代优化,将样本分配到最近的簇中心(质心),并更新质心位置,直到收敛。

复制代码
from sklearn.cluster import KMeans

二、底层流程

  1. 随机初始化:从数据中随机选 K 个点作为初始质心

  2. 分配样本:计算每个样本到所有质心的距离,分给最近的质心所属的簇

  3. 更新质心:对每个簇,计算簇内所有样本的均值,作为新的质心

  4. 重复 2、3 步:直到质心不再变化

注意:质心是向量空间里的一个坐标点,不要求恰好有一个样本在那里。


三、聚类评估方法

1. SSE(误差平方和)

  • 所有样本到其质心的距离平方和

  • SSE 越小 → 簇内越紧密 → 效果越好

  • 但 K 越大 SSE 一定越小(K=样本数时 SSE=0)

  • 肘方法:找 SSE 突然变缓的拐点

2. SC(轮廓系数)

  • 取值范围:[-1, 1]

    • 越接近 1 → 效果好

    • 接近 0 → 在边界上

    • 为负 → 可能分错簇

  • 越大越好

3. CH(Calinski-Harabasz 指数)

  • CH = (簇间离散度) / (簇内离散度)

  • CH 越大 → 簇间越分散,簇内越紧密 → 效果好

  • 越大越好

python

复制代码
# 示例代码
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, calinski_harabasz_score
​
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
sse = kmeans.inertia_
sc = silhouette_score(X, labels)
ch = calinski_harabasz_score(X, labels)

四、优缺点与适用场景

优点

  • 简单直观,容易理解

  • 速度快,适合大数据集

  • 可解释性强(质心可以直接看)

  • 只要指定 K,就能自动聚类

缺点

  • 必须事先指定 K(通常不知道)

  • 对初始质心敏感(不同初始化可能结果不同)

  • 只能发现球形簇(无法处理复杂形状,如同心圆、细长条)

  • 对异常值敏感(离群点会拉偏质心)

  • 假设各簇大小、密度相近(不均匀时效果差)

适用场景

场景 说明
✅ 客户分群 电商、银行用户画像
✅ 图像压缩 颜色量化
✅ 数据预处理 先聚类再分类
✅ 文档主题划分 文本聚类
✅ 球形数据 数据分布近似球形,簇大小相近

五、面试回答(总分总结构)

k-Means 是一种无监督学习的聚类算法,用于将数据划分为 k 个互不重叠的簇。其核心思想是通过迭代优化,将样本分配到最近的簇中心(质心),并更新质心位置,直到收敛。

工作原理(四步循环):

  1. 随机初始化 K 个质心

  2. 把每个样本分配给离它最近的质心,形成 K 个簇

  3. 对每个簇,计算簇内所有样本的平均值,作为新的质心

  4. 重复直到质心不变

K 值怎么选:

  • 肘方法(看 SSE 拐点)

  • 轮廓系数(SC 越大越好)

  • CH 指数(越大越好)

  • 通常结合肘方法和轮廓系数一起判断

优缺点: 优点是简单、快、可解释;缺点是需要事先指定 K,对初始值敏感,只能发现球形簇。

与监督学习的区别: 聚类没有标签,只看数据本身的相似性。分类是有标签的监督学习,聚类是无监督的探索性分析。

k-Means 是聚类任务的入门算法,适合数据分布近似圆形、簇大小相近的场景。不确定 K 值时用肘方法和轮廓系数辅助判断。


六、快速记忆口诀

随机选心,近者归队,队内求均,重复至稳。 肘看拐点,轮看系数,球状数据,k 值先估。

相关推荐
happymaker06264 小时前
LeetCodeHot100——1.两数之和(详细解答)
java·数据结构·学习·算法
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第60题】【JVM篇】第20题:垃圾收集算法和垃圾收集器有什么区别?
java·jvm·算法·面试
@ray3214 小时前
LeetCode Hot 100 — C++ 题解
c++·算法·leetcode
大模型最新论文速读4 小时前
利用异步编程的 future 思想,让 LLM Agent 快 1.44 倍
人工智能·深度学习·算法·机器学习·自然语言处理
Bingorl4 小时前
机器学习之线性回归算法
算法·机器学习·线性回归
kobesdu4 小时前
反光柱定位算法实战02:纯反光柱定位——VEnus算法实际使用与代码原理综述
算法·slam·定位·反光柱
无限进步_4 小时前
【C++】用哈希表封装自己的 unordered_map 和 unordered_set
开发语言·数据结构·c++·算法·哈希算法·散列表·visual studio
Brilliantwxx6 小时前
【C++】 继承与多态(中)
开发语言·c++·笔记·算法
一个王同学12 小时前
从零到一 | CV转多模态大模型 | week09 | Minillava Refactor结合手搓和llava源码深入理解多模态大模型原理
人工智能·深度学习·机器学习·计算机视觉·改行学it