我有一个方法可以返回一个我无法信任的数字列表,因为有时我会得到一个不准确的数字。举个例子:
var nums = new List<double> {675,596,125278,490,545,567,470};
125278值显然是一个异常现象,有人可以帮助设计一种方法,根据其他数据摆脱列表中完全超出范围的所有数字吗?
目前我正在订购列表,然后获得中位数,但有时这已失败。没有数字应该超过36000左右。
一个想法是返回最低值?但理想情况下,我想返回列表中不是“异常”的最后一个数字,例如从上面的列表中应该返回470.
答案 0 :(得分:1)
如果不是异常意味着低于36000,那么试试这个:
var notanomally = nums.Where(x=>x<36000); // lower than 36k
var lastnotanomally = notanomally.Last();
答案 1 :(得分:0)
这不是一种非常有效的方法,但你可以尝试这样的方法。
var nums = new List<double> { 675, 596, 125278, 490, 545, 567, 470 };
var removing = new List<double>();
var temp = new List<double>();
double EPSILON = 5000;
foreach (var num in nums)
{
var average = nums.Average();
temp = nums.Where(n => n != num).ToList();
var average1 = temp.Average();
if (Math.Abs(average1 - average) > EPSILON)
{
removing.Add(num);
}
}
nums.RemoveAll(n=>removing.Contains(n));
此方法暂时删除元素并观察平均值的变化。平均值的显着变化意味着当前值远远大于其他值。