pythonで100×100000の行列自身の外積を求めて100×100の行列にしたいのですが、メモリエラーとなり実行出来ません。データが大きくても実行出来る方法があれば、どなたか教えていただけないでしょうか?
追記
以下の行列の形にしたいと思っています。
nが100000、aが100で
xが2次元で100000列、cが2次元で100列のデータです。
python
1sigma=10**np.linspace(-3.0,1.0,9) 2lam=10**np.linspace(-3.0,1.0,9) 3kernel_num = 100 4def search_sigma_and_lambda(x, y, c, sigma, lam): 5 nx = len(x);ny = len(y);n_min = min(nx,ny);kernel_num = len(c) 6 7 8 score_new = np.inf;sigma_new = 0;lam_new = 0; 9 for s in sigma: 10 phi_x = np.array([compute_kernel_Gaussian(x,i,s) for i in c]) 11 phi_y = np.array([compute_kernel_Gaussian(y,i,s) for i in c]) 12 h = phi_x.sum(1) / nx 13 H = np.multiply.outer(phi_y,phi_y.T) / ny←「ここの部分でメモリエラーになります。」 14 phi_x = phi_x[np.arange(n_min)] 15 phi_y = phi_y[np.arange(n_min)] 16 for la in lam: 17 B = H + lam * np.identity(kernel_num) 18 B_inv = np.inv(B) 19 B_inv_X = B_inv.dot(phi_y) 20 print B_inv_X;sys.exit() 21 22def compute_kernel_Gaussian(x,centers,sigma): 23 x_c = np.square(x-centers).sum(1) 24 return np.exp(-0.5*x_c/(sigma*sigma))
参考にしているのは以下のサイトで、
http://qiita.com/kenmatsu4/items/0a7a3ef71d4e8bb53da0
以下のサイトのソースコードをpythonに変えて実行したいと思っています。
https://github.com/hoxo-m/densratio/blob/master/R/uLSIF_search_sigma_and_lambda.R
どういうことをしたいのかよくわかりません (行列自身の外積って何?) 式を書いて説明するなりしてもらえませんか。
ご意見ありがとうございます。修正いたしましたので、宜しくお願い致します。
「式」を書いていただきましたが、「説明」がないので式やそこに使われている変数の意味がわからないです……。たとえば、「100×100000」とおっしゃってましたが、そういう数にあたるような変数がどれなのかもわかりませんし。
ご意見ありがとうございます。拙い説明で申し訳ございません。これでどうでしょうか。
x = (x1, ..., x100000) と、c = (c1, ..., c100) という二つのベクトルから100行100列の行列 f を計算するということよろしいでしょうか。もしもそうなら、この程度でメモリが不足するというのはちょっと不思議です。ご自分で書かれたプログラムのソースコードも示していただけますか。
倍制度浮動小数の100x100000の行列なら約80MB程度です。最近のコンピュータなら難なく扱える容量です。しかし現実にメモリエラーとなっているということは、プログラムにメモリ使用量に対して優しくない書き方をしている部分があるはずです。同じ入力から同じ結果を出すプログラムであっても、処理の仕方によって必要なメモリ量は簡単に何桁も変化しえます。ですので、「やりたいこと=式」ではなく「どのように処理しているのか=プログラム」を示していただくことがアドバイスを得るためには必要でしょう。
ご意見ありがとうございます。一部ですがソースコードを載せました。宜しくお願い致します
回答3件
あなたの回答
tips
プレビュー