2014-01-29 4 views
2

Я постоянно получаю эту ошибку. Я уверен, что в матрице нет никаких числовых записей. Я также пытался вменять матрицу, не работал.Функция R - svd() - бесконечные или отсутствующие значения в 'x'

Кто-нибудь знает, что такое ошибка?

fileUrl <- "https://dl.dropboxusercontent.com/u/76668273/kdd.csv"; 
download.file(fileUrl,destfile="./kdd.csv",method="curl"); 
kddtrain <- read.csv("kdd.csv"); 
kddnumeric <- kddtrain[,sapply(kddtrain,is.numeric)]; 
kddmatrix <- as.matrix(kddnumeric); 
svd1 <- svd(scale(kddmatrix)); 
+2

В будущем небольшой воспроизводимый пример (а не то, что требует загрузки) ценится. –

ответ

8

У вас есть столбцы, состоящие из всех нулей. Использование scale в столбце всех нулей возвращает столбец, состоящий из NaN. Чтобы решить эту проблему, удалите столбцы, в которых у вас есть все нули (svd не обнаружит ничего нового о них), или замените NaN столбцами с нулем после использования scale.

Возпроизводимо пример:

mat <- matrix(c(1,2,3,0,0,0,2,4,6,5,12,13),nrow = 3) 
    # [,1] [,2] [,3] [,4] 
# [1,] 1 0 2 5 
# [2,] 2 0 4 12 
# [3,] 3 0 6 13 
scale(mat) 
    # [,1] [,2] [,3]  [,4] 
# [1,] -1 NaN -1 -1.1470787 
# [2,] 0 NaN 0 0.4588315 
# [3,] 1 NaN 1 0.6882472 
# attr(,"scaled:center") 
# [1] 2 0 4 10 
# attr(,"scaled:scale") 
# [1] 1.000000 0.000000 2.000000 4.358899 
svd(mat) #fine 
svd(scale(mat)) # not fine 
+0

Большое спасибо, отличный ответ. простая строка kddmatrix <- kddmatrix [, colSums (kddmatrix! = 0)! = 0] перед применением svd решила ее. –