
# 随机异常值选择

> 译者：[flink.sojb.cn](https://flink.sojb.cn/)


## 描述

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

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

有关更多信息，请参阅[Jeroens Janssens](https://github.com/jeroenjanssens/phd-thesis)关于异常值选择和单类分类的[博士论文，](https://github.com/jeroenjanssens/phd-thesis)其中介绍了该算法。

## 参数

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

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

## 例



```
val data = env.fromCollection(List(
  LabeledVector(0.0, DenseVector(1.0, 1.0)),
  LabeledVector(1.0, DenseVector(2.0, 1.0)),
  LabeledVector(2.0, DenseVector(1.0, 2.0)),
  LabeledVector(3.0, DenseVector(2.0, 2.0)),
  LabeledVector(4.0, DenseVector(5.0, 8.0)) // The outlier! ))

val sos = new StochasticOutlierSelection().setPerplexity(3)

val outputVector = sos
  .transform(data)
  .collect()

val expectedOutputVector = Map(
  0 -> 0.2790094479202896,
  1 -> 0.25775014551682535,
  2 -> 0.22136130977995766,
  3 -> 0.12707053787018444,
  4 -> 0.9922779902453757 // The outlier! )

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年。

