私は LOF の独自の実装を作成し、結果を ELKI および RapidMiner の実装と比較しようとしていますが、3 つすべてで異なる結果が得られます! その理由を突き止めようとしています。
私の参照データセットは 1 次元の 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 の近傍は、実際には 5.12595 から 6.77579 までの 48 ポイントです。
- それは私に 2.45256 の k-distinct 距離を与えます
- 最初のネイバーの到達可能距離を 1.58277 として計算しています
- サンプルの LRD を 1/(99.9103/48) として計算しています。
- 48 個のネイバーすべての lrd(o)/lrd(p) の合計は 93.748939 です。
- 1.9531 の LOF を取得するには、48 で割ります