AI聚类算法入门:K-means 和 EM
本文介绍了两种经典聚类算法:K-means和EM(期望最大化)。K-means采用"硬聚类"方式,将数据明确划分为K个簇,计算快速简单,适合球形数据分布。EM算法则是"软聚类",给出数据属于各个簇的概率,能处理不规则形状的簇。K-means适合数据量大、需要快速处理的场景,EM则适用于数据分布复杂、需要概率输出的情况。两种算法都广泛应用于推荐系统、图像分析等
想象一下:你刚搬进新宿舍,一屋子东西乱成一锅粥——书、衣服、零食、充电线全混在一起。你会不会抓狂?
如果你能挥挥手,让它们自动分成“书区”“衣服区”“零食区”,那该多爽!
恭喜你,这正是聚类算法干的活儿。它是无监督学习里最酷的魔法之一:不用告诉机器“这个是猫,那个是狗”,它自己就能从一堆杂乱数据里找出“同类项”,自动分组。
今天咱们聊两位最经典的“分组大师”——K-means 和 EM(期望最大化) 算法。它们特别适合刚接触 AI 的应届生和小白:简单、上手快、效果肉眼可见。
喝口咖啡,我们开始!
一、最最最常用的硬核选手:K-means
它是什么?
一句话:K-means 就是把数据硬生生分成 K 个团,每个点只能属于一个团,就像强制分宿舍,非黑即白。
它是怎么工作的?(超级接地气的比喻)
想象你有 100 个同学,要分成 3 个学习小组(K=3):
- 随便先指 3 个人当“组长”(初始中心点,随机!)
- 每个同学看:我离哪个组长最近?就去他那个组(计算欧氏距离)
- 每个组重新选一个“中心位置”(所有组员坐标平均值)
- 重复 2、3 步,直到没人再换组,或者组长位置几乎不动了。
就这样,数据自己就“抱团取暖”了!整个过程就像一群人挤地铁,大家自然而然围着几个空位站稳。
一个超简单的 Python 示例(10 行就能跑)
from sklearn.cluster import KMeans
import numpy as np
# 假数据:100 个同学的身高体重
X = np.array([[165,50],[168,52],[180,80],[182,85], ...])
kmeans = KMeans(n_clusters=3, random_state=42) # 分 3 个组
kmeans.fit(X) # 开始训练
labels = kmeans.labels_ # 每个点属于哪个组(0,1,2)
centers = kmeans.cluster_centers_ # 三个组的中心点
print("每个同学属于哪个组:", labels)
print("三个组长位置:", centers)
跑完你会发现:瘦高个一伙、壮实的一伙、普通的一伙,自动分好了!是不是有种“卧槽原来这么简单”的感觉?
现实世界里它在干嘛?
- 淘宝把你和买同样东西的人分到一起,给你推“大家都在买”
- 抖音把喜欢同一种舞蹈视频的用户聚成一类,精准喂你同款
- 美团把外卖地址聚类,决定在哪里建新仓库最省钱
优点(为什么大家都爱它)
- 超快!几万条数据几秒钟搞定
- 代码简单,新手一学就会
- 结果直观,一看就懂
缺点(别盲目崇拜它)
- 必须提前告诉它 K 是几,猜错了结果就崩
- 只能发现球形的簇,月牙形、环形直接傻眼
- 对离群点超级敏感,一个奇葩就能把中心拉歪
二、更“温柔体贴”的软聚类大佬:EM 算法(高斯混合模型 GMM)
它是什么?
一句话:EM 是“软聚类”的代表,它不强制你非黑即白,而是说“你有 70% 概率属于 A 组,30% 概率属于 B 组”。
它是怎么工作的?(继续用宿舍比喻)
这次我们不硬性分宿舍,而是说“每个人可能同时属于几个兴趣圈”。
E 步(Expectation,期望)
假设已经有几个“兴趣中心”(篮球、游戏、学习),计算每个人属于每个中心的概率。
比如小明:篮球 80%、游戏 15%、学习 5%。
M 步(Maximization,最大化)
根据大家的概率,重新调整这几个兴趣中心的位置和影响力范围(方差),让整体概率最大。
反复 E 步 → M 步,直到概率基本不变。
结果?每个人都拿到一个概率分布,而不是死板的一个标签。这才是真实世界该有的样子!
一个超简单的 sklearn 示例
from sklearn.mixture import GaussianMixture
import numpy as np
X = np.array([[165,50],[168,52],[180,80], ...])
gmm = GaussianMixture(n_components=3, random_state=42)
gmm.fit(X)
labels = gmm.predict(X) # 硬标签(最可能的那个组)
probs = gmm.predict_proba(X) # 软标签:每个点属于 3 个组的概率
print("最可能的组:", labels)
print("第一个人属于三个组的概率:", probs[0])
你会看到类似 [0.99, 0.009, 0.001] —— 几乎 100% 确定属于第 1 组。
现实世界里它在干嘛?
- 医学影像分割:一个像素可能既像肿瘤又像正常组织,EM 给出概率更靠谱
- 语音识别:同一段声音可能对应多个音素,用概率更准确
- 金融反欺诈:一个账户 70% 正常、30% 可疑,先重点监控而不是直接封号
优点
- 能处理簇形状不规则、互相重叠的情况
- 给出概率,比硬标签更细腻、更贴近现实
- 自动估计每个簇的形状和大小
缺点
- 比 K-means 慢(尤其是大数据)
- 同样要提前定 K(组数)
- 容易陷入局部最优(初始值很关键)
最后总结:什么时候用谁?
| 场景 | 推荐算法 | 理由 |
|---|---|---|
| 数据量大、要快、簇大概是球形 | K-means | 90% 的情况都够用 |
| 簇形状奇怪、有重叠、想要概率 | EM / GMM | 更温柔、更真实 |
| 不知道 K 是多少 | 先用肘部法则或轮廓系数试试(下次聊) |
聚类算法就是 AI 界的“自动整理狂魔”。
学会了 K-means 和 EM,你就已经能玩转 80% 的无监督学习场景了!
更多推荐
所有评论(0)