Где я могу найти сумасшедшего (среднее абсолютное отклонение) у сципанта? - PullRequest
34 голосов
/ 19 января 2012

Кажется, Сципи однажды предоставил функцию mad для вычисления среднего абсолютного отклонения для набора чисел:

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

Однако я нигде не могу найти его в текущих версиях scipy. Конечно, можно просто скопировать старый код из репозитория, но я предпочитаю использовать версию scipy. Где я могу найти его, или он был заменен или удален?

Ответы [ 9 ]

42 голосов
/ 20 октября 2013

[РЕДАКТИРОВАТЬ] Так как это продолжает понижаться: я знаю, что медиана абсолютное отклонение является более часто используемой статистикой, но спрашивающий спросил среднее абсолютное отклонениекак это сделать:

from numpy import mean, absolute

def mad(data, axis=None):
    return mean(absolute(data - mean(data, axis)), axis)
30 голосов
/ 08 мая 2014

Для чего это стоит, я использую это для 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))
22 голосов
/ 16 ноября 2016

Текущая версия 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 явно.)

16 голосов
/ 20 января 2012

Похоже, scipy.stats.models был удален в августе 2008 года из-за недостаточного выпекания. Разработка перешла на statsmodels.

9 голосов
/ 19 июня 2017

Если вам нравится работать в Пандах (как я), у него есть полезная функция для среднего абсолютного отклонения :

import pandas as pd
df = pd.DataFrame()
df['a'] = [1, 1, 2, 2, 4, 6, 9]
df['a'].mad()

Выход: 2.3673469387755106

4 голосов
/ 25 февраля 2013

Это не версия scipy, но вот реализация MAD, использующая маскированные массивы для игнорирования неверных значений: http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py

Редактировать: более свежая версия доступна здесь .

Редактировать 2: есть также версия в астропии здесь .

3 голосов
/ 10 января 2018

Использование 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)
3 голосов
/ 05 мая 2016

Я только изучаю Python и Numpy, но вот код, который я написал, чтобы проверить домашнее задание по математике моего 7-го класса, в котором требовалось M (ean) AD из 2 наборов чисел:

Данные в матрице 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)
3 голосов
/ 21 апреля 2014

Я использую:

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