ошибка вычисления матрицы - PullRequest
0 голосов
/ 05 февраля 2011

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

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

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

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

Ответы [ 3 ]

1 голос
/ 05 февраля 2011

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

Причина этого предположения в том, что первая строка кодавнутри 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

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

0 голосов
/ 05 февраля 2011

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

0 голосов
/ 05 февраля 2011

Если вы храните дубликаты по 8 байт, 20Kx20K означает 8 * 20 000 * 20 000/1024/1024 ~ 3 ГБ ОЗУ для хранения всего этого в памяти.

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

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

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

ОБНОВЛЕНИЕ:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...