scikit-learn が提供するスペクトル クラスタリング メソッドを使用して、データセット ( 16000のみ)の行を集計しようとしています。私の問題は、多かれ少なかれ3ギガバイトを割り当てるアフィニティマトリックス(16000x16000フロートマトリックス)を事前計算した後に発生します(最大で8 GBに到達できます)、そのマトリックスで呼び出されるメソッドは、argpackソルバーを使用して、より多くのメモリを必要としますそして、CPU はメモリの内外で物事を交換しようとして多くの時間を失うため、計算速度が低下して死に至ります。メソッドの前にガベージコレクターを呼び出そうとしましたが、成功しませんでした:
import gc
gc.collect()
何が起こっているかの正確なスキームを取得するにはどうすればよいですか? これは既知の問題ですか? 箱から出してスペクトルクラスタリングを実行するためのPythonの代替手段はありますか?
必要に応じて、最小限の実例を投稿できます。
更新 lobpcg ソルバーに関しては間違っていました。最初はすべてのメモリを使用しているように見えますが、5Gb 前後で安定し、プロセスは続行しますが、別の問題が発生します。計算によって数値の不正確さが生じ、最終的に Nan が生成されるか、次のようなエラーが発生するようです (アフィニティ マトリックスが少し変化すると、発生するエラーが変化します。以下を参照してください)。
File "/usr/local/lib/python3.4/dist-packages/sklearn/cluster/spectral.py", line 255, in spectral_clustering
eigen_tol=eigen_tol, drop_first=False)
File "/usr/local/lib/python3.4/dist-packages/sklearn/manifold/spectral_embedding_.py", line 303, in spectral_embedding
largest=False, maxiter=2000)
File "/usr/local/lib/python3.4/dist-packages/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py", line 449, in lobpcg
assert np.allclose(gramA.T, gramA)
AssertionError
私のアフィニティ メトリックはガウス カーネルexp(-((X_1 - x_2)^2/2*sigma^2))
であり、シグマにさまざまな値を試すと、結果が大きく異なります。一部のエントリがゼロに近い場合に不正確さが生じる可能性があることは理解できますが、シグマ (= 5.0) に大きな値を使用し、代わりに 1.0 に近づけた場合はそうではありません。
今、私はいくつかの点を見逃しているか、その過程で何か間違ったことをしていると思っているので、この質問を新しい目的で更新しています.
参考までに、これはアフィニティ マトリックスを計算する方法です。
pairwise_dists = \
scipy.spatial.distance.squareform(
scipy.spatial.distance.pdist(data_slice,'sqeuclidean'))
similarity_matrix = scipy.exp(-pairwise_dists /(2 * self._sigma ** 2))
wheredata_slice
は、行がインスタンスであるnumpy配列でありself._sigma
、ガウスシグマパラメーターを格納します。