R で DBSCAN アルゴリズムを実装しました。クラスターの割り当てをfpc ライブラリの DBSCAN 実装と一致させています。テストは、fpc ライブラリ dbscan の例で指定されているように生成された合成データで行われます。
n <- 600
x <- cbind(runif(10, 0, 10)+rnorm(n, sd=0.2), runif(10, 0, 10)+rnorm(n, sd=0.3))
クラスタリングは、以下のパラメーターを使用して行われます。
eps = 0.2
MinPts = 5
のクラスタ割り当てを のfpc::dbscan
実装と比較していますdbscan
。実行の最大値は、すべてのポイントが両方の実装で同じように分類されたことを示しています。
ただし、fpc 実装とは異なるクラスタに、私の実装では 1 ~ 2 ポイント、まれに 5 ~ 6 ポイントが割り当てられる場合があります。境界点の分類のみが異なることに気付きました。プロット後、クラスターのメンバーシップが実装で一致しないポイントが、最初に発見されたクラスターのシード ポイントに応じて、周囲のクラスターのいずれかに割り当てることができるような位置にあることがわかりました。
1ポイントの分類が異なる150ポイントの画像を表示しています(混乱を避けるため)。私の実装では、fpc 実装よりも常にミスマッチ ポイント クラスタ番号が大きいことに注意してください。
クラスターのプロット。
上の挿入図は fpc::dbscan、下の挿入図は私の dbscan 実装です
注: 私の実装と異なる点は、感嘆符 (!) でマークされています。不一致セクションの拡大画像もアップロードしています。
私の dbscan 実装の出力
+
コアポイントです
o
境界点です
-
ノイズポイントです
!
異なる点を強調する
fpc::dbscan 実装の出力
三角形はコア ポイントです。色付きの円は境界点です。黒い円はノイズ ポイントです。
もう一つの例:
私の dbscan 実装の出力
fpc::dbscan 実装の出力
編集
等しい xy スケールの例
Anony-Mousse のリクエストに応じて
場合によっては、私の実装が不一致点を正しく分類しているように見えることもあれば、fpc 実装が不一致を正しく分類しているように見えることもあります。下記参照:
fpc::dbscan (三角形のプロットのもの) は、不一致点を正しく分類しているようです
私のdbscan実装(+プロットのもの)は、不一致点を正しく分類したようです
質問
私はクラスター分析が初めてなので、別の質問があります。これらのタイプの違いは許容されますか?
私の実装では、最初のポイントから最後のポイントまでスキャンしています。また
fpc::dbscan
、ポイントは同じ順序でスキャンされます。!
このような場合、両方の実装で、同じクラスタ センターから不一致ポイント ( でマーク) が検出されているはずです。また、ポイントをノイズとしてマークするいくつかのケースを生成しましたfpc::dbscan
が、私の実装ではそれをいくつかのクラスターに割り当てます。この場合、なぜこの違いが生じるのでしょうか?
要求に応じてコード セグメント。