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