2012-01-19 44 views
25

它似乎SciPy的一次提供的功能mad来计算一组数字的平均绝对偏差:我在哪里可以找到疯狂(平均绝对偏差)在scipy?

http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=3473

不过,我不能在任何地方的SciPy的当前版本中找到它。当然,可以从存储库复制旧代码,但我更喜欢使用scipy的版本。我在哪里可以找到它,或者它已被替换或删除?

+1

不好意思,在[github存储库](https://github.com/scipy/scipy)中搜索没有给我任何东西。 –

+1

从头开始编写它很难吗? –

+2

@RomanSusi,不,但正如我在问题中所说的,那不是重点。 –

回答

12

statsmodels的当前版本具有madstatsmodels.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出口的公共职能明确。)

14

由于烘烤不足,它看起来像2008年8月的scipy.stats.models为removed。开发已迁移到statsmodels

+7

是的,大部分旧的stats.models是scikits.statsmodels的基础,经过大量的清理。 MAD位于底部页面http://statsmodels.sourceforge.net/rlm.html作为线性模型的稳健估计的一部分,但我从未单独使用它,因为它只是几行。 – user333700

+4

上述链接已损坏,因此我在statsmodels上找到[this one](http://statsmodels.sourceforge.net/devel/generated/statsmodels.robust.scale.mad.html?highlight=median%20absolute%20deviation)文档。 – gabra

29

[编辑]由于这种不断得到downvoted:我知道平均绝对偏差是一个比较常用的统计数据,但要求提问意味着绝对偏差,这里是如何做到这一点:

from numpy import mean, absolute 

def mad(data, axis=None): 
    return mean(absolute(data - mean(data, axis)), axis) 
2

我使用:

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 
+0

当样本数为偶数时,这不起作用。 – heroxbd

20

对于它的价值,我用什么本作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)) 
+0

不错的解决方案;然而,提问者询问**平均**绝对偏差。你提供了**中位**绝对偏差。 –

2

我只是学习Python和NumPy的,但这里是我写检查哪曾想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的一维数组:

>>> 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) 
3

如果你喜欢在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

2

使用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)