似乎scipy曾提供函数mad
来计算一组数字的平均绝对偏差:
http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=3473
然而,在目前的scipy版本中,我无法找到它。当然可以从存储库中复制旧代码,但我更喜欢使用scipy的版本。我在哪里可以找到它,或者它已被替换或删除?
答案 0 :(得分:42)
[编辑]因为这继续被投票:我知道中位数绝对偏差是一个更常用的统计数据,但提问者要求平均值绝对偏差,以下是如何做到这一点:
from numpy import mean, absolute
def mad(data, axis=None):
return mean(absolute(data - mean(data, axis)), axis)
答案 1 :(得分:29)
为了它的价值,我将它用于MAD:
def mad(arr):
""" Median Absolute Deviation: a "Robust" version of standard deviation.
Indices variabililty of the sample.
https://en.wikipedia.org/wiki/Median_absolute_deviation
"""
arr = np.ma.array(arr).compressed() # should be faster to not use masked arrays.
med = np.median(arr)
return np.median(np.abs(arr - med))
答案 2 :(得分:22)
当前版本的statsmodels在mad
中有statsmodels.robust
:
>>> import numpy as np
>>> from statsmodels import robust
>>> a = np.matrix( [
... [ 80, 76, 77, 78, 79, 81, 76, 77, 79, 84, 75, 79, 76, 78 ],
... [ 66, 69, 76, 72, 79, 77, 74, 77, 71, 79, 74, 66, 67, 73 ]
... ], dtype=float )
>>> robust.mad(a, axis=1)
array([ 2.22390333, 5.18910776])
注意,默认情况下,这会通过将结果缩放比例因子来计算标准偏差的稳健估计值,假设正态分布;来自help
:
Signature: robust.mad(a,
c=0.67448975019608171,
axis=0,
center=<function median at 0x10ba6e5f0>)
R
中的版本进行了类似的规范化。如果你不想要这个,显然只需设置c=1
。
(之前的评论提到这是statsmodels.robust.scale
。实施位于statsmodels/robust/scale.py
(请参阅github),但robust
包不会导出scale
而是明确地在scale.py
中导出公共函数。)
答案 3 :(得分:16)
由于烘焙不足,2008年8月看起来scipy.stats.models为removed。开发已迁移到statsmodels
。
答案 4 :(得分:9)
如果您喜欢Pandas(就像我一样),那么它有一个有用的function for the mean absolute deviation:
import pandas as pd
df = pd.DataFrame()
df['a'] = [1, 1, 2, 2, 4, 6, 9]
df['a'].mad()
输出:2.3673469387755106
答案 5 :(得分:4)
这不是scipy版本,但这是MAD的一个实现,使用掩码数组来忽略坏值: http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py
编辑:可以使用更新的版本here。
编辑2:星座here中还有一个版本。
答案 6 :(得分:3)
我正在使用:
from math import fabs
a = [1, 1, 2, 2, 4, 6, 9]
median = sorted(a)[len(a)//2]
for b in a:
mad = fabs(b - median)
print b,mad
答案 7 :(得分:3)
我只是在学习Python和Numpy,但这里是我编写的代码,用于检查我的7年级学生的数学作业,该作业需要2组数字的M(ean)AD:
Numpy矩阵行中的数据:
import numpy as np
>>> a = np.matrix( [ [ 80, 76, 77, 78, 79, 81, 76, 77, 79, 84, 75, 79, 76, 78 ], \\
... [ 66, 69, 76, 72, 79, 77, 74, 77, 71, 79, 74, 66, 67, 73 ] ], dtype=float )
>>> matMad = np.mean( np.abs( np.tile( np.mean( a, axis=1 ), ( 1, a.shape[1] ) ) - a ), axis=1 )
>>> matMad
matrix([[ 1.81632653],
[ 3.73469388]])
Numpy 1D阵列中的数据:
>>> a1 = np.array( [ 80, 76, 77, 78, 79, 81, 76, 77, 79, 84, 75, 79, 76, 78 ], dtype=float )
>>> a2 = np.array( [ 66, 69, 76, 72, 79, 77, 74, 77, 71, 79, 74, 66, 67, 73 ], dtype=float )
>>> madA1 = np.mean( np.abs( np.tile( np.mean( a1 ), ( 1, len( a1 ) ) ) - a1 ) )
>>> madA2 = np.mean( np.abs( np.tile( np.mean( a2 ), ( 1, len( a2 ) ) ) - a2 ) )
>>> madA1, madA2
(1.816326530612244, 3.7346938775510199)
答案 8 :(得分:3)
仅使用numpy
:
def meanDeviation(numpyArray):
mean = np.mean(numpyArray)
f = lambda x: abs(x - mean)
vf = np.vectorize(f)
return (np.add.reduce(vf(numpyArray))) / len(numpyArray)
答案 9 :(得分:0)