私は現在、RでDBSCANアルゴリズムを実装して、データ内の異常値を見つけることを試みています。パラメータ(イプシロン)を初期化するためには、私のサンプルでk番目の隣人(私はk = 3
を選択しました)への距離の昇順ソートシーケンスをプロットし、イプシロンの正しい値を選択するためにエルボーがどこにいるのかを見なければなりません。関数nndistとkNNdistの違いは何ですか?
私はRの統計的言語を使っていて、k番目の隣人nndist()
とkNNdist()
までの距離を計算する2つの異なる関数を見つけました。私がうまく理解していれば、ユークリッド距離を使用します。しかし、私のデータでは、関数は同じ結果を表示しません。私の問題を説明するために、私は有名なiris
データセット上の2つの機能を実装すると、あなたは結果が全く異なっていることがわかります。
data(iris)
iris <- as.matrix(iris[,1:4])
distance_third_neighbour_iris = iris %>% nndist(k = 3)
as.vector(quantile(distance_third_neighbour_iris, probs = 0.99))
### gives 0.68
distance_third_neighbour_iris = iris %>% kNNdist(k = 3)
as.vector(quantile(distance_third_neighbour_iris, probs = 0.99))
### gives 0.81
もちろん、両方の機能を算出するために、デフォルトまたは方法で同じ距離を使用しないように見えます。
アウトライアを見つけるためにDBSCANを使用しないでください。ノイズは異常値と同じではありません。それは、クラスタになるほど頻繁ではない点だけです。代わりに真の異常値検出アルゴリズムを使用してください。例えば、ELKIのアルゴリズムのいくつかを試してみてください。 –
副作用として、もうイプシロンを選択する必要はありません。ほとんどのメソッドはminptsに対応する1つのパラメータしか持っていません。 –