我在这里有一个数字列表,需要在找到最能解释方差的数字/数字之前进行处理。在这种情况下,很明显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
答案 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 []