非常小的集合中的异常值检测

机器算法验证 分类 异常值 算法
2022-01-26 05:33:30

在给定十二个样本光度值的情况下,我需要尽可能准确地获得主要稳定光源的亮度值。传感器不完善,光线偶尔会“闪烁”更亮或更暗,这可以忽略不计,因此我需要异常值检测(我认为?)。

我已经在这里阅读了各种方法,但无法决定采用哪种方法。异常值的数量永远不会提前知道,并且通常为零。闪烁通常与稳定亮度有很大的偏差(足以真正弄乱在大亮度下拍摄的任何平均值),但不一定如此。

这是一个包含 12 个测量值的样本集,以确保问题的完整性:

295.5214、277.7749、274.6538、272.5897、271.0733、292.5856、282.0986、275.0419、273.084、273.1783、274.0317、290.1837

我的直觉是该特定集合中可能没有异常值,尽管 292 和 295 看起来有点高。

所以,我的问题是,这里最好的方法是什么?我应该提到,这些值来自从零(黑)点获取光的 RG 和 B 分量的欧几里得距离。如果需要,返回到这些值在编程上会很痛苦,但有可能。欧几里得距离被用作“整体强度”的衡量标准,因为我对颜色不感兴趣,只对输出强度感兴趣。但是,我提到的闪烁很有可能与通常的输出具有不同的 RGB 成分。

目前,我正在玩弄某种功能,该功能将重复,直到通过以下方式达到允许措施的稳定成员资格:

  1. 找到标准差
  2. 将 2 个 SD 之外的所有内容放入忽略列表
  3. 在排除忽略列表的情况下重新计算平均值和 SD
  4. 根据新的平均值和 SD 重新决定忽略谁(评估所有 12 个)
  5. 重复直到稳定。

这种方法有什么价值吗?

感激地接受所有评论!

3个回答

小样本中的异常值总是很难检测到。在大多数情况下,实际上我会主张,如果您认为您的数据没有直接损坏,那么“异常”值可能不会有问题,并且将其排除可能是不合理的。可能使用稳健的统计技术会更明智,更接近中间解决方案。你有一个小样本;尝试使每个样本点计数。:)

关于您建议的方法:我不会匆忙对您的数据使用 68-95-99.7 规则强制执行正态假设(就像您似乎以某种方式使用 2SD 启发式规则所做的那样)。Chebyshev 的不等式曾经假设对它们有 75-88.9-93.8 规则,这显然不那么严格。其他“规则”也存在;维基百科异常值引理中的定义和检测部分有一系列启发式方法。

这是另一本:我在此问题上遇到的免费书籍参考, NIST/SEMATECH e-Handbook of Statistical Methods,提出了 Iglewicz 和 Hoaglin (1993) 的以下想法:使用修改后的 -scores使得:ZM

Mi=.6745(xix~)/MAD

其中是您的中位数,MAD 是您的样本的中位数绝对偏差的绝对值高于 3.5 是潜在的异常值。这是一个半参数建议(大多数都是,这里的参数)。在您的示例情况下,它会略微排除您的 295.5 但清楚地保留您的 292.6 测量值......(对于有价值的事情,我不会从您的示例案例中排除任何值。)x~M3.5

同样,鉴于您的样本非常小,如果您认为您的样本没有明显损坏(人类 9'4" 高),我建议您不要仓促排除数据。您的“可疑异常值”可能是未损坏的数据;它们的使用实际上可以帮助而不是损害您的分析。

指出第一点 - 可能值得回到 rgb 颜色。丢弃数据很少有好处,并且 rgb 向量的大小并不是表示亮度的唯一方法 -感知亮度是不同的,HSV中的值也是如此。

但是把它放在一边并处理你拥有的数据,你是否考虑过将其形成为分类问题而不是建模问题,并进行一些机器学习?您有一个输入,它是一个包含 12 个实数值的向量(亮度读数)。你有一个输出,它是一个由 12 个二进制值组成的向量(1=inlier,0=outlier)。获取几组亮度读数并自己手动标记它们,显示每组中的哪个亮度读数是内部值/异常值。像这样的东西:

x1 = {212.0, 209.6, 211.5, , 213.0}, y1 = {1,0,1, ,1}

x2 = {208.1, 207.9, 211.2, , 208.2}, y2 = {1,1,0, ,1}

x3 = {223.4, 222.9, 222.8, , 223.0}, y3 = {1,1,1, ,1}

然后,通过某种分类器运行整个过程:

  • 您可以使用输出 12 个不同二进制值的单个分类器 - 神经网络可以让您非常轻松地进行设置。
  • 或者,您可以使用标准的二元分类器(例如SVMlite)并训练 12 个不同的模型,其中一个对输出的每个元素是否为内点/异常值进行分类。

你完成了!无需大惊小怪地尝试自己找到将内点与异常值区分开来的“规则”。只需获取几组看起来合理的数据,然后让机器为您做这些:)

~~~

编辑:顺便说一句,您提出的方法(迭代地拟合高斯然后将每个样本分类为离群值超过 2 个标准差)看起来很像期望最大化算法。像这样的东西:

  • 单个高斯分量(内点建模)
  • 一个统一的背景成分(离群值)
  • 每个的一些先验概率以不明显的方式取决于高斯的宽度(“以 2 个标准偏差分类”规则)。
  • 期望步骤的硬分类。

如果您确实走这条路,则可能值得搜索 EM 算法并检查您在模型中构建的假设。

Dixon 对非常小的数据集中异常值的 Q 检验似乎很适合这种情况:

http://en.wikipedia.org/wiki/Dixon%27s_Q_test

http://www.chem.uoa.gr/applet/AppletQtest/Text_Qtest2.htm