它似乎SciPy的一次提供的功能mad
来计算一组数字的平均绝对偏差:我在哪里可以找到疯狂(平均绝对偏差)在scipy?
http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=3473
不过,我不能在任何地方的SciPy的当前版本中找到它。当然,可以从存储库复制旧代码,但我更喜欢使用scipy的版本。我在哪里可以找到它,或者它已被替换或删除?
它似乎SciPy的一次提供的功能mad
来计算一组数字的平均绝对偏差:我在哪里可以找到疯狂(平均绝对偏差)在scipy?
http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=3473
不过,我不能在任何地方的SciPy的当前版本中找到它。当然,可以从存储库复制旧代码,但我更喜欢使用scipy的版本。我在哪里可以找到它,或者它已被替换或删除?
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
出口的公共职能明确。)
由于烘烤不足,它看起来像2008年8月的scipy.stats.models为removed。开发已迁移到statsmodels
。
是的,大部分旧的stats.models是scikits.statsmodels的基础,经过大量的清理。 MAD位于底部页面http://statsmodels.sourceforge.net/rlm.html作为线性模型的稳健估计的一部分,但我从未单独使用它,因为它只是几行。 – user333700
上述链接已损坏,因此我在statsmodels上找到[this one](http://statsmodels.sourceforge.net/devel/generated/statsmodels.robust.scale.mad.html?highlight=median%20absolute%20deviation)文档。 – gabra
这不是SciPy的版本,但这里使用屏蔽阵列忽略坏值MAD的实现: http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py
编辑:最近的一个版本可用here。
编辑2:还有一个版本在astropy here。
[编辑]由于这种不断得到downvoted:我知道平均绝对偏差是一个比较常用的统计数据,但要求提问意味着绝对偏差,这里是如何做到这一点:
from numpy import mean, absolute
def mad(data, axis=None):
return mean(absolute(data - mean(data, axis)), axis)
我使用:
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
当样本数为偶数时,这不起作用。 – heroxbd
对于它的价值,我用什么本作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))
不错的解决方案;然而,提问者询问**平均**绝对偏差。你提供了**中位**绝对偏差。 –
我只是学习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)
如果你喜欢在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
使用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)
不好意思,在[github存储库](https://github.com/scipy/scipy)中搜索没有给我任何东西。 –
从头开始编写它很难吗? –
@RomanSusi,不,但正如我在问题中所说的,那不是重点。 –