在这篇文章中,我们将使用Spark MLlib开发Java中的算法。完整的工作代码可以从GitHub下载。可以在不使用深入的Java知识(使用配置文件)的情况下,用几种不同的配置和实验来运行代码。
高斯分布
本节简要介绍如何使用高斯函数进行异常检测。高斯密度函数具有钟形曲线形状,如下所示:
大部分数据的常规数据往往处于钟形曲线的中心,而边缘的异常更为罕见。与此同时,我们可以看到边缘上的点与中心点(接近0.4)相比具有更低的函数值(或者概率小于0.1)。
在这个例子之后,我们可以说每一个具有低于0.05的概率密度函数的例子都是异常的。当然,我们可以根据需要来控制阈值。大的值意味着更多的异常被标记,其中大部分可能不是异常。另一方面,小的值意味着我们可能错过异常,因为算法变得更加宽容。
上面的例子是一维的,数据只有一个特征。实际上,我们有更多的功能和维度的数据。为了将数据绘制到图中,我们使用主成分分析(PCA)将数据的维数减少到二维(2D)甚至三维(3D)。以下是两个维度的示例:
注意正常的数据在第一个和第二个圆的中间趋于一起,异常在第三个圆的边缘。图上的圆圈表示高斯钟形曲线如何在数据之间分布(通常,它将在3D中为钟形,但为了简单明了,以2D表示)。
为了在钟形图中的某个位置上举一个例子,我们需要计算两个分量:μ(均值)和σ2(方差)。一旦计算了均值和方差,我们可以应用一个相当简单的公式来得到新的例子的密度概率。如果概率低于某个特定值(σ),我们将其标记为异常;否则,这是正常的。在我以前的文章中查找关于开发的细节。
Spark和MLlib
本节提供Spark和MLlib的简要说明。
Spark
Apache Spark是一个集群计算框架。 Spark帮助我们在群集中的不同节点上并行执行作业,然后将这些结果合并成一个结果/响应。它将我们的数据集合转换为分布在集群节点(称为RDD(弹性分布式数据集))的元素集合。例如,在一个Java程序中,我们可以将一个集合转换成一个能够并行操作的RDD,如下所示:
并行集合被分割成分区,S