5

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 実装です

クラスターのプロット。 上の挿入図は fpc::dbscan、下の挿入図は私の dbscan 実装です

注: 私の実装と異なる点は、感嘆符 (!) でマークされています。不一致セクションの拡大画像もアップロードしています。


私の dbscan 実装の出力

+コアポイントです

o境界点です

-ノイズポイントです

!異なる点を強調する

私のdbscanの実装


fpc::dbscan 実装の出力

三角形はコア ポイントです。色付きの円は境界点です。黒い円はノイズ ポイントです。 ここに画像の説明を入力


もう一つの例:

私の dbscan 実装の出力

ここに画像の説明を入力


fpc::dbscan 実装の出力

ここに画像の説明を入力


編集

等しい xy スケールの例

Anony-Mousse のリクエストに応じて

場合によっては、私の実装が不一致点を正しく分類しているように見えることもあれば、fpc 実装が不一致を正しく分類しているように見えることもあります。下記参照:

fpc::dbscan (三角形のプロットのもの) は、不一致点を正しく分類しているようです

ここに画像の説明を入力

私のdbscan実装(+プロットのもの)は、不一致点を正しく分類したようです

ここに画像の説明を入力

質問

  • 私はクラスター分析が初めてなので、別の質問があります。これらのタイプの違いは許容されますか?

  • 私の実装では、最初のポイントから最後のポイントまでスキャンしています。またfpc::dbscan、ポイントは同じ順序でスキャンされます。!このような場合、両方の実装で、同じクラスタ センターから不一致ポイント ( でマーク) が検出されているはずです。また、ポイントをノイズとしてマークするいくつかのケースを生成しましたfpc::dbscanが、私の実装ではそれをいくつかのクラスターに割り当てます。この場合、なぜこの違いが生じるのでしょうか?

要求に応じてコード セグメント。

4

1 に答える 1

5

DBSCAN は、境界点の順序に依存することが知られています。それらは、最初に検出されたクラスターに割り当てられます。境界点が密集していないが、異なるクラスターからの 2 つの密集点の近くにある場合、どちらにも割り当てることができます。

これが、DBSCAN が「境界点を除いて、順序に依存しない」としばしば説明される理由です。

データをシャッフル (または反転) してから、アルゴリズムを再実行してみてください。結果が変わるはずです。

あなたの実装も fpc 実装もインデックスをサポートしていないと思います (範囲クエリを高速化し、アルゴリズムを で実行するO(n log n)ため)。'''更新: インデックスはクラスター間で順序を変更することはなく、1 つのクラスター内でのみ変更されるため、インデックスはあまり重要ではありません'''.

この違いを「生成」するための別のオプションは、

  • 各ポイントの最初の (ノイズのない) クラスター割り当てを保持します (IIRC 公式 DBSCAN 疑似コード)
  • 各ポイントの最後のクラスター割り当てを保持します(fbc::dbscanこれを行うようです)

これらは、複数のクラスターの境界点であるオブジェクトに対しても異なる結果を生成します。これらのポイントを両方のクラスターに割り当てることもできます。これにより、データセットの非厳密な分割が行われます。通常、厳密なパーティショニングの利点は、完全に決定論的な結果を得るよりも重要です。

誤解しないでください: の「上書き」戦略はfbc::dbscan、結果を実質的に変更しません。私はおそらくそれを自分でそのように実装するでしょう。

非境界点は影響を受けますか?

于 2012-06-02T08:25:53.120 に答える