0

私は現在、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 

もちろん、両方の機能を算出するために、デフォルトまたは方法で同じ距離を使用しないように見えます。

+0

アウトライアを見つけるためにDBSCANを使用しないでください。ノイズは異常値と同じではありません。それは、クラスタになるほど頻繁ではない点だけです。代わりに真の異常値検出アルゴリズムを使用してください。例えば、ELKIのアルゴリズムのいくつかを試してみてください。 –

+0

副作用として、もうイプシロンを選択する必要はありません。ほとんどのメソッドはminptsに対応する1つのパラメータしか持っていません。 –

答えて

0

あなたがここにいくつかの問題があります:nndistは、入力として行列を取るとき

  1. を、それが唯一の2次元であることを前提としています。でも、世話をした後ppx(iris)

  2. : - nndist.ppxある - 四次元の点としてirisデータセットの4つの列を受け入れ、nndistの多次元バージョンをトリガするためには、まずこのようなirisppxへのポイントを変換する必要があります結果は依然として異なっています。 kNNdistは、k = 3近傍までの距離だけを生成するのではなく、k = 3までのすべての距離(つまりk = 1、k = 2、k = 3)の列を含むデータフレームです。そして、あなたのコードが変更されdistance_third_neighbour_iris_knndist[,3]

:あなただけのk = 3の値を取得しようと、あなたがnndistからの結果と比較したいときにそのため、あなたはこのように、唯一の3番目の列を使用する必要があります

library(dbscan) 
library(spatstat) 

data(iris) 
iris <- as.matrix(iris[,1:4]) 

distance_third_neighbour_iris_nndist = ppx(iris) %>% nndist(k = 3) 

as.vector(quantile(distance_third_neighbour_iris_nndist, probs = 0.99)) 
### gives 0.8776718 

distance_third_neighbour_iris_knndist = iris %>% kNNdist(k = 3) 

as.vector(quantile(distance_third_neighbour_iris_knndist[,3], probs = 0.99)) 
### gives 0.8776718 
+0

あなたの答えを再現可能に更新することをお勧めしますか? %ppx(iris)%>%nndist(k = 3):関数 "%>%"を見つけることができませんでした。おそらく 'library(magrittr) 'を最初に呼びたいと思うでしょう。引数 'k = 1:3'を使って' nndist'で最初の3つの距離を得ることもできます。 –

関連する問題