40

scipyはかつてmad、一連の数値の平均絶対偏差を計算する関数を提供していたようです。

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

ただし、現在のバージョンのscipyではどこにも見つかりません。もちろん、リポジトリから古いコードをコピーすることも可能ですが、私はscipyのバージョンを使用することを好みます。どこで見つけることができますか、または交換または削除されましたか?

4

10 に答える 10

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))
于 2014-05-08T07:56:02.930 に答える
28

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

バージョン inRも同様の正規化を行います。これを望まない場合は、明らかに set を設定してc=1ください。

(以前のコメントでは、これは にあると述べられていましたstatsmodels.robust.scale。実装は にありますがstatsmodels/robust/scale.py( githubを参照)、robustパッケージはエクスポートせずscale、パブリック関数をscale.py明示的にエクスポートします。)

于 2016-11-15T21:02:40.410 に答える
16

ベーキングが不十分なため、2008年8月にscipy.stats.modelsが削除されたようです。開発はに移行しましたstatsmodels

于 2012-01-19T21:47:04.873 に答える
4

これは scipy バージョンではありませんが、マスクされた配列を使用して不適切な値を無視する MAD の実装を次に示します: http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py

編集:より最近のバージョンはこちらから入手できます。

編集 2: astropy hereのバージョンもあります。

于 2013-02-25T17:33:38.960 に答える
3

私はちょうど Python と Numpy を学んでいますが、2 組の数値の M(ean)AD が必要な 7 年生の数学の宿題をチェックするために書いたコードを次に示します。

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)
于 2016-05-05T05:17:43.180 に答える