想象一下:你刚搬进新宿舍,一屋子东西乱成一锅粥——书、衣服、零食、充电线全混在一起。你会不会抓狂?
如果你能挥挥手,让它们自动分成“书区”“衣服区”“零食区”,那该多爽!

恭喜你,这正是聚类算法干的活儿。它是无监督学习里最酷的魔法之一:不用告诉机器“这个是猫,那个是狗”,它自己就能从一堆杂乱数据里找出“同类项”,自动分组。

今天咱们聊两位最经典的“分组大师”——K-meansEM(期望最大化) 算法。它们特别适合刚接触 AI 的应届生和小白:简单、上手快、效果肉眼可见。
喝口咖啡,我们开始!


一、最最最常用的硬核选手:K-means

它是什么?

一句话:K-means 就是把数据硬生生分成 K 个团,每个点只能属于一个团,就像强制分宿舍,非黑即白。

它是怎么工作的?(超级接地气的比喻)

想象你有 100 个同学,要分成 3 个学习小组(K=3):

  1. 随便先指 3 个人当“组长”(初始中心点,随机!)
  2. 每个同学看:我离哪个组长最近?就去他那个组(计算欧氏距离)
  3. 每个组重新选一个“中心位置”(所有组员坐标平均值)
  4. 重复 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% 的无监督学习场景了!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐