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