2011-02-05 4 views
0

J'utilise l'outil R pour calculer SVD (svd(m)) et il fonctionne sur une petite matrice mais comme je la passe 20Kx20X matrice. Après le traitement, il donne l'erreur suivanteerreur de calcul de la matrice

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

J'ai vérifié et il n'y a pas de ligne ou d'une colonne avec les valeurs 0 et aucun doublon dans la ligne et la colonne . Toutes les colonnes ont des valeurs.

Je ne peux pas passé matrice 20Kx20K ici :(

Répondre

1

Je suppose que votre problème n'est pas lié à la taille de la mémoire, bien que je ne sois pas capable de traiter une matrice 20Kx20K sur ma machine mémoire de 4 Go.

La raison de cette conjecture est que la première ligne de code à l'intérieur SVD() est le suivant:

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

En d'autres termes, le test de la fonction SVD() d'abord s'il y a des valeurs infinies dans vos données.

Cela se produit avant tout autre traitement.Donc, si vous aviez des problèmes de mémoire, ceux-ci seraient apparents avant même votre appel à svd().

Je vous suggère de vérifier les valeurs infinies:

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

[1] 2 3 

Cela indique que les deuxième et troisième valeurs sont considérées comme non finie. En d'autres termes, toute valeur NA dans vos données provoquera votre erreur.

+0

comment puis-je savoir quelle valeur est NA dans mes données? Et j'ai 10 Go de RAM.J'ai utilisé votre code> qui (est. fini (m)) nommé integer (0) pour vérifier s'il y a une valeur finie et il m'a donné un entier appelé (0) – Tweet

+0

qui() identifie les éléments qui sont vrais.Mon code vous dira quels éléments provoquent la Important - notez le point d'exclamation de la négation.! is.finite() – Andrie

+0

cela n'a pas résolu le problème J'ai utilisé votre fonction et elle ne m'a rien dit. :(toute aide? – Tweet

0

Si vous stockez doubles qui sont 8 octets, 20Kx20K signifie 8 * 20 000 * 20 000/1024/1024 ~ 3 Go de RAM pour tenir la chose en mémoire.

Je ne sais pas combien de RAM vous avez disponible, mais je regarde dans ce que R peut faire pour sérialiser la matrice sur le disque au besoin.

est la matrice clairsemée ou bagués? Can vous faites quelque chose pour diminuer la quantité de mémoire dont vous avez besoin?

Quelle est la taille de l'espace nul pour votre matrice? Quel est le numéro de condition (rapport de la valeur propre la plus grande à la plus petite)? Un grand nombre de conditions peut être une indication de difficultés à résoudre. Une matrice n'a pas besoin d'avoir une ligne ou une colonne nulle pour être presque singulière.

MISE À JOUR:

Sur la base de votre commentaire, je dirais que la RAM est le moindre de vos problèmes. On dirait qu'il est possible de garder toute la matrice en mémoire - si vous pouvez tout résoudre. Vous pouvez adresser toute la matrice. Vous utilisez un système d'exploitation 64 bits. Est-ce votre version de R 64 bits également?

Malheureusement, l'un des sous-produits de SVD est d'obtenir la taille de l'espace nul.

Vous pouvez obtenir la valeur propre minimale de votre matrice en utilisant l'itération de Jacobi. Lanczos pourrait être un bon choix pour obtenir le maximum de valeur propre. Ce serait beaucoup de travail pour les obtenir tous; vous voudrez peut-être juste évaluer les cinq plus petites et les plus grandes.

Chaque fois que je rencontre une erreur avec un logiciel, je le colle immédiatement dans une recherche Google. Au moins, il est réconfortant de savoir que je ne suis pas le premier à l'expérience d'un problème particulier:

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

+0

Salut, Merci pour votre réponse. Oui ma matrice est clairsemée. J'ai 10 Go de RAM. Je n'ai pas de problème de mémoire. Comment vérifier l'espace nul? ratio pour la valeur propre? – Tweet

+0

Salut, merci d'expliquer en détail. Oui, R et OS ont 64 bits. J'ai essayé différentes manières de résoudre ce problème, mais en vain ... – Tweet

+0

Merci, j'ai déjà cherché google et lu ces messages et solutions, mais cela ne résout pas mon problème. C'est pourquoi je suis venu ici pour le conseil de Gurus :) – Tweet

0

Peut-être le calcul de SVD lui-même utilise aussi beaucoup de mémoire. Si on compare avec MATLAB, on voit que le calcul svd alloue autant de mémoire que la matrice elle-même, donc si vous avez déjà 3 Go de mémoire, le calcul svd alloue 3 Go de plus, ce qui donne 6 Go de mémoire.

+0

J'ai 10 Go et aucun problème de mémoire :( – Tweet