k-均值算法:患者分群与精准医疗
在医疗领域,我们常面临这样的挑战:患者能否划分为不同的亚型?不同亚型是否有迥异的疾病进展或治疗反应?这类问题属于无监督学习的范畴。k-均值(k-means)聚类算法是其中最经典、应用最广的工具之一,它能将数据划分为 k 个簇,让同一簇内的样本高度相似,而簇间差异显著。咱们先从原理聊起,看看它如何发现慢性病患者的潜在亚型,为精准医疗提供依据。
算法原理
聚类问题概述
聚类是无监督学习的一种,目标是将数据集划分为若干组(簇),使得组内样本尽可能相似,组间尽可能不同。与分类不同,聚类不需要预先标记的类别,而是直接从数据本身挖掘结构。
k-均值的核心思想
k-均值试图将 n 个样本划分到 k 个簇中,最小化每个样本到其所属簇中心的距离平方和。簇中心即簇内所有样本的均值,这也是'k-均值'名称的由来。
设数据集为 $X = {x^{(1)}, x^{(2)}, …, x^{(n)}}$,每个样本为 p 维向量。算法将样本划分到 k 个簇 $C = {C_1, C_2, …, C_k}$,目标是极小化目标函数(惯性,inertia):
$$ J = \sum_{j=1}^{k} \sum_{x \in C_j} | x - \mu_j |^2 $$
其中 $\mu_j$ 是簇 $C_j$ 的中心(均值向量)。
算法步骤
k-均值通过迭代优化实现上述目标,流程其实很直观:
- 初始化:随机选择 k 个样本作为初始簇中心。
- 分配:计算每个样本到各簇中心的距离(通常用欧氏距离),将样本分配到最近的簇。
- 更新:对每个簇重新计算均值,作为新的簇中心。
- 重复:重复步骤 2 和 3,直到簇中心不再发生显著变化或达到最大迭代次数。
当算法收敛时,样本分配和簇中心基本稳定。
距离度量与 k 值选择
k-均值通常使用欧氏距离,但理论上也可用其他度量。距离的选择直接影响结果,医疗数据常混合数值型和类别型特征,此时可能需要独热编码或使用 Gower 距离等专门方法。不过 k-均值对类别型特征处理较弱,通常需先数值化。
k 值(簇数)是关键超参数,常见选择方法有:
- 肘部法则:绘制不同 k 值下的惯性曲线,下降速度减缓的'肘部'对应较优 k 值。
- 轮廓系数:结合簇内紧密度和簇间分离度,越接近 1 效果越好。
- Calinski-Harabasz 指数:基于簇间与簇内离差矩阵比值。
- 领域知识:如已知疾病有 3 种亚型,可直接设 k=3。
局限性与复杂度
时间复杂度约为 $O(n \cdot k \cdot I \cdot p)$,对于大规模数据效率尚可。但也存在明显局限:需预先指定 k、对初始值敏感、假设簇为凸形且大小相近、对噪声异常值敏感,且主要处理数值型数据。
医疗应用场景
患者分群与疾病亚型发现
这是最经典的应用。通过聚类,可将患者划分为具有相似临床特征、生物标志物或基因组特征的亚组,每个亚组可能对应不同的疾病机制或预后。例如:
- 糖尿病亚型:基于血糖、BMI、胰岛素抵抗等指标,区分严重自身免疫性、严重胰岛素缺乏性等类型,指导差异化治疗。
- 心力衰竭表型:通过射血分数、BNP 等指标识别不同心衰表型。
- COVID-19 临床分型:基于症状和影像特征划分轻症、重症等亚型。


