机器学习进阶(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. 用一个真实一点的例子理解它
假设我们有这些用户:
| 用户 | 年龄 | 月消费 |
|---|---|---|
| A | 20 | 500 |
| B | 22 | 600 |
| C | 21 | 550 |
| D | 40 | 3000 |
| E | 42 | 2800 |
| F | 41 | 3200 |
你不用机器也能看出来:
它们明显分两类:
年轻低消费
中年高消费
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 组,让每一组内部尽量相似。
它通过:
不断更新中心点
来完成这件事情。
简单,但非常经典。
