跳转到内容

k-means 在生物信息学中的应用

快速概览

k-means 是一种经典的划分式聚类算法,旨在将数据点分配到 k 个簇中,使每个点到其所属簇中心的平方距离之和最小。在生物信息学中,它常用于初步探索基因表达模式。

  • 掌握 Lloyd 算法的"分配-更新"迭代过程
  • 理解平方误差和(SSE) 作为目标函数的物理意义
  • 了解 k-means 在处理高维表达数据时的优势与局限
  • 对比层次聚类与 k-means 的适用场景
所属板块 分析方向与案例

把基础对象与算法方法重新放回真实分析任务与工作流。

阅读目标 帮助建立阅读上下文

先判断这页与你当前问题的关系,再决定是否深入展开。

建议前置 先建立相关基础对象与方法直觉

建议先建立相关基础对象与方法直觉,再进入本页。

1. 要解决什么生物信息学问题?

Section titled “1. 要解决什么生物信息学问题?”

在生物信息学中,k-means 要解决的核心问题是:如何在无标签的高维生物数据中自动发现具有相似行为的模式组? 具体场景包括:

  • 基因共表达分析:将成千上万个基因按照它们在多个实验条件(如不同时间点、不同组织、不同处理)下的表达模式进行分组,从而推断潜在的共同调控机制。
  • 样本分型:在癌症研究中,将患者的表达谱聚类为不同的分子亚型,指导精准治疗。
  • 单细胞转录组分群:将表达谱相似的细胞归为一类,识别不同的细胞类型或状态。

k-Means 聚类问题:给定一组高维向量(如基因在不同时间点的表达值)和簇数 kk,找到一种划分方案,使平方误差和(Sum of Squared Errors, SSE) 达到最小。

  • 一个 n×dn \times d 的数据矩阵 XX,其中 nn 是样本(基因或细胞)数量,dd 是维度(实验条件或基因数量)。
  • 预设的簇数 kk1kn1 \leq k \leq n)。
  • 每个样本的簇分配标签 {1,2,,k}\{1, 2, \ldots, k\}
  • kk 个簇中心 μ1,μ2,,μk\mu_1, \mu_2, \ldots, \mu_k

k-means 的目标是找到一个划分 C1,C2,,CkC_1, C_2, \ldots, C_k,使以下目标函数最小化:

Cost(C1,,Ck)=i=1kxCixμi2Cost(C_1, \dots, C_k) = \sum_{i=1}^{k} \sum_{x \in C_i} \| x - \mu_i \|^2

其中 μi\mu_i 是第 ii 个簇的几何中心(均值向量):

μi=1CixCix\mu_i = \frac{1}{|C_i|} \sum_{x \in C_i} x

xμi2\| x - \mu_i \|^2 是欧几里得距离的平方。这个目标函数也被称为组内平方和(Within-Cluster Sum of Squares, WCSS)

目标函数可以重新解释为最小化数据点与其簇中心之间的”编码损失”。如果把每个数据点用其簇中心来”编码”(即用 μi\mu_i 近似表示 xx),那么 SSE 就是编码误差的总和。从这个角度看,k-means 本质上是在做向量量化(Vector Quantization)——用 kk 个原型向量来近似表示整个数据集。

由于精确寻找全局最优解是 NP-难的,实际中通常使用启发式的 Lloyd 算法

  1. 初始化:随机选择 kk 个点作为初始簇中心。
  2. 分配(Assignment):将每个基因分配到距离其最近的中心所在的簇: Ci={x:xμixμj,ji}C_i = \{ x : \| x - \mu_i \| \leq \| x - \mu_j \|, \forall j \neq i \}
  3. 更新(Update):计算每个新簇中所有成员的平均值,将其设为新的簇中心。
  4. 收敛:重复步骤 2 和 3,直到中心不再发生显著变化(或达到最大迭代次数)。
  • 收敛性:算法保证在有限步内收敛。这是因为每次迭代中 SSE 是单调不增的,而可能的划分方案数量是有限的。
  • 但不保证全局最优:结果高度依赖初始中心的选择。不同的初始化可能导致完全不同的聚类结果。
  • 复杂度:每轮迭代的时间复杂度为 O(nkd)O(n \cdot k \cdot d),其中 dd 是数据维度。在大规模表达矩阵上运行非常高效。

假设有 6 个基因在 2 个时间点的表达值如下:

基因时间点 1时间点 2
g1g_112
g2g_213
g3g_321
g4g_489
g5g_598
g6g_6910

k=2k = 2

初始化:随机选择 μ1=g1=(1,2)\mu_1 = g_1 = (1, 2)μ2=g4=(8,9)\mu_2 = g_4 = (8, 9)

第一轮分配

基因μ1\mu_1 的距离μ2\mu_2 的距离分配
g1g_1 (1,2)09.9\approx 9.9簇 1
g2g_2 (1,3)19.2\approx 9.2簇 1
g3g_3 (2,1)1.4\approx 1.49.2\approx 9.2簇 1
g4g_4 (8,9)9.9\approx 9.90簇 2
g5g_5 (9,8)9.9\approx 9.91.4\approx 1.4簇 2
g6g_6 (9,10)11.3\approx 11.31.4\approx 1.4簇 2

第一轮更新

  • μ1=(1,2)+(1,3)+(2,1)3=(1.33,2.0)\mu_1 = \frac{(1,2) + (1,3) + (2,1)}{3} = (1.33, 2.0)
  • μ2=(8,9)+(9,8)+(9,10)3=(8.67,9.0)\mu_2 = \frac{(8,9) + (9,8) + (9,10)}{3} = (8.67, 9.0)

第二轮分配:结果不变,算法收敛。

最终聚类:{g1,g2,g3}\{g_1, g_2, g_3\}(低表达簇)和 {g4,g5,g6}\{g_4, g_5, g_6\}(高表达簇)。

k-means 特别适合处理”扁平”的聚类任务:

  • 共表达发现:将具有相似时间序列波动的基因聚在一起,暗示它们可能受相同的调控因子控制。
  • 亚型识别:在癌症研究中,通过样本聚类识别具有不同表达特征的亚群。

在生物信息学中应用 k-means 时,通常需要先对数据进行预处理:

  1. 标准化(Standardization):对不同基因的表达值进行 Z-score 标准化,消除绝对表达水平的差异,聚焦于表达模式的相似性。
  2. 降维:在聚类前使用 PCA 等方法降低维度,减少噪声维度对距离计算的干扰。
  3. 多次运行:由于 k-means 对初始化敏感,应运行多次(如 50—100 次)并选择 SSE 最小的结果。

7. 局限性:生物学数据的复杂性

Section titled “7. 局限性:生物学数据的复杂性”

尽管常用,但 k-means 在生物信息学中面临以下挑战:

  • k 值的选择:用户必须预先指定 kk。而在生物学实验中,真实的细胞类型或调控模块数量通常是未知的。
  • 球形簇假设:k-means 假设簇在空间中呈球形分布。如果基因群的分布是长条形或螺旋形的,k-means 的效果会很差。
  • 孤立点敏感:极端的表达值(离群点)会剧烈拉动簇中心的位置。
  • 等大小簇假设:k-means 倾向于产生大小相近的簇,但生物学中的簇往往大小差异很大。

在实践中,以下方法常用于确定合适的 kk 值:

  • 肘部法则(Elbow Method):绘制 SSE 随 kk 变化的曲线,寻找 SSE 下降速度显著减缓的”拐点”。
  • 轮廓系数(Silhouette Score):衡量每个样本与其所属簇的紧密程度以及与最近邻簇的分离程度,范围是 [1,1][-1, 1]
  • Gap Statistic:将实际数据的 SSE 与来自均匀分布的参考数据的 SSE 进行比较。
  • Lloyd 算法每轮迭代:O(nkd)O(n \cdot k \cdot d)
  • 总时间复杂度(tt 轮迭代):O(tnkd)O(t \cdot n \cdot k \cdot d)
  • 空间复杂度:O(nd+kd)O(n \cdot d + k \cdot d)
  • 数据可以使用欧几里得距离进行有意义的比较。
  • 簇的形状近似球形。
  • 没有太多极端的离群点。
特性k-means层次聚类CAST
需要预设 k
距离度量欧几里得任意任意
噪声鲁棒性中等较好
时间复杂度O(nkd)O(n \cdot k \cdot d)O(n2)O(n^2)O(n3)O(n^3)
R 语言 stats::kmeans()
R 内置的 k-means 实现,使用 Hartigan-Wong 算法(Lloyd 算法的改进版本),适合中小规模数据。
scikit-learn KMeans
Python 中最常用的 k-means 实现,支持多种初始化策略(如 k-means++),并提供丰富的评估指标。
MCLUST
基于高斯混合模型(GMM) 的聚类工具。MCLUST 可以看作 k-means 的概率推广版本,不要求簇是球形等大小的。