随机数据的SVD结果中的怪异相关性;他们有数学解释还是LAPACK错误?


21

我在随机数据的SVD结果中观察到一个非常奇怪的行为,可以在Matlab和R中重现该行为。是吗?

我从k = 2维高斯中抽取了n=1000样本,均值和均方差为零:。我装配它们在数据矩阵。(我可以选择是否使居中,这不会影响以下内容。)然后我执行奇异值分解(SVD)来获得。让我们看一下两个特定元素,例如和,并询问在不同绘制之间它们之间的相关性是什么k=21000 × 2 X X X = û 小号Vû û 11 ù 22 XXN(0,I)1000×2XXX=USVUU11U22X。我希望,如果抽奖次数相当大,则所有此类相关性都应在零附近(即总体相关性应为零,样本相关性将很小)。Nrep

但是,我观察到U_ {11}U_ {12}U_ {21}U_ {22}之间以及在这些元素之间存在一些奇怪的强相关性(大约)。如预期的那样,所有其他成对的元素都具有约零的相关性。下面是如何用于相关矩阵20的“上”元素\ mathbfù看起来像(第一10个的第一列的元件,则第一10个,第二列的元素):±0.2U11U12U21U2220U1010

SVD怪异的相关性

请注意,每个象限的左上角都有很高的值。

正是@whuber的评论引起了我的注意。@whuber认为PC1和PC2不是独立的,并提供了这种强相关性作为证据。但是,我的印象是他无意中发现了LAPACK库中的一个数字错误。这里发生了什么?

这是@whuber的R代码:

stat <- function(x) {u <- svd(x)$u; c(u[1,1], u[2, 2])};
Sigma <- matrix(c(1,0,0,1), 2);
sim <- t(replicate(1e3, stat(MASS::mvrnorm(10, c(0,0), Sigma))));
cor.test(sim[,1], sim[,2]);

这是我的Matlab代码:

clear all
rng(7)

n = 1000;     %// Number of variables
k = 2;        %// Number of observations
Nrep = 1000;  %// Number of iterations (draws)

for rep = 1:Nrep
    X = randn(n,k);
    %// X = bsxfun(@minus, X, mean(X));
    [U,S,V] = svd(X,0);

    t(rep,:) = [U(1:10,1)' U(1:10,2)'];
end

figure
imagesc(corr(t), [-.5 .5])
axis square
hold on
plot(xlim, [10.5 10.5], 'k')
plot([10.5 10.5], ylim, 'k')

如果您使用n = 4和k = 3,那么您也会看到相关性。
阿萨卡(Aksakal)

@Aksakal:是的,的确如此,谢谢。我进行了编辑,以消除k = 2和k = 3之间的差异。
变形虫说恢复莫妮卡

Answers:


23

这不是错误。

正如我们在注释中(广泛地)探讨的那样,发生了两件事。首先是U的列必须满足SVD要求:每列必须具有单位长度,并且必须与所有其他列正交。将U视为通过特定SVD算法从随机矩阵X创建的随机变量,因此,我们注意到,这些k(k+1)/2功能上独立的约束在U的列之间创建统计依赖性。

通过研究U各个组成部分之间的相关性,可以或多或少地揭示这些依赖性,但是出现了第二种现象:SVD解决方案不是唯一的。至少,U每一列都可以独立取反,以k列给出至少2k不同的解。很强的相关性(超过1 / 2)可以通过适当地改变的列的符号进行诱导。(在此线程中,我对变形虫的回答的第一条评论给出了一种方法:我强制所有u i ii = 1 k1/2uii,i=1,,k具有相同的符号,使它们全都为负或全为正,具有相同的概率。)另一方面,通过独立地以相等的概率独立地选择这些符号,可以使所有相关性消失。(我在下面的“编辑”部分中给出了一个示例。)

在阅读U散点图矩阵时,我们可以谨慎地部分分辨这两种现象。某些特征(例如点的外观几乎均匀分布在定义良好的圆形区域内)相信缺乏独立性。其他散点图(显示清晰的非零相关性)显然取决于算法中做出的选择,但是仅由于首先缺乏独立性,才有可能做出这样的选择。

诸如SVD(或Cholesky,LR,LU等)之类的分解算法的最终测试是它是否达到了要求。在这种情况下,只要检查SVD返回矩阵的三元组(U,D,V),就足以检查X是否被乘积UDV恢复到预期的浮点误差。UV的列是正交的;并且D是对角线,其对角线元素为非负,并按降序排列。我已经将这样的测试应用于svd算法R从来没有发现它是错误的。尽管这不能保证它是完全正确的,但是我相信很多人都分享了这种经验,这建议任何错误都需要某种特殊的输入才能体现出来。

接下来是对问题中提出的具体问题的更详细分析。


使用Rsvd过程,首先您可以检查是否随着k增加,U系数之间的相关性变弱,但它们仍为非零。 如果只是执行更大​​的仿真,您会发现它们很重要。(当k=3,应满足50000次迭代。)与问题中的断言相反,相关性不会“完全消失”。

第二,研究这种现象的更好方法是回到系数独立性这一基本问题。尽管在大多数情况下,相关性趋于接近于零,但显然缺乏独立性。 通过研究U系数的完整多元分布,这一点最为明显。即使在尚无法检测到非零相关性的小型仿真中,也出现了分布的性质。例如,检查系数的散点图矩阵。为了使之可行,我将每个模拟数据集的大小设置为4并保持k=2,从而绘制1000实现4×2矩阵U,创建1000×8矩阵。这是其完整的散点图矩阵,其中变量按其在U的位置列出:

Figure

向下浏览第一列揭示了u11与另一个uij之间有趣的缺乏独立性:看看使用u 21时散点图的上象限如何u21几乎是空的;或检查描述(u11,u22)关系的椭圆形向上倾斜的云和(u21,u12)对的向下倾斜的云。 仔细观察发现,几乎所有这些系数之间显然都缺乏独立性: 尽管它们中的大多数具有接近零的相关性,但它们中几乎没有看起来是远程独立的。

(注意:大多数圆形云是超球的投影,该超球是由归一化条件(将每一列的所有成分的平方和统一为统一)创建的。)

k=3k=4散点图矩阵表现出相似的模式:这些现象不仅限于k=2,也不取决于每个模拟数据集的大小:它们变得更加难以生成和检查。

这些模式的解释将转到用于在奇异值分解中获取U的算法,但是我们知道这种非独立的模式必须通过U的非常定义的属性而存在:因为每个连续的列(在几何上)都与前面的列正交在这些情况下,这些正交性条件在系数之间强加了功能依赖性,从而转化为相应随机变量之间的统计依赖性。


编辑

在回应评论时,可能值得一提的是,这些依赖现象在多大程度上反映了基础算法(用于计算SVD)以及它们在流程性质中固有的程度。

系数之间的相关性的特定模式在很大程度上取决于SVD算法做出的任意选择,因为解决方案不是唯一的:U的列可以始终独立地乘以11。没有内在的方式来选择标志。因此,当两个SVD算法使标志的不同(任意甚至可能是随机的)的选择,他们可以导致的散点图的不同模式(uij,uij)值。如果您希望看到此信息,请用stat以下代码替换下面代码中的函数

stat <- function(x) {
  i <- sample.int(dim(x)[1]) # Make a random permutation of the rows of x
  u <- svd(x[i, ])$u         # Perform SVD
  as.vector(u[order(i), ])   # Unpermute the rows of u
}

这首先是对观察值x进行随机重排序,执行SVD,然后对u来匹配原始的观测序列。因为效果是形成原始散点图的反射和旋转版本的混合,所以矩阵中的散点图看起来更加均匀。所有样本相关性都将非常接近零(根据构造:基础相关性恰好为零)。然而,缺乏独立性仍将是显而易见的(在出现的统一圆形中,尤其是在ui,jui,j)。

某些原始散点图(如上图所示)的某些象限中缺少数据是由于RSVD算法如何为列选择符号。

结论没有改变。 由于U的第二列与第一列正交,因此它(被视为多元随机变量)依赖于第一列(也被视为多元随机变量)。您不能使一列的所有组件都独立于另一列的所有组件。您所能做的就是以掩盖依赖性的方式查看数据,但是依赖性将持续存在。


这是更新的R代码,用于处理k>2的情况并绘制散点图矩阵的一部分。

k <- 2    # Number of variables
p <- 4    # Number of observations
n <- 1e3  # Number of iterations
stat <- function(x) as.vector(svd(x)$u)
Sigma <- diag(1, k, k); Mu <- rep(0, k)
set.seed(17)
sim <- t(replicate(n, stat(MASS::mvrnorm(p, Mu, Sigma))))
colnames(sim) <- as.vector(outer(1:p, 1:k, function(i,j) paste0(i,",",j)))
pairs(sim[, 1:min(11, p*k)], pch=".")

3
由于SVD算法是这样工作的,所以在列的第一部分之间会产生相关性。X的行是高斯无关紧要的:我确定您已经注意到U的系数UXU不是高斯。
ub

2
顺便说一句,我刚刚发现,简单地替换svd(X,0)svds(X)我Matlab代码使得效果消失!据我所知,这两个函数使用不同的SVD算法(都是LAPACK例程,但显然是不同的)。我不知道R是否具有类似于Matlab的函数svds,但是我想知道您是否仍然要保持它是“真实”效果而不是数值问题。
变形虫说恢复莫妮卡

4
先生们,请稍等。你为什么不说这个标志?特征向量的符号基本上是任意的。但是svd的程序不会随机分配它,其符号取决于svd的实现和数据。如果在提取之后U您随机决定其各列是保持原状还是要更改其符号,那么您正在谈论的相关性就不会消失吗?
ttnphns

2
@ttnphns正确,如我的编辑中所述。尽管这使相关性消失了,但是U列之间的依存关系并没有因此消失。(提供的I 增强版本等效于随机更改列的符号。)Ustat
whuber

2
有一个小问题(指向这个伟大的线程!),SVD不必使对角线中的元素S具有特定的顺序;这是一个方便的问题。其他例程保证了这一点(例如MATLAB的svds),但这不是一般要求。@amoeba:看svds(似乎没有这种有问题的行为),该计算是基于实际首先计算特征值的(因此它不使用标准dgesdd/ dgesvdLAPACK例程-我强烈怀疑它首先使用dsyevr/ dsyevx)。
usεr11852恢复单胞菌说,

11

此答案提供了@whuber结果在Matlab中的复制,也直接证明了相关性是SVD实现如何选择组件符号的“伪像”。

考虑到一长串可能引起混淆的评论,我想向未来的读者强调,我完全同意以下观点:

  1. 在此讨论中, 当然一个随机变量。U
  2. 列的长度必须为1。这意味着每一列内的元素不是独立的。它们的平方和为1。但是,这并不意味着对于i jU i 1U j 1之间没有任何相关性,并且对于大数N,样本相关性应该很小U1Ui1Uj1ij的随机抽取。Nrep
  3. 列必须正交。这意味着来自不同列的元素不是独立的。他们的点积为零。同样,这并不意味着U i 1U j 2之间存在任何相关性,并且样本相关性应该很小。UUi1Uj2

我的问题是:即使对于大量随机抽取N r e p = 1000,为什么我们仍看到高相关性?0.2Nrep=1000

这是@whuber示例的复制品,其中k = 2N r e pn=4k=2在Matlab:Nrep=1000

SVD

左侧是相关矩阵,右侧是-与@whuber相似的散点图。我们的模拟之间的协议似乎很完美。

现在,按照@ttnphns的巧妙建议,我将随机符号分配给 ,即在此行之后:U

[U,S,V] = svd(X,0);

我添加以下两行:

U(:,1) = U(:,1) * sign(randn(1));
U(:,2) = U(:,2) * sign(randn(1));

结果如下:

SVD with random signs

所有的相关性都消失了,完全像我一开始所期望的那样

正如@whuber所说,缺乏独立性可以从一些散点图的完美圆形中看出(因为每列的长度必须等于,所以任何两个元素的平方和不能超过111)。但是相关性确实消失了。

总结整个问题,我们看到了很强的相关性,因为LAPACK 以一种似乎依赖于前两个数据点的特定方式为列选择符号。U这肯定不是错误,因为分解是正确的。但是LAPACK本质上是通过利用分配符号的自由来创建这些“工件”相关性。这些相关性未反映U元素的依赖性U ; 相反,它们反映了SVD解决方案的自由性以及特定LAPACK对其进行修复的约定。

PS。恭喜@whuber今天获得10万美誉!


statstat <- function(x) { u <- svd(x)$u; as.vector(sign(runif(1) - 1/2)*u %*% diag(sign(diag(u)))) }U(u11,u22,,ukk)UU

svdssvdUU

R±2/30.2

1
U

1
Intuitively, that's fair. As soon as the first principal axis is defined in space the rest pr. axes get reduced freedom. In case of 2D data the second (last) PC is tied entirely, except the sign. I'd rather call it constraint, not dependence in statistical sense.
ttnphns

0

Check the norm of your singular vectors U and V, it's 1 by definition. You don't need to go through SVD to get the same exact matrix you plot by simply generating two random variables x and y with the constraint that the sum of their squares is 1:

x2+y2=1

Assume that the means are zero, then

Cov[x,y]=Var[xy]=E[x2y2]E[xy]2

This will not be equal to zero. You can plug the standard normal into x and y to see what's the value of covariance to be expected here.


Although this observation is pertinent, it addresses only interdependencies among the individual components of each column (and as such is included within the k(k+1)/2 independent constraints on U). The question that got all this started concerned dependencies between different columns of U: that's why so little attention has been paid to correlations within each column. Another (perhaps fruitful) way to look at this is to roll D into U and analyze the columns of UD, which are no longer normalized, but are still subject to k(k1)/2 constraints.
whuber

It's the columns of U that have length 1, not the rows (in case when U is not square, but has n rows and k columns with n>k). The columns of U have n elements, and we have been discussing two particular cases in this thread: in my question I suggested to consider n=1000, and in his answer @whuber chose to consider n=4. Your example with x2+y2=1 includes only two random variables, so it does not fit to the rest of the discussion here. If you could make a statement about what should be the correlation between two elements of one column of U, that would be interesting.
amoeba says Reinstate Monica

@Amoeba We can make Asksakal's example pertinent either by taking x to be the first component of a column of U and y to be the norm of the remaining components or by extending the example inductively to more variables. Unfortunately, the conclusion is incorrect: it is perfectly possible for x2+y2=1, each with zero mean, yet for Cov(x,y)=0. Take, for instance, x=cos(θ) and y=sin(θ) for θ uniformly distributed on [0,2π).
whuber

@whuber, yes, I agree. The mistake in Aksakal's argument is that individual elements of U are definitely not standard normal! If the sign of each column is randomized, then (in my simulation) the mean of each Uij is around 0 and the variance is around 1/n, which makes total sense -- add up n variances in one column and you will get n1/n=1, as required by the constraint. This is assuming the elements are uncorrelateed, which they seem to be.
amoeba says Reinstate Monica

1
@Aksakal, I invite you to run a simulation and see for yourself that they are indeed uncorrelated; just be sure to randomize the sign of each column of U on each iteration. If you want an intuitive proof, observe that there is nothing "special" about any particular row of X, meaning that if correlation between U11 and U21 is ρ, then it must be the same for any other pair. So we have n random variables with correlation matrix having all off-diagonal elements equal to ρ. Now, is ρ positive or negative? The problem doesn't seem to offer a choice, hence ρ=0.
amoeba says Reinstate Monica
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.