C++去除离群值 MAD算法


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;    
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM