Где я могу найти безумное (среднее абсолютное отклонение) в scipy?
Кажется, что scipy предоставил функцию mad
для вычисления среднего абсолютного отклонения для набора чисел:
http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=3473
Однако я не могу найти его нигде в текущих версиях scipy. Конечно, можно просто скопировать старый код из репозитория, но я предпочитаю использовать scipy версию. Где я могу найти его, или он был заменен или удален?
Ответы
Ответ 1
Текущая версия 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
явно).
Ответ 2
[EDIT] Поскольку это продолжает снижаться: я знаю, что медианное абсолютное отклонение является более часто используемой статистикой, но задающий вопрос задал среднее абсолютное отклонение, и вот как это сделать:
from numpy import mean, absolute
def mad(data, axis=None):
return mean(absolute(data - mean(data, axis)), axis)
Ответ 3
Для чего это стоит, я использую это для 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))
Ответ 4
Похоже, что scipy.stats.models был удален в августе 2008 года из-за недостаточной выпечки. Разработка перенесена на statsmodels
.
Ответ 5
Это не scipy-версия, но здесь реализация MAD с использованием маскированных массивов для игнорирования плохих значений:
http://code.google.com/p/agpy/source/browse/trunk/agpy/mad.py
Изменить: доступна более новая версия здесь.
Изменить 2: Здесь также версия в астрологии здесь.
Ответ 6
Если вам нравится работать в Pandas (как и я), у него есть полезный для среднего абсолютного отклонения:
import pandas as pd
df = pd.DataFrame()
df['a'] = [1, 1, 2, 2, 4, 6, 9]
df['a'].mad()
Выход: 2.3673469387755106
Ответ 7
Я использую:
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
Ответ 8
Я просто изучаю Python и Numpy, но вот код, который я написал, чтобы проверить мою домашнюю работу по математике 7-го класса, которая хотела 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 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)