scipy.stats.

median_abs_deviation#

scipy.stats.median_abs_deviation(x, axis=0, center=<function median>, scale=1.0, nan_policy='propagate')[source]#

计算给定轴上数据的中位数绝对偏差。

中位数绝对偏差 (MAD, [1]) 计算的是相对于中位数的绝对偏差的中位数。 它是类似于标准偏差的离散度量,但对异常值更稳健 [2]

空数组的 MAD 为 np.nan

1.5.0 版本中新增。

参数:
xarray_like

输入数组或可以转换为数组的对象。

axisint 或 None, 可选

计算范围所沿的轴。默认为 0。如果为 None,则计算整个数组的 MAD。

centercallable, 可选

一个将返回中心值的函数。 默认是使用 np.median。 任何用户定义的函数都需要具有函数签名 func(arr, axis)

scalescalar 或 str, 可选

比例的数值将从最终结果中除掉。 默认为 1.0。 也接受字符串“normal”,它会导致 scale 为 0.75 处的标准正态分位数函数的倒数,大约为 0.67449。 也允许使用类似数组的比例,只要它能正确地广播到输出,使得 out / scale 是一个有效的操作。 输出维度取决于输入数组 xaxis 参数。

nan_policy{‘propagate’, ‘raise’, ‘omit’}, 可选

定义如何处理输入包含 nan 时的情况。 以下选项可用(默认为“propagate”)

  • “propagate”:返回 nan

  • “raise”:抛出错误

  • “omit”:执行计算时忽略 nan 值

返回:
madscalar 或 ndarray

如果 axis=None,则返回一个标量。 如果输入包含整数或精度小于 np.float64 的浮点数,则输出数据类型为 np.float64。 否则,输出数据类型与输入的数据类型相同。

备注

center 参数仅影响用于计算 MAD 的中心值的计算。 也就是说,传入 center=np.mean 将计算平均值周围的 MAD - 它不会计算平均绝对偏差。

输入数组可能包含 inf,但如果 center 返回 inf,则该数据的相应 MAD 将为 nan

参考文献

示例

当将 median_abs_deviation 的行为与 np.std 进行比较时,后者会受到影响,当我们更改数组的单个值以使其具有异常值时,MAD 几乎没有变化

>>> import numpy as np
>>> from scipy import stats
>>> x = stats.norm.rvs(size=100, scale=1, random_state=123456)
>>> x.std()
0.9973906394005013
>>> stats.median_abs_deviation(x)
0.82832610097857
>>> x[0] = 345.6
>>> x.std()
34.42304872314415
>>> stats.median_abs_deviation(x)
0.8323442311590675

轴处理示例

>>> x = np.array([[10, 7, 4], [3, 2, 1]])
>>> x
array([[10,  7,  4],
       [ 3,  2,  1]])
>>> stats.median_abs_deviation(x)
array([3.5, 2.5, 1.5])
>>> stats.median_abs_deviation(x, axis=None)
2.0

比例正态示例

>>> x = stats.norm.rvs(size=1000000, scale=2, random_state=123456)
>>> stats.median_abs_deviation(x)
1.3487398527041636
>>> stats.median_abs_deviation(x, scale='normal')
1.9996446978061115