増分空間クラスタリングアルゴリズム


8

増分空間クラスタリングアルゴリズムを探しています。これが私のユースケースです:

  • ユーザーは最初の位置でエントリを作成します
  • ユーザーは既存のエントリの位置を変更できます

次に、これらのデータのクラスタリング情報を提供する分離されたサービスを実装したいと思います。サービスは、新しいエントリが追加されるか、既存のエントリが移動されるたびに通知されます。したがって、優れたクラスタリングアルゴリズムとは何ですか?理想的には、それは大量のデータに十分にスケールアップする必要があり、クラスターの品質とランタイムの複雑さの間にトレードオフがある場合、結果を低下させ、最終的に一貫した結果を得ることができます(古い結果はしばらくの間問題ありません)。

私の要件を要約すると:

  • 位置に基づく空間クラスタリング
  • 変更の増分修正
  • 新しいポジションを追加する
  • 既存のポジションを変更する
  • 優れた実行時パフォーマンス

前もって感謝します!


1
クラスターは何に使用されますか?彼らはどういう意味ですか?(これらに対する回答は、クラスタリングアルゴリズムを選択する最も基本的な方法を提供します。)
whuber

また、イベントはまれまたは一般的ですか?リスクのある集団に関連していますか?それとも、人々が住んでいた地域を強調表示するだけでよいのでしょうか
Ian Turton

@whuber:クラスターは、マップ上のアイテムをより探索しやすくするために使用されます(したがって、異なるズームレベルで異なるクラスターが存在する可能性があります)。それらは、特定のエリアで利用可能なアイテムの集中を意味します。
b_erb 2011年

@iant:新しいアイテムの作成は頻繁に行われ、既存のアイテムの位置の変更はめったに起こりません。イベントがどのように発生するか予想される詳細なパターンはありません。ただし、同時に複数のアイテムが同時に作成される可能性は低くなります。
b_erb 2011年

@PartlyCloudyアイデアはわかりましたが、クラスタリングがどのように役立つかはまだわかりません。OK、特定のポイントのクラスターを内部的に特定するとします。それはユーザーインターフェイス(または、より一般的には、データの「探索可能性」)にどのように影響しますか?応答方法によっては、(a)非常に高速で実装が簡単であるが、(b)一般に「クラスタリング」アルゴリズムとは見なされないソリューションがある場合があります。
whuber

回答:


4

このクラスタリングの目的は、ポイントシンボルの表示を簡略化することです。多くのものがマップ上で接近している場合、それらは単一のシンボルに置き換えられてグループを示します。

要件は、シンプルで適応性のあるソリューションの必要性を示しています。ポイントシンボルは更新でき、ユーザーがズームインすると、マップ(または画面)の範囲の異なる場所に異なるシンボルが表示されます。

優れた候補は明らかに地域四分木です。

領域四分木のように機能する、より簡単な方法があります。コーディングが少なくて済み、データ構造を事前に作成する必要はありませんが、ズームやパン中にオンザフライで計算を実行する必要があるため、(小さな)価格を支払う必要があります。 地図をグリッド表示するだけです。具体的には、マップの現在の範囲内に描画されるポイントシンボルがn個あり、長さがdxで高さがdyであるとします。地図の原点を基準にして、シンボルは座標(x [i]y [i])、i = 1、2、...、nに描画する必要があります。cのグリッドセルサイズを選択すると、マップがセルのグリッドに分割されます。場所(xy)は行jy)= Floor [ y / c ]と列jx)に属します(0から数え、行は下から上へ、列は左から右へ)。 2つ以上のポイントを受信するセルを「クラスター」と見なすことができます。 クラスターシンボルは、座標を持つセルの中心に描画できます。(j + c / 2、k + c / 2)。

これにより、疑似コードで表される次のソリューションが導き出されます。

m = Floor(dy/c)+1
n = Floor(dx/c)+1
Dimension a[m,n] = 0
For each (x[i], y[i]) to be displayed:
    Increment( a[ j(y[i]), j(x[i]) ] )
End for
For each (x[i], y[i]) to be displayed:
    row = j(y[i])
    col = j(x[i])
    If  a[row, col] > 1:
        Draw a symbol for a cluster of k points at (c*(col+0.5), c*(row+0.5))
        a[row, col] = 0
    Else
        Draw a point symbol at (x[i], y[i])
    End if
End for

明らかに、アルゴリズムの計算負荷は、時間ではO(ポイント数)、ストレージではO(dx * dy / c ^ 2)です。 セルサイズcの選択に伴うトレードオフは次のとおりです。

  1. Cできるだけ大きくする必要があります:ストレージはに反比例するC ^ 2:の値が小さいC RAMの平均大量。(スパース配列または辞書を使用することで、ストレージをO(ポイント数)に減らすことができます。)

  2. cは可能な限り大きくする必要があります。2つのシンボル(ポイントまたはクラスター)がc / 2 よりも近くなることはありません。

  3. cはできるだけ小さくする必要があります。すべてのクラスターシンボルは、それからc / sqrt(2)以下の場所を表します。

  4. cはできるだけ小さくする必要があります。cの値が大きいと、多くのクラスターが作成され、個々の点がほとんど表示されなくなります。

(4)を簡単に分析してみましょう。出発点として、マッピングされる場所がランダムに均一に発生し、互いに独立していると仮定します。セルの数はNc)=(Floor(dx / c)+1)*(Floor(dy / c)+1)であり、少なくともcの値が大きい場合はcに正比例します ^ 2。細胞数の分布は、強度ラムダ = n / Nc)= n * c ^ 2 /(dx * dyのポアソンの法則にほぼ従います。)。予想されるクラスター数は

ec)= n(1-exp(-lambda)(1 + lambda))。

これは、ラムダが0に縮小するにつれて小さくなります。つまり、セルサイズcは次第に小さくなります。この分析の要点は、前の式ではクラスターの数を予測できるため、ec)が許容値を下回る初期値cを選択できます(RAMを制限するのに十分な大きさのまま)要件)。閉じた形のソリューションはありませんが、いくつかのニュートンラフソンのステップは1つに急速に収束します。

このアプローチは非常に動的です-グリッドとそれに続くクラスタリングがズームとパンごとに計算できるほど高速であり、事前に計算されたデータ構造を必要としません-データが更新されるときに必要な「増分変更」が自動的に行われます。


視覚的に、4つのコーナー領域の近くに点のグループが集まっている場合はどうでしょうか。4つのクラスターになってしまうのではないでしょうか。
カークカイケンダル、2011年

@Kirk実際、この状況では、大きなクラスターが2つから4つのクラスターまたは個々のポイントに分割される可能性があります。人工的なクラスターは作成されません。これは、リージョン四分木でも発生する可能性があります。いくつかの解決策があります。1つは、グリッドの原点を0と-c(両方の座標で)の間のランダムな量でオフセットして、そのような条件が永続的に保持されないようにすることです。もう1つは、(固定カットポイントを使用するのではなく)四分木を動的に作成し、それを点に適応させることです。明らかにこれにはより多くのコーディングが必要です。良い解決策は、状況を無視することです。それは本当にそのような問題ですか?
whuber

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.