2011-06-23 10 views
2

私は現在、numpyで固有モードを実装しようとしていますが、私の32ビットLinuxシステム(私は32ビットを使用しています。これは以前は64ビットのフラッシュとJavaをサポートしていませんでした。行列(ベクトル*転置ベクトル)numpyのを取得するために2つのベクトルを乗算することは、私は、これはあまりにも少ないメモリによるもので、64ビットで解決できることを読んでくれ32bitとnumpyで固有モードを実行できますか?

ValueError: broadcast dimensions too large. 

を与えます。これを回避する方法はありますか?行列は528000 * 528000要素になります。私の論文によれば、この大きな行列は、共分散行列(これらの巨大行列を総計し、それを行列の数で割る)に必要です。

私のコードは、このように見えます(私の行列知識のために丸い(水平*垂直)のように見えるので、なぜnumpyが私に行列を与えるのか分かりませんが、 :すでに詳述

tmp = [] 
for face in faces: # just an array of all face vectors (len = 528000) 
    diff = np.subtract(averageFace, face) 
    diff = np.asmatrix(diff) 
    tmp.append(np.multiply(diff, np.transpose(diff))) 
C = np.divide(np.sum(tmp, axis=0), len(tmp)) 
+0

何をしようとしているのですか?単精度浮動小数点数の528000 * 528000の行列は、おそらく持っていない1テラバイトのメモリを必要とするため、64ビットでも動作しません。だから、おそらくあなたは実際にそのような行列を形作ることを望んでいないでしょうが、上記の説明から、あなたがしようとしていることを理解することは難しいでしょう。 –

+0

私の説明スキルがとても悪いので。私は、528000次元のベクトルを持っています(各ピクセルは、私が理解したような次元です)。今、私は行列を作成する必要があります。これは 'vector * vector^T'(ここでTはベクトルの転置されたバージョンを表します)で行列を生成する必要があります。しかし、彼らは通常、固有顔が速くてシンプルであると言っています。式は次のとおりです。http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial_files/image012.gif via http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial.htmここで、Phiはベクター。 – Aufziehvogel

答えて

2

pvとして、そのような巨大な共分散行列を生成しようとするのはとても現実的に実現可能ではありません。

phi* phi^Tphi^T* phiの固有ベクトル(あなたのdrexelリンクで説明されています)が関連しており、これは問題をより管理しやすくするための鍵です。詳細はEigenfaceを参照してください。

+0

ウィキペディアのリンクをありがとう、私は私ができることをしようとします。 – Aufziehvogel

+0

@Aufziehvogel:AFAIU 'Eigenface'アルゴリズムは非常に簡単で、' numpy'を使ってほんの数行しか実装できません。あなたの探検に沿ってさらに具体的な質問をしてください。ありがとう – eat

関連する問題