2017-07-31 53 views
1

我正在处理流式数据(使用Java和Apache Flink),我想执行异常值检测。我有一个网络,每个传感器接收流。 然后,他们将其流的采样版本发送到组合所有样本并生成全局模型的“领导者”节点。基于模型的增量式异常值检测

之后,它将全局模型发送给每个孩子。孩子们将使用这个模型来检测异常值。 这必须以连续的方式发生(即每次领导者接收x个样本时,其更新模型并广播它)。

我发现的论文/方法遇到的问题是,为了构建模型,我需要拥有所有数据,这是不可能的。领导者也不可能存储它收到的所有样本。

我写了一个小例子:

传感器A接收到一些数据并将其发送到领导

传感器B接收的一些数据并将其发送到领导

领域的领导者使用收到值来构建广播的模型。

两个传感器接收其他数据,对于每个值,他们使用接收到的模型执行异常值检测。 然后他们将新数据发送给领导。

领导者更新模型并将新的更新模型发送给子女。

我可以使用哪种方法来获得这样的行为?

回答

0

解决这个问题的方法是让领导将模型更新写入Kafka主题,并让A和B读取来自Kafka的模型更新(除传感器流之外)。

更新:

一个相当简单的算法,用于检测孤立点/异常那是非常适合于流是叔消化(是的,它的工作原理增量)。 This page from mapr会带你到更多的信息。

+0

是的,我完全是这样做的。我在问你是否知道任何可用于此目的的异常值检测模型。特别是,应该可以逐步更新模型。 – LizardKing

+0

我已经更新了我的上面的答案,建议使用t-digest。 –

+0

谢谢!我一直在研究t-digest,但它似乎用于计算阈值(http://koff.io/posts/using-t-digest/)。我不知道如何在我的数据流中使用它来找出异常,根据我的理解,我应该使用一个模型,然后使用t-digest给出的阈值(如本项目https:// github .com/pollo/anomaly_detection/blob/master/src/main/java/org/apache/mahout/anomalydetection/EKGAnomalyDetection.java,但问题在于该模型不可序列化并且不能逐步运行)。 – LizardKing