最大100万個のオブジェクトをクラスタリングできる階層的クラスタリングツール(Pythonで推奨)を誰かに教えてもらえますか? hcluster
と オレンジ を試しました。
hcluster
は18kオブジェクトで問題が発生しました。 Orangeは数秒で18kオブジェクトをクラスター化できましたが、100kオブジェクトで失敗しました(メモリが飽和し、最終的にクラッシュしました)。
私は64ビットXeonCPU(2.53GHz)と8GBのRAM + Ubuntu11.10での3GBスワップ)で実行しています。
O(n ^ 2)を打ち負かすには、最初に1Mポイント(ドキュメント)をたとえば次のように減らす必要があります。各1000ポイントの1000パイル、または各10kの100パイル、または...
2つの可能なアプローチ:
たとえば15kポイントから階層ツリーを構築し、残りを1つずつ追加します:time〜1M * treedepth
最初に100または1000のフラットクラスターを構築し、次に100または1000のクラスターセンターの階層ツリーを構築します。
これらのいずれかがどの程度うまく機能するかは、ターゲットツリーのサイズと形状(レベル数、葉数)に大きく依存します。
どのソフトウェアを使用していますか。また、クラスタリングを行うには何時間/日が必要ですか。
フラットクラスターアプローチの場合、 K-d_tree は、2d、3d、20d、さらには128dのポイントに対して正常に機能します-あなたの場合ではありません。テキストのクラスタリングについてはほとんど何も知りません。 局所性鋭敏型ハッシュ ?
scikit-learn clustering を見てください-DBSCANを含むいくつかのメソッドがあります。
追加:参照
google-all-pairs-similarity-search "スパースベクトルデータ内のすべての類似したベクトルのペアを見つけるためのアルゴリズム"、Beyardo etel。 2007年
SO階層的クラスター化-ヒューリスティック
問題はおそらく、完全な2D距離行列(倍精度で単純に約8 GB)を計算しようとし、アルゴリズムがO(n^3)
時間で実行されることです。
differentクラスタリングアルゴリズムの使用を真剣に検討する必要があります。階層的クラスタリングは遅く、結果は通常まったく説得力がありません。特に、樹状図を見て適切なカットを選択することができない何百万ものオブジェクトの場合。
本当に階層的クラスタリングを続けたいのなら、 [〜#〜] elki [〜#〜] (Javaですが)にはSLINK
のO(n^2)
実装があると思います。 。 100万のオブジェクトで、約100万倍の速度になるはずです。彼らがすでにCLINK
を持っているかどうかもわかりません。また、シングルリンクとコンプリートリンク以外のバリアントにサブO(n^3)
アルゴリズムが実際にあるかどうかはわかりません。
他のアルゴリズムの使用を検討してください。たとえば、k-meansは、オブジェクトの数に応じて非常に適切にスケーリングされます(データが非常にクリーンで規則的でない限り、通常はあまり良くありません)。 DBSCAN
とOPTICS
は、パラメータの感触がわかれば、私の意見では非常に優れています。データセットが低次元の場合、適切なインデックス構造を使用して非常に適切に高速化できます。 O(n log n)
クエリ時間のインデックスがある場合は、O(log n)
で実行する必要があります。これは、大規模なデータセットに大きな違いをもたらす可能性があります。私は個人的に11万枚の画像データセットでOPTICS
を問題なく使用したので、システム上で100万までスケールアップできると想像できます。