从集合中返回中间n(值不是索引)

wil*_*ill 7 c# linq algorithm

我有一个List<int>,我需要删除异常值,所以想要使用一种方法,我只采取中间n.我想要中间值,而不是索引.

例如,给定以下列表如果我想要中间80%我会期望11和100将被删除.

11,22,22,33,44,44,55,55,55,100.

在LINQ中有一个简单/内置的方法吗?

Eri*_*ert 11

我有一个List<int>,我需要删除异常值,所以想要使用一种方法,我只采取中间n.我想要中间值,而不是索引.

正确删除异常值完全取决于准确描述数据分布的统计模型 - 您没有为我们提供.

假设它是正态(高斯)分布,这就是你想要做的.

首先计算平均值.这很简单; 它只是总和除以项目数.

其次,计算标准偏差.标准差是衡量数据"分散"在平均值附近的指标.通过以下方式计算:

  • 从均值中得出每个点的差异
  • 平方差
  • 取平方的均值 - 这是方差
  • 取方差的平方根 - 这是标准差

在正态分布中,80%的项目在平均值的1.2标准偏差内.因此,例如,假设平均值为50,标准差为20.您可以预期80%的样本将介于50 - 1.2*20和50 + 1.2*20之间.然后您可以从列表中过滤掉项目超出该范围.

但请注意,这并不是删除"异常值".这是为了消除平均值超过1.2标准偏差的元素,以便在均值周围获得80%的间隔.在正态分布中,人们期望定期看到"异常值".99.73%的项目在平均值的三个标准偏差范围内,这意味着如果您有一千个观测值,那么在平均值之外看到两个或三个观测值超过三个标准偏差是完全正常的!事实上,在给出一千个观测结果时,在距离平均值超过三个标准偏差的任何地方,可能并不表示异常值.

我认为你需要非常仔细地定义你的异常值,并描述你为什么试图消除它们.看起来像异常值的东西可能根本不是异常值,它们是你应该注意的真实数据.

另请注意,如果正态分布不正确,则此分析均不正确!你可能会遇到很大的麻烦,消除看起来像异常值的东西,事实上你实际上已经弄错了整个统计模型.如果模型比正态分布更"尾重",那么异常值是常见的,而不是实际的异常值.小心!如果您的分布不正常,那么在我们建议如何识别异常值并消除它们之前,您需要告诉我们分布情况.


Don*_*nut 4

您可以使用该Enumerable.OrderBy方法对列表进行排序,然后使用Enumerable.SkipEnumerable.Take函数,例如:

var result = nums.OrderBy(x => x).Skip(1).Take(8);
Run Code Online (Sandbox Code Playgroud)

nums你的整数列表在哪里。

如果您只想要“中间值” ,那么弄清楚要用作参数的值Skip应该Take如下所示:n

nums.OrderBy(x => x).Skip((nums.Count - n) / 2).Take(n);
Run Code Online (Sandbox Code Playgroud)

但是,当 的结果(nums.Count - n) / 2不是整数时,您希望代码如何表现?