Scipyは、一連の数値の平均絶対偏差を計算する関数mad
を提供していたようです。
http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=347
しかし、私は現在のバージョンのscipyでそれを見つけることができません。もちろん、リポジトリから古いコードをコピーするだけでも可能ですが、私はscipyのバージョンを使用することを好みます。どこで見つけることができますか、または交換または削除されましたか?
statsmodels の現在のバージョンには、statsmodels.robust
にmad
があります。
>>> 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
のパブリック関数を明示的にエクスポートします。
[編集]これは引き続き投票されるので、中央値絶対偏差はより一般的に使用される統計ですが、質問者は平均絶対偏差を求めました。それをするために:
from numpy import mean, absolute
def mad(data, axis=None):
return mean(absolute(data - mean(data, axis)), axis)
その価値のために、私はこれを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))
Scipy.stats.modelsは、ベーキングが不十分なため、2008年8月に 削除済み であったようです。開発は statsmodels
に移行しました。
それはscipyバージョンではありませんが、ここでは悪い値を無視するためにマスク配列を使用したMADの実装があります: http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py
編集:より新しいバージョンが利用可能です here 。
編集2:アストロピーのバージョンもあります here 。
私は使用しています:
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
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)
私はただPythonとNumpyを学んでいますが、2セットの数値のM(ean)ADが必要な7年生の数学の宿題をチェックするために書いたコードは次のとおりです。
ナンピー行列行のデータ:
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)