排除python

时间:2017-12-09 10:16:12

标签: python statistics knn

我在这里有一个数字列表,需要在找到最能解释方差的数字/数字之前进行处理。在这种情况下,很明显1b和-1b应该被删除,因为它们会扭曲数据的std dev。排除后,我们看到应选择-998,523和-2,000,126,因为它们可以解释剩余数字总和的99%。 编辑这两个数字是我正在寻找的;他们不应被排除在外

这里的问题是排除异常值的最佳方法是什么?我在考虑K-最近邻居,但这似乎有点矫枉过正。尝试过IQR似乎效果不佳。

提前致谢!

 1,000,000,000  
 4                0%
 41               0%
 20               0%
-89               0%
-441              0%
-100,005          3%
-998,523          33%
-2,000,126        66%
 51,651          -2%
 5,176            0%
-1,000,000,000  

1 个答案:

答案 0 :(得分:0)

您可以选择最大的异常值作为与平均值最远的值;删除此值,找到下一个最大的异常值等...

def largest_outlier(nums):

    avg = sum(nums) / len(nums)
    delta = [abs(num-avg) for num in nums]
    outlier = max(nums, key=lambda x=delta: abs(x))

    return outlier


nums = [4 ,41, 20, -89, -441, -100005, -998523, -2000126 , 51651, 5176]
numbers = nums[:]

while numbers:
    outlier = largest_outlier(numbers)
    numbers.pop(numbers.index(outlier))
    print(outlier, numbers)

输出:

-2000126 [4, 41, 20, -89, -441, -100005, -998523, 51651, 5176]
-998523 [4, 41, 20, -89, -441, -100005, 51651, 5176]
-100005 [4, 41, 20, -89, -441, 51651, 5176]
51651 [4, 41, 20, -89, -441, 5176]
5176 [4, 41, 20, -89, -441]
-441 [4, 41, 20, -89]
-89 [4, 41, 20]
41 [4, 20]
20 [4]
4 []