mad算法参考这篇博客:https://blog.csdn.net/dulingwen/article/details/97006884

MAD,即median absolute deviation,可译为绝对中位值偏差。其大致思想是通过判断每一个元素与中位值的偏差是否处于合理的范围内来判断该元素是否为离群值。具体方法如下:

(1)计算所有元素的中位值

(2)计算所有元素与中位值的绝对偏差:deviations;

(3)取得绝对偏差的中位值

(4)确定参数n,则可以对所有的数据作如下调整:

 

 

 

在这里我没有调整离群值,而是直接将其剔除了。

这里用C++算法实现:

//mad算法 去除离群值
std::vector<float> Mad(std::vector<float> nums,float s) {
    int n = nums.size();
    if (n<2)
    {
        return nums[0];
    }
    std::sort(nums.begin(), nums.end());
    float median=(n % 2 == 1)? nums[n / 2]: 
        (nums[n / 2] + nums[n / 2 - 1]) / 2;//中位数
    std::vector<float> deviations,new_nums;     //偏差值
    for (int i = 0; i < n; i++)
    {
        deviations.push_back(abs(nums[i] - median));
    }
    std::sort(deviations.begin(), deviations.end());
    float mad= (n % 2 == 1) ? deviations[n / 2] : 
        (deviations[n / 2] + deviations[n / 2 - 1]) / 2;
    for (size_t i = 0; i < n; i++)
    {
        if (abs(nums[i] - median) < s * mad)
            new_nums.push_back(nums[i]);
    }
    return new_nums;    
}

 

posted on 2021-04-22 10:05  月下叉猹  阅读(1876)  评论(0编辑  收藏  举报