2012-01-19 25 views
25

Parece scipy vez que proporcionan una función mad para calcular la desviación absoluta media de un conjunto de números:¿Dónde puedo encontrar loco (desviación absoluta media) en scipy?

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

Sin embargo, no puedo encontrar en cualquier lugar en las versiones actuales de scipy. Por supuesto, es posible copiar el código anterior del repositorio, pero prefiero usar la versión de scipy. ¿Dónde puedo encontrarlo, o ha sido reemplazado o eliminado?

+1

Lo sentimos, una la búsqueda en el [repositorio de github] (https://github.com/scipy/scipy) no me dio nada. –

+1

¿Es tan difícil escribir desde cero? –

+2

@RomanSusi, no, pero como dije en la pregunta, ese no es el punto. –

Respuesta

12

La versión actual de statsmodels tiene mad en 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]) 

Tenga en cuenta que, de forma predeterminada, calcula la estimación robusta de la desviación estándar suponiendo una distribución normal al escalar el resultado un factor de escala; de help:

Signature: robust.mad(a, 
         c=0.67448975019608171, 
         axis=0, 
         center=<function median at 0x10ba6e5f0>) 

La versión en R hace una normalización similar. Si no quiere esto, simplemente configure c=1.

(Un comentario anterior mencionado en este ser statsmodels.robust.scale. La aplicación se encuentra en statsmodels/robust/scale.py (ver github) pero el paquete robust no exporta scale, en lugar de lo que exporta las funciones públicas en scale.py explícitamente.)

14

Parece que scipy.stats.models era removed en agosto de 2008 debido a la insuficiente cocción. El desarrollo migró al statsmodels.

+7

Sí, la mayoría de los viejos stats.models eran la base de scikits.statsmodels, después de mucha limpieza. MAD está en la página inferior aquí http://statsmodels.sourceforge.net/rlm.html como parte de la estimación robusta de los modelos lineales, pero nunca lo usé de forma independiente ya que son solo unas pocas líneas. – user333700

+4

El enlace de arriba está roto, así que encontré [este] (http://statsmodels.sourceforge.net/devel/generated/statsmodels.robust.scale.mad.html?highlight=median%20absolute%20deviation) en los modelos de estadísticas documentación. – gabra

29

[EDIT] Dado que este sigue siendo downvoted: Sé que mediana desviación absoluta es una estadística más comúnmente utilizada, pero el interlocutor solicitado decir desviación absoluta, y aquí está cómo hacerlo:

from numpy import mean, absolute 

def mad(data, axis=None): 
    return mean(absolute(data - mean(data, axis)), axis) 
2

que estoy usando:

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 
+0

Esto no funciona cuando el número de muestra es un número par. – heroxbd

20

por lo que su valor, lo uso para 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)) 
+0

Buena solución; sin embargo, el interlocutor preguntaba por la ** media ** desviación absoluta. Usted ha proporcionado la ** desviación absoluta ** mediana. –

2

Estoy aprendiendo de Python y Numpy, pero aquí está el código que he escrito para comprobar la tarea de matemáticas de mi séptimo grado, que quería que el (EAN) AD M de 2 series de números:

de datos en la matriz Numpy filas:

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

datos en Numpy 1D matrices:

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

Usando numpy solamente:

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