1

カスタム距離測定を使用して階層クラスタリングを実行しようとしています。すべての計算を Python で実行し、データ構造を R に渡してクラスタリングを行います

import rpy2.robjects as robjects
r=robjects.r
from rpy2.robjects.packages import importr
stats = importr('stats')

m = r.matrix(robjects.FloatVector(list_of_data), ncol=size, byrow=True)
dist_mat=stats.as_dist(m) 
hc=stats.hclust(new_dist_mat)

したがって、私の距離測定値は Python リストに保持され、R マトリックスに変換されdist、クラスタリングに必要なオブジェクトに変換されます。これはある程度機能します。ただし、マトリックスが大きくなりすぎると、次のエラーが発生します。

python(18944,0xb0081000) malloc: *** mmap(size=168898560) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 161.1 Mb

これは、オブジェクトに変換した時点で発生しdistます ( as.dist)。バラバラになるサイズはテストしていませんが、3000x3000 マトリックスでは機能しますが、6500x6500 マトリックスでは失敗するため、その中間です。Pythonの関数を使用してdel不要なオブジェクトをメモリから削除しようとしていますが、これを読んだ限りでは、メモリがすぐに使用できるようになるとは限りません。

distでは、最終的に、オブジェクトを取得するためのよりメモリ効率の良い方法はありますか? それとも、私が使用できる別の方法がありますか? clusterオブジェクトを使用しないR のライブラリの他のメソッドをいくつか見つけましdistたが、これらのメソッドは組み込みの距離メトリックを使用します。

前もって感謝します!

4

1 に答える 1

2

Pythonのdel()を呼び出しても、メモリがすぐに使用できるようになるとは限りません。ガベージコレクターを明示的に呼び出すと役立ちます。ここでの他の質問(rpy2によって使用されるメモリのクリア)への回答は、rpy2ドキュメントの関連セクションを示しています。

クラスタリングアルゴリズムに関して、hclust()を使用した階層的クラスタリングには、「距離」行列(サイズn *(n + 1)/ 2; Rは行列が対称であるため、メモリを少し節約します)が必要です。他のクラスタリングアルゴリズムが存在するか、階層的クラスタリングのトリックに熱心で、初期ブロックを作成して開始行列のサイズを最小化する場合、それはプログラミング関連の質問の範囲外です。

于 2011-03-19T09:06:51.563 に答える