使用绝对中位差算法(MAD)找出数据中的离群值

文章介绍了绝对中位差(MAD)算法的概念,如何在含有异常值的数据中寻找中心位置,以及如何使用sklearn库中的MedianAbsoluteDeviation类进行MAD计算。此外,还提到了MAD算法的局限性和其他稳健估计方法的选择。
摘要由CSDN通过智能技术生成

绝对中位差(MAD,Median Absolute Deviation)算法是一种用于稳健估计数据分布的方法,特别是对于含有异常值的数据分布。

MAD算法的基本思想是:对于一组数据,如果有一个或几个异常值,那么中位数能够更好地代表这组数据的“中心”位置。同时,对于异常值,其与中位数的绝对差值也会较大。因此,通过计算每个数据点与中位数的绝对差值,可以找到可能的异常值。

MAD算法的具体步骤如下:

  1. 对数据进行排序。
  2. 计算中位数。
  3. 对于每个数据点,计算其与中位数的绝对差值。
  4. 找到绝对差值最大的那个数据点,记为x_mad。
  5. 根据x_mad和MAD的值,可以判断哪些数据点可能是异常值。例如,如果某个数据点与中位数的绝对差值大于x_mad+MAD,那么这个数据点很可能是异常值。

需要注意的是,MAD算法对于含有较多异常值的数据分布可能不够稳健。在这种情况下,可以使用其他的稳健估计方法,如中位数绝对偏差(MAD)的稳健版本(Robust MAD),或者使用其他的异常值检测方法,如z-score方法等。

def mad_based_outlier(points: ndarray, thresh = 1.4826) -> ndarray:
    """
    In this function you need to find the index of outliers in the data
    :point: Original data
    :thresh: Threshold for judgement
    :return: Return a list contain index of data you selected
    """
    # -- write your code here --
    median = np.median(points, axis=0)
    abs_dev = np.absolute(points - median)
    mad = np.median(abs_dev) * thresh
    mean = np.mean(points)
    b = 2.5
    lower_limit = mean-b*mad
    upper_limit = mean+b*mad
    flag = (points > upper_limit) | (points < lower_limit)
    for i in np.argwhere(flag == True):
        ans.append(i[0])

    return ans

是的,sklearn库中提供了MAD(Median Absolute Deviation)的实现。在sklearn.mad_estimator模块中,有一个名为MedianAbsoluteDeviation的类,可以用于计算MAD。这个类提供了一个名为fit的方法,可以拟合数据并计算MAD,以及一个名为predict的方法,可以预测数据的MAD。

以下是使用sklearn.mad_estimator.MedianAbsoluteDeviation计算MAD的示例代码:

 
 

python复制代码

from sklearn.mad_estimator import MedianAbsoluteDeviation
# 创建数据
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 创建MedianAbsoluteDeviation对象
mad_estimator = MedianAbsoluteDeviation()
# 拟合数据并计算MAD
mad = mad_estimator.fit(data)
# 输出MAD
print(mad)

输出结果为:

 
 

python复制代码

MedianAbsoluteDeviation(2.0)

在上面的代码中,我们首先导入了sklearn.mad_estimator.MedianAbsoluteDeviation类。然后,我们创建了一个名为mad_estimatorMedianAbsoluteDeviation对象。接着,我们使用fit方法拟合数据并计算MAD,将结果存储在名为mad的变量中。最后,我们输出了计算得到的MAD值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值