距离标准化与相似性 - SpiralKernel/bioinfo-wiki-migrated GitHub Wiki

距离标准化与相似性

更新:2026-10-26;状态:可用;验证范围:2026-10-26核对原始与官方资料;本页Python微型计算已执行;人工数据不代表专业软件或真实研究性能。

距离把“两个样本多不一样”变成数值,相似性则把“多相像”变成数值。结果取决于特征表示、单位和缺失处理,因此距离选择是模型假设的一部分。本页从两维数据手算,读完应能说明为什么同一批样本换尺度后会得到不同邻居。

前置为向量、均值和标准差。后接PCA原理与实现、聚类Kmeans与层次聚类及近邻朴素贝叶斯与决策树入门。

三种常见比较回答不同问题

欧氏距离$d(x,y)=\sqrt{\sum_j(x_j-y_j)^2}$比较绝对差异;曼哈顿距离为各维绝对差之和;余弦相似性$\cos(x,y)=x^Ty/(|x||y|)$比较向量方向。相关系数还先对各向量作中心化,故与普通余弦并不相同。集合的Jaccard相似性为交集/并集,常用于存在缺失特征,但不能把未知当作明确不存在。

1−相似性有时称为差异度,却不一定满足距离的全部数学性质,如三角不等式。零向量的余弦未定义,空集合的Jaccard也需要约定,不能默默输出0并当有效观测。更多定义见scikit-learn距离与相似性指南。

单位如何压倒真正想比较的信号

样本A=(0,0)、B=(1,1000)、C=(3,0)。原始欧氏距离A-B约1000、A-C=3,所以C更近。如果第二维只是以很大单位记录的技术量,并按预先确定的1000为尺度除去它,B变(1,1),A-B约1.414,反而比C近。两次计算都正确,但回答的问题不同。

本页例子在项目根目录的Python中运行;标准库例子无需安装包,含NumPy/SciPy的例子先按R包Python包与可复现环境建立项目环境。Windows命令使用python,macOS/Linux可使用python3;代码块可复制进该环境的Python交互会话,或保存为项目根目录下的临时脚本再用该环境解释器运行;不要保存到examples目录或任意外部目录后假定项目导入路径仍相同。除特别说明外,只向屏幕输出,不写文件。

from math import dist, sqrt
A, B, C = (0,0), (1,1000), (3,0)
print('raw', round(dist(A,B),3), dist(A,C))
scale = (1,1000)
def transform(x):
    return tuple(v/s for v,s in zip(x,scale))
print('rescaled', round(dist(transform(A),transform(B)),3),
      dist(transform(A),transform(C)))
x, y = (1,2), (2,4)
cosine = sum(a*b for a,b in zip(x,y)) / sqrt(sum(a*a for a in x)*sum(b*b for b in y))
print('proportional_vectors', dist(x,y), round(cosine,6))
assert dist(A,B) > dist(A,C)
assert dist(transform(A),transform(B)) < dist(transform(A),transform(C))

检查点:原始约1000与3;重标后约1.414与3;(1,2)和(2,4)的欧氏距离非零但余弦为1。本例scale是人为固定尺度,未冒充从样本估计的标准差。

怎样决定是否标准化

Z-score按每列训练均值和标准差变换$z_{ij}=(x_{ij}-\bar x_j)/s_j$,使不同单位更可比;常数列s=0需删除或按预设规则处理。若高方差本来就代表可靠生物信号,全部拉到单位方差会改变研究重点。标准化不是普遍必须步骤。

RNA原始计数受文库大小、均值-方差关系影响,不能只作普通列z-score就直接解释样本距离;应采用与任务一致的归一化和变换。微生物组是组成数据,欧氏距离可能忽略闭合约束;群体基因型则涉及等位频率、倍性和LD。这些专业处理见对应方法页。

预测时只在训练集估计均值/尺度,再用同一参数变换验证和新样本;在全数据上先做标准化会引入验证信息。不同训练集算出的坐标不能在未保存变换时直接混用,详见数据泄漏与交叉验证。

缺失和高维带来的额外问题

按每对样本的共同非缺失维度计算距离,会使不同样本对使用不同信息。若A-B只有2个位点、A-C有百万位点,两距离即使数值相同,精度也不同。至少保存有效维度数,预设缺失阈值或训练内填补策略;不能把缺失一律当0。

维度很高时,无关特征和噪声可能让距离趋于相近,最近邻也可能不稳定。先检查特征质量、相关冗余与降维,然后在独立验证中判断距离是否服务任务。距离不因数学形式工整就必然具有生物意义。

症状、检查与自测

症状 应检查 处理依据
聚类几乎只按一列分 量纲、方差、技术批次 明确是否希望该列主导
距离为NaN/无穷 缺失、零向量、常数列 明确不可定义状态
换训练集预测变动大 变换参数、特征稳定性 保存训练变换并报告波动
距离0但样本不相同 使用余弦/相关差异度 核对比较的是方向还是幅度

问:余弦1是否代表两样本每个基因表达都相等? 答:不代表,只可能说明向量方向相同。问:标准化能消除混杂吗? 答:不能,缩放单位与调整混杂是不同操作。对照组学批次校正与信号保留理解技术结构的处理。

接着读什么

PCA原理与实现 → 聚类Kmeans与层次聚类 → 近邻朴素贝叶斯与决策树入门 → 数据泄漏与交叉验证 → 组学批次校正与信号保留 → R包Python包与可复现环境 → 方法与算法系统学习指南。学习顺序与练习入口见方法与算法系统学习指南。

运行本页的完整小例

先下载项目并进入含README与examples的根目录,环境准备见方法与算法系统学习指南。用项目环境的Python运行以下命令(macOS/Linux路径示例;Windows用.venv\Scripts\python.exe):

.venv/bin/python examples/methods_foundations_demo.py --case distance --output examples/output/methods-distance

输出summary.json保存本页计算与检查结果。目录非空时拒绝覆盖,再练习请更换--output目录;页面内短代码只打印结果。标准库case也可用系统Python直接运行。

公式里的矩阵、下标或对数不熟时,可回查读懂方法公式的最小数学基础。