我有一个 Pandas 数据框中多个个体的不同测量值的数据集,与此随机数据的结构类似:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(25, 3), columns=['var1', 'var2', 'var3'])
df.head()
var1 var2 var3
0 -0.484272 -1.232702 -0.104978
1 -0.104346 0.439150 -0.324739
2 -0.764503 0.679031 1.786502
3 -1.551942 0.136850 0.557289
4 0.081988 -0.482199 -0.560156
我想弄清楚这些人中是否有任何异常值,并且我知道测量马氏距离是解决此问题的常用方法。我注意到 Scipy 也有 Mahalanobis 函数,但它接受两个一维数组及其协方差矩阵作为输入,而不是整个数据帧。有没有办法使用 Scipy 函数计算数据框中每一行的 MD?
我在 Machine Learning Plus 上发现了这个实现,它计算数据帧中每一行的 MD 和 p 值,然后根据卡方检验计算 p 值以确定结果是否为异常值:
df['mahalanobis'] = mahalanobis(df, df[['var1', 'var2', 'var3']])
df['p_value'] = 1 - chi2.cdf(df['mahalanobis'], 2)
df.head()
var1 var2 var3 mahalanobis p_value
0 -0.484272 -1.232702 -0.104978 2.972031 0.226272
1 -0.104346 0.439150 -0.324739 0.823351 0.662539
2 -0.764503 0.679031 1.786502 4.490658 0.105893
3 -1.551942 0.136850 0.557289 2.738988 0.254236
4 0.081988 -0.482199 -0.560156 0.386796 0.824154
但我想看看是否有一种方法可以只使用/修改 Scipy 函数来完成同样的事情。
1 -我认为您可以通过首先手动计算数据集的协方差矩阵来实现这一点。
2 -您还需要计算数据集的平均值,因为 M.距离测量每行与整个数据集的平均值的距离。
--马哈拉诺比斯计算:您需要将行的值、数据集的均值和协方差矩阵的逆矩阵传递到马哈拉诺比斯函数中,以计算每行的马哈拉诺比斯距离。 从这里您可以看到使用每行的卡方分布来确定离群值的 p 值,我的意思是如果该行是离群值。 我想我们以前都是这样做的。