UPDATED:最後に、私の大きなデータセットをクラスタリングするために使用したソリューションは、以下のAnony-Mousseの提案でした。つまり、ELKIのDBSCANのインプリメンテーションを使って、scikit-learnではなくクラスタリングを行います。これは、コマンドラインから実行し、適切なインデックスを付けて、数時間以内にこのタスクを実行します。 GUIと小さなサンプルのデータセットを使用して、使用したいオプションを見つけて町に行きます。探し求める価値がある。私の元の問題の説明と興味深い議論については、誰でも読んでください。scikit-learn DBSCANメモリの使用
私はクラスター化しようとしている35個のフィーチャー(浮動小数点値)を持つ250万個のサンプルを持つデータセットを持っています。私は、スケッチ学習のDBSCANの実装で、マンハッタンの距離メトリックとデータから抽出された小さなランダムサンプルから推定されるイプシロンの値を使ってこれを実行しようとしていました。ここまでは順調ですね。 (ここには参考用にスニペットがあります)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
私の問題は、私が簡単にメモリが足りなくなることです。 (私は現在、16GBのRAMを搭載したマシンで作業しています)
私の質問は、DBSCANが実行中にその場でペアワイズ距離行列を計算していることです。これが私の記憶を揺さぶっていますか? (250万^ 2)* 8バイトは明らかに愚かに大きいです、私はそれを理解するでしょう。 fit()
メソッドを使用しないでください。そして、より一般的には、この問題を回避する方法があるのでしょうか、あるいは私は一般的に間違ったツリーをここで吠えていますか?
答えが明らかな場合は謝罪してください。私は数日間これを困惑させてきた。ありがとう!
補遺:誰も私にfit(X)
とfit_predict(X)
の違いを説明できる場合にも、より明確に私もそれをいただければと思います - - 私は恐れて私はかなりそれを得ることはありません。
付録#2:550GBのRAMを搭載したマシンでこれを試したところ、まだ爆発していましたので、DBSCANがペアワイズ距離行列を作成しようとしているような気がします。それがしたい。私は今、大きな問題はその行動を止める方法か、自分のニーズに合った方法を見つけることだと思います。ここで私と一緒にお会いになりました。
補遺#3(!):私はトレースバックを添付するのを忘れて、ここではDBSCANアルゴリズムは、実際の距離行列を計算していないんので、ここではチャンス、
Traceback (most recent call last):
File "tDBSCAN.py", line 34, in <module>
db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
self.fit(X)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
**self.get_params())
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
D = pairwise_distances(X, metric=metric)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
return func(X, Y, **kwds)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 237, in manhattan_distances
D = np.abs(X[:, np.newaxis, :] - Y[np.newaxis, :, :])
MemoryError
実際には、Sklearnの実装を改善するのは難しくないようです。 radiusクエリを正確にサポートするボールツリーデータ構造があります。私はdbscanにあまり慣れていないので、これらのクエリーが必要なのか分かりませんでした。私たちは間違いなくそこで改善すべきです。 –
はい、これはSklearnでこれを修正するのは難しくありません。 –
より良いsklearn DBSCANの実装は素晴らしいでしょう。 –