在 scipy 中哪里可以找到 mad(平均绝对偏差)?

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

似乎 scipy 曾经提供了一个函数

mad
来计算一组数字的平均绝对偏差:

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

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

python scipy statsmodels
11个回答
61
投票

[编辑]由于这不断被否决:我知道median绝对偏差是更常用的统计数据,但提问者要求mean绝对偏差,这是如何做到的:

from numpy import mean, absolute

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

36
投票

就其价值而言,我将其用于 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))

31
投票

当前版本的 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
中的公共函数) .)


17
投票

看起来 scipy.stats.models 由于烘焙不足而于 2008 年 8 月被“删除”。开发已迁移至statsmodels


11
投票
Pandas

中工作(就像我一样),它有一个有用的 平均绝对偏差函数 import pandas as pd df = pd.DataFrame() df['a'] = [1, 1, 2, 2, 4, 6, 9] df['a'].mad()

输出:2.3673469387755106


4
投票
http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py

编辑:可在

此处

获取最新版本。 编辑2:astropy 中也有一个版本

这里


3
投票

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
投票
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)



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
投票

https://docs.scipy.org/doc/scipy/reference/ generated/scipy.stats.median_abs_deviation.html

计算数据沿给定轴的中值绝对偏差。


0
投票
scipy.stats.median_abs_deviation

中的中心函数从中位数更改为均值(

https://docs.scipy.org/doc/scipy/reference/ generated/scipy.stats.median_abs_deviation.html
scipy.stats.median_abs_deviation(values, center=numpy.mean)

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