机器学习进阶(23):K-means聚类

第23篇:K-means 聚类——当数据没有标签时,模型还能学什么

在前面的文章里,我们一直在做一件事:

给模型数据 + 标签,然后让模型学习它们之间的关系。

比如:

预测房价(回归)
判断垃圾邮件(分类)
识别手写数字(分类)

这些任务都有一个共同特点:

数据有答案。

但现实世界里,还有很多情况是这样的:

我们只有数据,没有答案。

比如:

用户行为数据
客户消费数据
网页访问数据
商品浏览路径
评论文本集合

没有人告诉你:

谁属于哪一类

那模型还能学什么?🤔

答案是:

它可以自己发现结构。

这类学习方式叫:

无监督学习(Unsupervised Learning)

而 K-means,就是最经典的入门算法之一。


1. 什么是聚类?

先从最直觉的问题开始。

假设你有一批用户数据:

年龄
收入
消费频率

但你不知道他们属于什么群体。

你只是感觉:

可能有几类人

比如:

学生群体
年轻白领
高收入人群

这时候你希望模型帮你回答一个问题:

这些人自然可以分成几类?

这就是聚类在做的事情:

自动把相似的数据分到同一组里

没有标签
没有答案
只有结构

模型要自己找。

这就是 K-means 的任务。


2. K-means 在做什么?

一句话版本:

K-means 会把数据分成 K 组,让每组内部尽量相似。

关键词是:

组内相似度最大

或者换句话说:

组内距离最小

比如:

下面这些点:

● ● ● ● ▲ ▲ ▲ ▲ ■ ■ ■ ■

你一眼就能看出来:

它们明显分成三类

K-means 做的事情就是:

让机器也能做到这一点 👀


3. K-means 名字里的 K 是什么意思?

K 就是:

你希望分成多少类

比如:

K = 2 → 分两类
K = 3 → 分三类
K = 5 → 分五类

所以它叫:

K-means

意思是:

K 个中心点的聚类算法


4. K-means 的核心思路其实非常直觉

整个算法只有三步:

第一步:

随机选 K 个中心点

第二步:

让每个样本选择离自己最近的中心

第三步:

重新计算每个类别的中心点

然后重复:

第二步 + 第三步

直到中心不再变化

结束 ✅

听起来是不是非常简单?

但神奇的是:

它真的很好用。


5. 什么叫“中心点”?

中心点其实就是:

这一类数据的平均位置

比如:

三个点:

(2,3) (3,4) (4,5)

它们的中心大概是:

(3,4)

这就是:

mean(均值)

所以算法叫:

K-means

意思就是:

K 个均值中心


6. 为什么这个方法有效?

因为它在做一件非常合理的事情:

不断优化下面这个目标:

让每个点离自己的类别中心尽量近

换句话说:

让同类更像同类

异类更不像异类

这其实就是:

聚类的本质目标 🎯


7. 用一个真实一点的例子理解它

假设我们有这些用户:

用户年龄月消费
A20500
B22600
C21550
D403000
E422800
F413200

你不用机器也能看出来:

它们明显分两类:

年轻低消费
中年高消费

K-means 会自动找到:

两个中心:

(21, 550) (41, 3000)

然后完成分类。


8. K-means 为什么要反复更新中心?

因为一开始:

中心是随机选的 🎲

可能选得不好。

比如:

第一次选的是:

(20,500) (40,3000)

还不错。

但也可能选成:

(22,600) (21,550)

这就很糟糕。

所以算法要反复更新中心:

不断修正

直到稳定下来。


9. K-means 的完整流程(算法版本)

正式一点描述:

步骤如下:

Step 1:

随机选择 K 个中心

Step 2:

计算每个点到中心的距离

Step 3:

分配最近中心

Step 4:

重新计算中心

Step 5:

重复直到收敛

结束。

核心思想只有一句话:

先分组,再修正中心,再重新分组

循环直到稳定。


10. K-means 在优化什么?

它其实在最小化:

所有样本到中心点的距离平方和

也就是:

组内误差平方和

你可以理解为:

让每个点尽量靠近自己的中心

数学上叫:

WCSS(within-cluster sum of squares)

直觉理解:

让每个类别尽量“紧凑”


11. 为什么用“平方距离”而不是普通距离?

原因很简单:

平方距离有两个好处:

第一:

计算方便

第二:

远离中心的点惩罚更大

比如:

距离:

1 → 1 2 → 4 5 → 25

远离中心的点会被重点关注。

这让聚类更稳定。


12. K-means 最大的问题:K 怎么选?

这是最经典的问题之一。

K-means 里:

K 是你自己定的

不是模型算出来的。

那怎么办?

最常见方法叫:

肘部法则(Elbow Method)

思路是:

画一条曲线:

横轴:

K

纵轴:

误差平方和

像这样:

K=1 误差很大 K=2 明显下降 K=3 继续下降 K=4 稍微下降 K=5 几乎不变

拐点位置:

就是最合适的 K

像手肘一样的位置 🦴

所以叫:

Elbow Method


13. 一个可以直接运行的例子

可以直接运行:

fromsklearn.clusterimportKMeansimportnumpyasnpimportmatplotlib.pyplotasplt# 构造数据X=np.array([[1,2],[1,4],[1,0],[10,2],[10,4],[10,0]])# 建立模型kmeans=KMeans(n_clusters=2,random_state=0)# 训练模型kmeans.fit(X)# 查看类别print("类别标签:")print(kmeans.labels_)# 查看中心点print("中心点:")print(kmeans.cluster_centers_)# 可视化plt.scatter(X[:,0],X[:,1],c=kmeans.labels_)plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s=200,marker='X')plt.show()

运行后你会看到:

数据自动分成两组

中心点也被计算出来。

非常直观 📊


14. K-means 最常见应用场景

现实世界里它非常常见:

用户分群

比如:

高价值用户
潜在用户
流失风险用户

客户画像

比如:

价格敏感型
品质优先型
品牌忠诚型

推荐系统预处理

比如:

把用户分群后再推荐

图像压缩

比如:

减少颜色数量 🎨

异常检测

比如:

离群点识别


15. K-means 的优点

总结一下:

优点非常明显:

简单 ✔️
快速 ✔️
容易实现 ✔️
可解释性强 ✔️
适合大规模数据 ✔️

所以它几乎是:

无监督学习第一站


16. 但它也有局限

它不是万能算法。

最大问题包括:

必须提前知道 K

对初始中心敏感

容易陷入局部最优

只能发现“球形结构”

比如:

它擅长发现:

● ● ● ● ● ●

不擅长发现:

🌙 弯曲结构

17. K-means 和分类有什么本质区别?

这是一个非常值得写进文章里的总结点。

分类:

有答案

监督学习

聚类:

没答案

无监督学习

换句话说:

分类是在学规则

聚类是在发现结构

这是机器学习里的一个重要分界线 ⚖️


18. 这一篇真正想让读者记住的一句话

如果要压缩成一句话:

K-means 的目标是把数据分成 K 组,让每一组内部尽量相似。

它通过:

不断更新中心点

来完成这件事情。

简单,但非常经典。