如何使用 Scipy Mahalanobis 距离实现进行异常值检测?

问题描述 投票:0回答:1

我有一个 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 函数来完成同样的事情。

python pandas scipy statistics mahalanobis
1个回答
0
投票

1 -我认为您可以通过首先手动计算数据集的协方差矩阵来实现这一点。

2 -您还需要计算数据集的平均值,因为 M.距离测量每行与整个数据集的平均值的距离。

--马哈拉诺比斯计算:您需要将行的值、数据集的均值和协方差矩阵的逆矩阵传递到马哈拉诺比斯函数中,以计算每行的马哈拉诺比斯距离。 从这里您可以看到使用每行的卡方分布来确定离群值的 p 值,我的意思是如果该行是离群值。 我想我们以前都是这样做的。

© www.soinside.com 2019 - 2024. All rights reserved.