私はRツールを使ってSVD(svd(m)
)を計算していますが、それは小さな行列でも動作しますが、20Kx20X
行列を渡します。処理の後、それは私がチェック次のエラー行列計算エラー
Error in svd(m) : infinite or missing values in 'x'
を与え、何行または列のすべての0の値を持つ行および 列のない重複は存在しません。すべての列に値があります。
私はここで、過去20Kx20K
行列:(
私はRツールを使ってSVD(svd(m)
)を計算していますが、それは小さな行列でも動作しますが、20Kx20X
行列を渡します。処理の後、それは私がチェック次のエラー行列計算エラー
Error in svd(m) : infinite or missing values in 'x'
を与え、何行または列のすべての0の値を持つ行および 列のない重複は存在しません。すべての列に値があります。
私はここで、過去20Kx20K
行列:(
私の4GBメモリマシンで20Kx20Kのマトリックスを処理することはできませんが、問題はメモリサイズに関係していないと推測しています。
この推測理由は、SVD()内のコードの最初の行は、以下であることである:すなわち
if (any(!is.finite(x)))
stop("infinite or missing values in 'x'")
、任意無限の値が存在する最初のかどうかSVD()ファンクション試験あなたのデータに
この処理は、の前にになります。だから、もしあなたが記憶上の問題を抱えていれば、svd()を呼び出す前でさえ明らかです。
私はあなたが無限の値をチェックお勧め:
x <- c(0, Inf, NA, NULL)
which(!is.finite(x))
[1] 2 3
これは、第2及び第3の値は有限ではないと考えられていることを示しています。言い換えれば、あなたのデータ内の任意のの値はあなたのエラーの原因になります。
することはできませんあなたは8バイトですダブルスを保存している場合は、20Kx20Kは、メモリ内に全体を保持するためのRAMの8 *2万*2万/ 1024/1024〜3ギガバイトを意味します。
私はあなたが利用できる持っているどのくらいのRAM知らないが、私は、必要に応じてディスクへの行列をシリアル化するために何ができるかRに見てね。
がスパースまたは帯行列ですか?缶あなたは必要なメモリ量を減らすために何かをしますか?
行列の空白はどれくらいの大きさですか?条件番号(最大から最小の固有値の比)は何ですか?条件数が大きい場合は、解決が困難な場合があります。行列は、ほぼ一意になるようにゼロの行または列を持つ必要はない。
UPDATE:
あなたのコメントに基づいて、私は、RAMはあなたの問題の少なくともあることを言うと思います。行列全体をメモリに保持することが可能なように思えます。マトリックス全体を扱うことができます。あなたは64ビットOSで動作しています - あなたのR 64ビットも同様ですか?
残念ながら、SVDの副産物の1つは、ヌルスペースのサイズを取得することです。
行列の最小固有値は、Jacobiの繰り返しを使用して取得できます。 Lanczosは最大固有値を得るための良い選択であるかもしれません。それらのすべてを手に入れることはたくさんの仕事になるでしょう。 5つの最小値と最大値が評価されるようにしてください。
ソフトウェアでエラーが発生するたびに、すぐにGoogle検索に貼り付けます。少なくともそれは私が特定の問題を経験する最初じゃないことを知って慰めです:
おそらくSVD計算自体も多くのメモリを使用しています。 MATLABと比較すると、svd計算では行列自体のメモリと同じだけのメモリが割り当てられていることがわかります.3GBのメモリがすでに存在する場合は、svd計算で別の3GBが割り当てられ、6GBのメモリが割り当てられます。
私は10GBとメモリの問題はありません:( – Tweet
どのように私のデータにNAの値がわかっていますか?そして10GBのRAMを持っています。 (0) – Tweet
()が本当の要素を特定しているので、私のコードはどの要素が原因であるかを教えてくれます。問題が発生しました。重要 - 否定感嘆符に気付いてください!is.finite() – Andrie
問題を解決しませんでした。私はあなたの関数を使用して何も教えていません:(助け? – Tweet