Python Mahalanobis 距离多维 z 分数

问题描述

我想要一个关于已知固定点的二维数据的性能分数,比如 z 分数。我想我现在想要马哈拉诺比斯距离,而不是每个方向的 z 分数。但是我没有两个向量,我有一个 2 x N 数组,包含 x-y 中 N 个点的位置,还有一个固定的 2D 点,我想与它进行比较。我看了这个例子:

from scipy.spatial import distance
iv = [[1,0.5,0.5],[0.5,1,1]]
distance.mahalanobis([1,0],[0,iv)

用于在 Python 中计算,但我不知道我的 iv 应该是什么。我是否只是提出了我的已知观点,例如:

distance.mahalanobis([1,4],iv)

?谢谢

解决方法

我将在维度 2 的 X 中创建随机数据,这将定义分布,

import numpy as np
import scipy

from scipy.spatial import distance

X = np.random.normal(size=(100,2),loc=(1,4) )

现在您可以使用第一点的马哈拉诺比斯距离

distance.mahalanobis( X[0],np.mean(X,axis=0),scipy.linalg.inv(np.cov(X.T)) )

例如使用您自己的 p = (1,4) with

distance.mahalanobis( np.array([1,4]),scipy.linalg.inv(np.cov(X.T)) )

如果您的 N 太大,COV 矩阵可能太昂贵,计算成本太高,您可以采样。


N 的大小从 100 更改为 1000 确实不会产生太大影响,因为相同分布的样本只会变大。最好的感受不同参数的效果是绘制一些图片并尝试不同的点p。另一种方法是围绕不同的平均值生成 X,即 X = np.random.normal(size=(100,loc=(2,10) ),如果您保留 p (1,4) 也有效果