2011-02-05 3 views
0

Я использую инструмент R для вычисления SVD (svd(m)), и он работает на малой матрице, но по мере прохождения его 20Kx20X. После обработки, он дает следующую ошибкуОшибка вычисления матрицы

Error in svd(m) : infinite or missing values in 'x' 

я проверил, и нет ни в одной строке или столбце все значения 0 и не дублировать в строке и столбце . Все столбцы имеют значения.

я не могу пройти 20Kx20K матрицы здесь :(

ответ

1

Я предполагаю, что ваша проблема не связана с объемом памяти, хотя я не могу обработать матрицу 20Kx20K на моей машине памяти 4 ГБ.

Причиной этого предположения является то, что первая строка кода внутри СВД() заключается в следующем:

if (any(!is.finite(x))) 
    stop("infinite or missing values in 'x'") 

Другими словами, функция тестирования СВД() сначала есть ли любые бесконечные значения в ваших данных.

Это происходит до любая дальнейшая обработка.Таким образом, если у вас были проблемы с памятью, это было бы очевидно даже до вашего вызова svd().

Я предлагаю вам проверить для бесконечных значений:

x <- c(0, Inf, NA, NULL) 
which(!is.finite(x)) 

[1] 2 3 

Это указывает на то, что второе и третье значения считаются не конечными. Другими словами, any Значения NA в ваших данных вызовут вашу ошибку.

+0

Как узнать, какое значение NA в моих данных? И у меня 10 ГБ ОЗУ. Я использовал ваш код> который (есть. end (m)) named integer (0) , чтобы проверить, есть ли какое-либо конечное значение, и он дал мне имя integer (0) – Tweet

+0

, которое() идентифицирует элементы, которые являются истинными. Поэтому мой код скажет вам, какие элементы вызывают проблема. Важно - обратите внимание на восклицательный знак отрицания.! is.finite() – Andrie

+0

это не решило проблему. Я использовал вашу функцию, и она ничего мне не говорит. :(любая помощь? – Tweet

0

Если вы храните двойники, которые 8 байт, 20Kx20K означает * 20000 8 * 20000/1024/1024 ~ 3 Гб оперативной памяти, чтобы держать все это в памяти.

Я не знаю, сколько оперативной памяти у вас есть в наличии, но я хотел бы посмотреть на то, что R может сделать, чтобы сериализовать матрицу на диск по мере необходимости.

Является ли матрица разреженным или ленточным? может вы делаете что-то, чтобы уменьшить объем необходимой вам памяти?

Насколько велика нулевое пространство для вашей матрицы? Какое число условий (отношение наибольшего к наименьшему собственному значению)? Большое количество состояний может свидетельствовать о трудностях в решении. Матрица не должна иметь нулевую строку или столбец, чтобы быть почти единственной.

UPDATE:

Основываясь на ваш комментарий, я бы сказал, что RAM является наименее ваших проблем. Похоже, что можно сохранить всю матрицу в памяти - если вы можете решить все это. Вы можете адресовать всю матрицу. Вы работаете на 64-битной ОС - тоже ваша версия R 64-bit?

К сожалению, одним из побочных продуктов SVD является получение размера нулевого пространства.

Вы можете получить минимальное собственное значение для своей матрицы с помощью итерации Jacobi. Lanczos может быть хорошим выбором для получения максимального собственного значения. Будет очень много работы, чтобы получить все из них; вы можете просто хотеть оценить пять самых маленьких и самых больших.

В любое время, когда я испытываю ошибку с помощью некоторого программного обеспечения, я сразу же вставляю его в поиск Google. По крайней мере, это приятно знать, что я не первый опыт конкретную проблему:

http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=Error+in+svd(m)+:+infinite+or+missing+values+in+ «х»

+0

Привет, Спасибо за ваш ответ. Да, моя матрица разрежена. У меня 10 ГБ оперативной памяти. У меня нет проблемы с памятью. Как проверить пустое пространство? отношение для собственного значения? – Tweet

+0

Привет, спасибо за подробное объяснение. Да и у R, и у OS 64 бит. Я пробовал разные способы решения этой проблемы, но все впустую ... – Tweet

+0

Спасибо, я уже искал google и читал эти сообщения и решения, однако это не решает мою проблему. Вот почему я пришел сюда для совета гуру :) – Tweet

0

Возможно вычисление СВД сам также использует много памяти. Если сравнивать с MATLAB, мы видим, что вычисление svd выделяет столько же памяти, сколько использует сама матрица, поэтому, если вы уже имеете 3 ГБ памяти, расчет svd, возможно, выделяет еще 3 ГБ, что дает 6 ГБ памяти.

+0

У меня 10 ГБ и проблем с памятью :( – Tweet