代码中自定义距离公式解析及两次调用相加原因探究
自定义distance函数的解析
1. 距离公式类型
这个函数计算的是多元高斯分布间KL散度的变形(省略了1/2系数),并非马氏距离。马氏距离针对单个样本点与分布的距离,而这里输入的是两个完整的高斯分布(由均值向量和协方差矩阵描述)。
2. 计算逻辑拆解
函数的输入instance1和instance2都是二元组:第一个元素是高斯分布的均值向量,第二个是协方差矩阵;k是特征维度(即高斯分布的变量维度)。计算步骤对应KL散度(衡量两个概率分布差异的指标)的核心部分:
- 第一步:
np.trace(np.dot(np.linalg.inv(cm2), cm1))
计算协方差矩阵的迹:tr(cm2⁻¹ · cm1),对应KL散度中两个分布协方差结构的差异项 - 第二步:
np.dot(np.dot((mm2-mm1).transpose(), np.linalg.inv(cm2)), mm2-mm1)
计算均值差异的二次型:(mm2 - mm1)ᵀ · cm2⁻¹ · (mm2 - mm1),对应两个分布均值的差异项 - 第三步:
np.log(np.linalg.det(cm2)) - np.log(np.linalg.det(cm1))
计算协方差矩阵行列式的对数差:ln(det(cm2)) - ln(det(cm1)),对应分布“分散程度”的差异项 - 第四步:
distance -= k
减去特征维度k,这是KL散度公式中的标准修正项
注:标准多元高斯KL散度公式会在整体前乘以1/2,这里省略了该系数,但不影响KNN算法中距离的相对排序(KNN仅关注距离的大小关系)。
3. 两次调用相加的原因
KL散度本身是非对称的:KL(P||Q)(从分布P到Q的散度)≠KL(Q||P),无法直接作为KNN要求的对称距离度量。
而distance(A,B,k) + distance(B,A,k)等价于KL(A||B) + KL(B||A),将非对称的散度转化为对称的距离,满足KNN算法中“样本A到B的距离等于B到A的距离”的基本要求。
内容的提问来源于stack exchange,提问作者Nyx Moon
相关产品推荐
相关产品推荐

