我编写了自己的LOF实现,并且我试图将结果与ELKI和RapidMiner中的实现进行比较,但所有3都给出了不同的结果!我想弄清楚原因。
我的参考数据集是一维的102个实数值,有许多重复。我会尝试在下面发布。
首先,RapidMiner实现。 LOF分数与ELKI和我的结果大不相同;许多人带着无穷大的LOF回来。此实施是否已经过验证是正确的?
我的结果与ELKI类似,但我没有得到完全相同的LOF值。通过快速扫描ELKI源代码中的注释,我认为这可能是因为计算k邻域的方式不同。
在LOF文件中,MinPts参数(在别处称为k)指定最小值。要包括在k-neighborhood中的点数。在ELKI实现中,我认为他们将k邻域定义为k个点而不是k距离或k个不同距离内的所有点。任何人都可以确切地确认ELKI如何构建k-neighborhood?还有一个私有变量允许点本身包含在它自己的邻域中,但看起来默认不包含它。
是否有人知道附加了LOF分数的公共参考数据集用于验证目的?
---更多细节如下---
参考:ELKI源代码在这里:
http://elki.dbs.ifi.lmu.de/browser/elki/trunk/src/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/LOF.java
RapidMiner源代码在这里:
这是我的测试数据集:
4.32323 5.12595 5.12595 5.12595 5.12595 5.7457 5.7457 5.7457 5.7457 5.7457 5.7457 5.97766 5.97766 6.07352 6.07352 6.12015 6.12015 6.12015 6.44797 6.44797 6.48131 6.48131 6.48131 6.48131 6.48131 6.48131 6.6333 6.6333 6.6333 6.70872 6.70872 6.70872 6.70872 6.70872 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.10361 7.10361 7.10361 7.10361 7.10361 7.10361 7.10361 7.10361 7.15651 7.15651 7.15651 7.15651 7.15651 7.15651 7.15651 7.15651 8.22598 8.22598 8.22598 8.22598 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538 8.5538
例如,我得到第一个数字(4.32323)的以下LOF分数:
关于我的实施正在做什么的更多细节:
答案 0 :(得分:6)
我实际上并不感到惊讶他们的不同。您还可以添加Weka的LOF实现,您可能会得到另一个答案。
这是您添加到方程式的另一个区别:据我所知,快速实现器实现合并具有相同坐标的点。但也许,他们忘记在计算最近的邻居时考虑这些权重!
在经典数据库上下文中,不会将重复坐标合并到单个观察中。它们仍然是有效的数据库记录,应计为完整记录。
我不知道是否有人执行某些自动数据预处理,例如重新调整数据集。
ELKI实施已经过验证,反对我们用于教学的一些教科书示例。
然而,算法中存在不是100%固定的极端情况,因此即使在算法的“文字”实现中也存在差异的空间。你已经遇到过其中的三个:
如何处理重复点:A)聚合,B)丢弃,C)考虑不同
从数据挖掘的角度来看,C是正确的,A(正确实现时)是一种可以节省不必要的距离计算的优化。 B是常见的数学视图,但对数据库上下文没有多大意义。如果我有两个“John Doe”,他们是同一个人吗?
k个最近邻居和k距离的定义。
k距离的通常定义是:最小距离,使得至少包含k个观测值。排除查询点时,从起点得到的最大值为5.7457:半径为5.7457的其他10个观测值 - 4.32323。
k个最近邻居通常被定义为该距离内的任何点,其可能大于k。但是,所有其他对象必须与
它实际上是k个最近邻居(包括领带,但不超过k个对象),不是第k个最小不同距离。你从哪里得到“独特的”?
LOF出版物中的定义3和4非常清楚LOF使用的kNN集。
因此,你的48个物体附近是不正确的。
如果有多个minPts重复点怎么办(文字实现会产生除零,但由于显而易见的原因,该点的LOF应为1.0)
这可能是Rapidminer发生的事情。
然后有可达距离:这个非常棘手,因为它不是数学距离。它是不对称。
第一次观察从第二次发现的可达性恰好是第二次观察的k距离,从快速查看(未仔细检查)reach-dist(x[0], x[1]) = max(5.97766 - 5.12595, 5.12595 - 4.32323) = 0.80272
有关如何计算LOF的分步演示,请参阅my extensive tutorial slides on outlier detection。据我所知,这是字面意思。它没有触及所有的角落情况,但它激发了LOF算法的设计,并且非常详尽。
答案 1 :(得分:0)
如果您使用RapidMiner的异常检测扩展[1](不是内置LOF),您将获得正确的结果。内置LOF被破坏了。这些结果与ELKI相同。这种实现比ELKI快得多,因为它的多线程也确实使用了更少的内存。它还可以处理重复(甚至更多k + 1),其中ELKI抛出异常。 (基于k-distinct)
最佳, 汉斯