R - svd()函数 - 'x'中存在无限或缺失值

7

我一直遇到这个错误。我确定矩阵没有任何非数字条目。我也尝试过输入矩阵,但没有成功。

有人知道这个错误可能是什么吗?

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));

3
未来,我们希望提供一个小的可重现的示例(不需要下载)以便更好地理解问题。 - Blue Magister
1个回答

15

您拥有由全部为零组成的列。对所有零列使用scale将返回一个由NaN组成的列。要解决此问题,请删除所有零列(svd不会揭示任何关于它们的新信息),或在使用scale后将NaN列替换为零。

可复现的示例:

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

非常感谢,回答完美无缺。 在应用svd之前,使用简单的一行代码kddmatrix <- kddmatrix[,colSums(kddmatrix != 0) != 0]解决了它。 - Shubham Saini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接