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-prototypes)。
k 值(簇数)是 k-均值最重要的超参数。常见的选择方法有:
- 肘部法则(Elbow Method):计算不同 k 值下的目标函数值(惯性),绘制曲线。随着 k 增加,惯性递减,但当 k 接近真实簇数时,惯性下降速度减缓,曲线出现'肘部'。肘部对应的 k 值为较优选择。
- 轮廓系数(Silhouette Coefficient):结合了簇内紧密度和簇间分离度。对于每个样本 i,计算 a(i)(同簇平均距离)和 b(i)(最近异簇平均距离)。轮廓系数 s(i) 越接近 1 表示聚类效果越好。
- Calinski-Harabasz 指数:基于簇间离差矩阵与簇内离差矩阵的比值,越大表示聚类效果越好。
- 领域知识:在某些医疗应用中,k 值可能由临床意义决定,例如已知疾病有 3 种亚型,可设 k=3。
局限性与复杂度
k-均值的时间复杂度约为 O(n * k * I * p),其中 n 为样本数,k 为簇数,I 为迭代次数,p 为特征维数。对于大规模数据,k-均值是相对高效的算法。
但也存在明显局限:需预先指定 k;对初始值敏感;假设簇为凸形;对噪声和异常值敏感;只能处理数值型数据。
医疗应用场景
患者分群与疾病亚型发现
这是 k-均值在医疗中最经典的应用。通过聚类,可将患者划分为具有相似临床特征、生物标志物或基因组特征的亚组,每个亚组可能对应不同的疾病机制、预后或治疗反应。例如:
- 糖尿病亚型:基于血糖、BMI、胰岛素抵抗、年龄等指标,将糖尿病患者分为不同亚型,不同亚型并发症风险和治疗方法不同。
- 心力衰竭表型:通过临床指标(如射血分数、BNP、肾功能)聚类,识别不同心衰表型,指导个性化治疗。
- COVID-19 临床分型:基于症状、实验室指标、影像特征,将患者分为轻症、重症、危重症等亚型。


