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