对于随机矩阵,SVD不应完全不解释吗?我究竟做错了什么?


13

如果我构建一个完全由随机数据组成的二维矩阵,我希望PCA和SVD组件本质上什么也不能解释。

相反,第一个SVD列似乎可以解释75%的数据。怎么可能呢?我究竟做错了什么?

这是情节:

在此处输入图片说明

这是R代码:

set.seed(1)
rm(list=ls())
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
svd1 <- svd(m, LINPACK=T)
par(mfrow=c(1,4))
image(t(m)[,nrow(m):1])
plot(svd1$d,cex.lab=2, xlab="SVD Column",ylab="Singluar Value",pch=19)

percentVarianceExplained = svd1$d^2/sum(svd1$d^2) * 100
plot(percentVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD Column",ylab="Percent of variance explained",pch=19)

cumulativeVarianceExplained = cumsum(svd1$d^2/sum(svd1$d^2)) * 100
plot(cumulativeVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD column",ylab="Cumulative percent of variance explained",pch=19)

更新资料

谢谢@亚伦。如您所述,解决方法是在矩阵上增加比例,以便数字以0为中心(即平均值为0)。

m <- scale(m, scale=FALSE)

这是校正后的图像,显​​示了对于具有随机数据的矩阵,第一SVD列接近预期的0。

校正后的图像


4
[0,1]100R100Rnn1/3n/3(n1)/121/12(n/3(n1)/12)/(n/3)=3/4+1/(4n)n=10075.25

Answers:


11

第一台PC正在解释变量没有以零为中心。首先按比例缩放或将随机变量围绕零进行居中,将得到您期望的结果。例如,以下任何一个:

m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
m <- scale(m, scale=FALSE)

m <- matrix(runif(10000,min=-25,max=25), nrow=100,ncol=100)

3
您提出了一个很好的观点,但是我认为这仅说明了部分故事。确实,我猜想OP将尝试其中的每一个,但仍然会对结果感到惊讶。问题的事实是,因为奇异值在输出中是有序的,所以它们不会像从“随机”数据中天真地期望的那样出现(并且实际上不会)均匀分布。在这种情况下,Marchenko-Pastur分布控制其行为。
主教

@Aaron谢谢你,你是绝对正确的。我在上面添加了校正输出的图形,以显示结果的美观程度。
Contango

1
@cardinal感谢您的评论,您绝对正确(请参见上面的更正代码生成的图表)。我相信,随着矩阵变小,SVD值将变得不那么均匀分布,因为较小的矩阵将有更大的机会拥有不会被大数定律压缩的模式。
Contango

3

通过使用空模型比较,我将为您的问题添加更直观的答案。该过程随机地对每一列中的数据进行混洗,以保留总体方差,同时丢失变量(列)之间的协方差。这将执行几次,然后将随机矩阵中所得的奇异值分布与原始值进行比较。

我使用prcomp而不是svd进行矩阵分解,但是结果相似:

set.seed(1)
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)

S <- svd(scale(m, center = TRUE, scale=FALSE))
P <- prcomp(m, center = TRUE, scale=FALSE)
plot(S$d, P$sdev) # linearly related

对以下居中矩阵执行空模型比较:

library(sinkr) # https://github.com/marchtaylor/sinkr

# centred data
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

以下是置换矩阵的箱线图,每个奇异值的95%分位数显示为实线。的PCA的原始值为m点。它们都位于95%线以下-因此其幅度与随机噪声是无法区分的。

在此处输入图片说明

可以在的非中心版本上m执行相同的步骤,结果相同-没有明显的奇异值:

# centred data
Pnull <- prcompNull(m, center = FALSE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=TRUE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

在此处输入图片说明

为了进行比较,让我们看一下具有非随机数据集的数据集: iris

# iris dataset example
m <- iris[,1:4]
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda, ylim=range(Pnull$Lambda, Pnull$Lambda.orig), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

在此处输入图片说明

在这里,第一个奇异值很重要,并且解释了超过92%的总方差:

P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184

+1。Iris数据集的示例很有趣,因为查看前两台PC(例如在您自己的文章stats.stackexchange.com/a/88092中),很显然第二台PC 确实承载了一些信号。排列(也称为混洗)测试表明尽管只有第一个是“有意义的”。显然,改组往往会低估PC的数量:第一个实际PC的较大差异将在改组后的PC之间“散布”,并将从第二个PC开始提升所有PC。可以设计出更敏感的测试来解决这个问题,但这很少做到。
变形虫说恢复莫妮卡

@amoeba-极好的评论。我一直想知道“散布”效应已经有一段时间了。我想交叉验证测试可能是您引用的更敏感的测试之一(例如,您的答案在这里)?如果您能提供示例/参考,那就太好了。
Marc in box

我通常更喜欢使用交叉验证(根据重建错误,根据我的回答),但实际上我不确定它是否也因某种不敏感而遭受痛苦。在Iris数据集上进行尝试可能很有意义。关于基于混洗的方法,对于这种“扩展”,我不知道有任何参考,我只知道最近有人在研究它。我认为他们想尽快写出来。这样做的目的是为洗牌度较高的PC的差异引入一些缩小比例的因素。
变形虫说恢复莫妮卡

@amoeba-感谢您的链接。它为我解释了很多。我发现特别有趣的是,PCA中的交叉验证利用了可以对缺少值的数据集进行操作的方法。我对此方法进行了一些尝试,并且(如您所述)空模型改组方法的确确实会低估了有效PC的数量。但是,对于虹膜数据集,我始终会返回一台PC,以获取重建错误。考虑到您提到的情节,这很有趣。可能是如果我们根据物种预测来衡量误差,则结果可能会有所不同。
Marc in box

出于好奇,我在Iris数据上进行了尝试。实际上,我确实使用交叉验证方法获得了两台重要的PC。我更新了链接的帖子,请在此处查看。
变形虫说恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.