熊猫、scipy和numpy中的MAD结果不同

9

我想计算 MAD(中位数绝对偏差),其定义为

MAD = median(|x_i - mean(x)|)

x 数字列表:
x = list(range(0, 10)) + [1000]

然而,使用 numpypandas 和手动实现的结果有很大差异:
from scipy import stats
import pandas as pd
import numpy as np

print(stats.median_absolute_deviation(x, scale=1)) # prints 3.0

print(pd.Series(x).mad()) # prints 164.54

print(np.median(np.absolute(x - np.mean(x)))) # prints 91.0

有什么问题吗?


3
pd.Series().mad()返回的是平均绝对偏差,而不是你期望的中位数绝对偏差。 - Nayak S
哦,该死。 :) 其他人怎么样? - Michael Dorner
scipy.stats的实现是正确的。你手动编写的实现需要按照Mykola的答案进行更改。 - Nayak S
最后一个应该是np.median(np.absolute(x - np.median(x)))。而第一个公式也是错误的。 - eregon
2个回答

20

中位数绝对偏差的定义如下:

median(|x_i - median(x)|

Pandas中的方法mad返回平均绝对偏差。您可以使用以下方法计算MAD:

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1000]

stats.median_absolute_deviation(x, scale=1)
# 3.0

np.median(np.absolute(x - np.median(x)))
# 3.0

x = pd.Series(x)
(x - x.median()).abs().median()
# 3.0

谢谢你的回答。你是对的,虽然我认为命名有点令人困惑(至少对我来说是这样)。那么scipy呢? - Michael Dorner
1
Scipy 应该没问题。 - Mykola Zotko

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接