1. 什么是 K-Means?
K-Means 是一种无监督、迭代式的聚类算法:
给定数据集{x₁, x₂, …, xₙ}与预设簇数K,算法把样本划分为K个不相交的簇C₁, C₂, …, Cₖ,使得同一簇内样本尽可能相似,不同簇间样本尽可能远离。
核心思想:
> “让簇内‘抱团’,让簇间‘疏远’。”
2. 目标函数 J:簇内误差平方和(WCSS)
K-Means 用几何距离衡量相似性,目标函数J定义为:
J=∑k=1K∑x∈Ck∥x−μk∥2 J = \sum_{k=1}^{K} \sum_{x \in C_k} \|x - \mu_k\|^2J=k=1∑Kx∈Ck∑∥x−μk∥2
μₖ:第k个簇的质心(centroid)‖x − μₖ‖²:样本到所属质心的欧氏距离平方J的物理意义:Within-Cluster Sum of Squares (WCSS),即“簇内误差平方和”
>算法目标:找到使J最小的簇划分{C₁,…,Cₖ}与质心{μ₁,…,μₖ}。
3. 迭代两步:坐标下降求 J
K-Means 采用坐标下降策略,交替更新两个变量:
| 步骤 | 固定量 | 优化量 | 公式 |
|---|---|---|---|
| E步(Assignment) | 质心μₖ | 样本归属Cₖ | Cₖ = {x : ‖x − μₖ‖² ≤ ‖x − μⱼ‖², ∀j} |
| M步(Update) | 簇Cₖ | 质心μₖ | μₖ = (1/Cₖ) ∑_{x∈Cₖ} x |
示例:
defkmeans(X,K,max_iter=100):n,d=X.shape mu=X[torch.randperm(n)[:K]]# 随机初始化 K 个质心for_inrange(max_iter):# E步:计算距离并分配样本dist=torch.cdist(X,mu)# (n, K)labels=torch.argmin(dist,dim=1)# (n,)# M步:重新计算质心forkinrange(K):mask=labels==kifmask.sum()>0:mu[k]=X[mask].mean(dim=0)returnlabels,mu