我已经编写了自己的 LOF 实现,我正在尝试将结果与 ELKI 和 RapidMiner 中的实现进行比较,但所有 3 都给出了不同的结果!我正在努力找出原因。
我的参考数据集是一维的,有 102 个实数值,有很多重复。我会试着把它贴在下面。
首先,RapidMiner 的实现。LOF 分数与 ELKI 和我的结果大不相同;许多人带着无限的LOF回来。这个实现是否被验证为正确的?
我的结果与 ELKI 相似,但我没有得到完全相同的 LOF 值。通过快速浏览 ELKI 源代码中的注释,我认为这可能是因为计算 k 邻域的方式不同。
在 LOF 论文中,MinPts 参数(在其他地方称为 k)指定了最小编号。包含在 k 邻域中的点数。在 ELKI 实现中,我认为他们将 k 邻域定义为精确的 k 点,而不是 k 距离或 k 不同距离内的所有点。谁能确切地确认 ELKI 是如何构建 k 邻域的?还有一个私有变量允许点本身包含在它自己的邻居中,但看起来默认不包含它。
有谁知道带有用于验证目的的 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 分数:
- RapidMiner:无穷大(MinPts 下限/上限设置为 10,100)
- ELKI:2.6774(k = 10 并且 distfunction/reachdistfunction 设置为默认值)
- 我的实现:1.9531
关于我的实现正在做什么的更多细节:
- MinPts 是 10,所以我找到了该点的 10 个不同的邻居。所以 4.32323 的邻域实际上是 48 个点,从 5.12595 到 6.77579。
- 这给了我 2.45256 的 k-distinct 距离
- 我正在计算第一个邻居的可达距离为 1.58277
- 我将样本的 LRD 计算为 1/(99.9103/48)
- 所有 48 个邻居的 lrd(o)/lrd(p) 之和为 93.748939
- 除以 48 得到 1.9531 的 LOF