階層的クラスタリングを使用して、2次元にフラット化された大量のデータセットを視覚化しようとしています。私がやりたいのは、クラスターを構成点の凸包としてレンダリングすることにより、階層内のさまざまな高さからデータを見ることができる視覚化を作成することです。この問題の最も難しい部分は、階層を上に移動するときにペアクラスターの凸包を効率的にマージできるアルゴリズムが必要なことです。O(n log n)時間で点の凸包を計算するためのアルゴリズムをたくさん見てきましたが、この場合、問題の下部構造を利用する方がはるかに効率的であるように見えますが、私は正確にはわかりません。
編集:
詳細については、データ構造は、クラスタリングの元のポイントで始まり、次のクラスターを形成するために結合されるポイント/クラスターを示す配列です。つまり、ツリー/ポインタ構造のようなものですが、1つの大きな配列に含まれています。重要な部分は、スーパークラスターの2つの構成クラスターが何であるかを確認するのは効率的ですが、クラスターに属するすべてのポイントのセットを取得するのは効率的ではないということです。したがって、合理的なアルゴリズムはすべてボトムアップで機能する必要があります。
つまり、ある場所で階層の真ん中にいて、事前に計算された階層で、クラスターAとBがマージされてクラスターCが生成されたとします。下から上に向かっていくので、すでに凸包を計算しました。クラスターAとBのポイントであるため、これらを組み合わせてクラスターCの凸包を作成する必要があります。クラスターAの凸包は、実際には単一のポイント、ペア、または完全なポリゴンである可能性があります。クラスターBについても同じことが言えます。したがって、これらをマージしてクラスターCの凸包を形成する方法はいくつかありますが、おそらくシングルトンとペアをポリゴンと同じように扱う賢いソリューションがあると思います。
最も明白な解決策は、クラスターAとBの凸包からの点の組み合わせを使用して凸包を計算することです。しかし、100kポイントの階層でこれを行う必要があるため、より効率的なものがあるかどうか疑問に思います。 AとBの凸包を組み合わせる方法。
編集2:
/----5
1---/ / \
/ \ / B 8
2 A 3 C 6 /
\ / \ /
4--------7
さて、私は自分の言いたいことのイラストをASCIIで表現しようとしました。クラスターAの凸包は1-2-3-4、Bの凸包は5-6-7-8、Cの凸包は1-2-4-7-8-5です。おそらく、クラスターAとBには船体の内側に追加のポイントが含まれていますが、これらは明らかにCの船体の一部になることはできないため、問題はクラスターAとBの船体を「スプライス」して形成する場所を決定するアルゴリズムです。ポイントの座標に基づくCの船体。これは、プロセス全体の帰納的ステップです。(最終的には、アルゴリズムが最上位のクラスターで終了するまで、CはクラスターDと組み合わされます。最上位のクラスターは、凸包としてすべての点の凸包を持ちます)。