随机异常值选择

描述

异常值是一个或多个观察值,它们与大多数数据集定量偏离,可能是进一步调查的主题。由Jeroen Janssens [1]开发的随机异常值选择(SOS)是一种无监督的离群值选择算法,它将一组向量作为输入。该算法应用基于亲和力的离群值选择,并为每个数据点输出异常值概率。直观地,当其他数据点与它的亲和力不足时,数据点被认为是异常值。

异常值检测在许多领域都有应用,例如,日志分析,欺诈检测,噪声消除,新颖性检测,质量控制,传感器监测等。如果传感器出现故障,很可能会输出偏离的值明显地来自多数人。

有关更多信息,请参阅Jeroens Janssens关于异常值选择和单类分类博士论文,其中介绍了该算法。

参数

随机离群值选择算法的实现可以通过以下参数控制:

参数描述
困惑困惑可以解释为k近邻算法中的k。与SOS作为邻居的区别不是二元属性,而是概率属性,因此它是实数。必须介于1和n-1之间,其中n是点数。通过使用观察数量的平方根可以获得良好的起点。(默认值:30
ErrorTolerance接受的误差容限,以在近似亲和力时Reduce计算时间。它会牺牲精度以换取Reduce的计算时间。(默认值:1e-20
MaxIterations用于近似算法亲和度的最大迭代次数。(默认值:10

  1. val data = env.fromCollection(List(
  2. LabeledVector(0.0, DenseVector(1.0, 1.0)),
  3. LabeledVector(1.0, DenseVector(2.0, 1.0)),
  4. LabeledVector(2.0, DenseVector(1.0, 2.0)),
  5. LabeledVector(3.0, DenseVector(2.0, 2.0)),
  6. LabeledVector(4.0, DenseVector(5.0, 8.0)) // The outlier!
  7. ))
  8. val sos = new StochasticOutlierSelection().setPerplexity(3)
  9. val outputVector = sos
  10. .transform(data)
  11. .collect()
  12. val expectedOutputVector = Map(
  13. 0 -> 0.2790094479202896,
  14. 1 -> 0.25775014551682535,
  15. 2 -> 0.22136130977995766,
  16. 3 -> 0.12707053787018444,
  17. 4 -> 0.9922779902453757 // The outlier!
  18. )
  19. outputVector.foreach(output => expectedOutputVector(output._1) should be(output._2))

参考

[1] JHM Janssens,F。Huszar,EO Postma和HJ van den Herik。随机异常值选择技术报告TiCC TR 2012-001,蒂尔堡大学,蒂尔堡,荷兰,2012年。