【发布时间】:2011-08-08 01:00:22
【问题描述】:
我有一个List<int>,我需要删除异常值,所以我想使用一种只取中间 n 的方法。我想要中间的值,而不是索引。
例如,给定以下列表,如果我想要中间的 80%,我希望删除 11 和 100。
11,22,22,33,44,44,55,55,55,100。
在 LINQ 中是否有一种简单/内置的方法可以做到这一点?
【问题讨论】:
-
当你想要集合 1,2,3 的中间 80% 时应该发生什么?结果会是 2 吗?
-
这并没有让我感到震惊,因为它甚至接近统计上有效的去除异常值的方法。您的先验统计模型是什么?它是正态分布的吗?如果是这样,那么这种技术如何考虑三西格玛规则?这整件事让我觉得完全狡猾。为什么“11”在这里是异常值?如果您将这些数据绘制成图表,它似乎不会超出您想到的任何特定模型。你能告诉我们更多关于你在这里尝试做什么的细节吗?为什么?这看起来真的很奇怪。
-
@Eric:这当然不奇怪。例如,它可能是计算Truncated mean 的准备步骤。这是一种防止在较小集合中操纵平均值的常用技术 - 例如,它用于计算 LIBOR。
-
@Ani:好点子。也许“离奇”太强了。但是知道代码的目的是什么以及预期的分布是什么肯定会有所帮助。如果目标是在花样滑冰决赛中丢掉最低和最高分,我真的不在乎。如果被删除的异常值与制造过程或影响人类生命安全的决策有关,或者是某些财务计算的一部分,那么情况就更严重了。未能正确管理异常统计数据已经摧毁了公司。
-
@Jason:例子比比皆是。最近福岛核电站的大规模安全壳失效; 9 级地震并非之前假设的异常值。由于未能了解峰态风险而对长期资本管理公司进行救助。挑战者号航天飞机的毁坏是由于未能理解低温下对重要 O 环造成的漏气损坏并非异常。事实证明,即使是聪明的人也非常不善于理解异常值,结果导致人们死亡。