这不是错误。
正如我们在注释中(广泛地)探讨的那样,发生了两件事。首先是U的列必须满足SVD要求:每列必须具有单位长度,并且必须与所有其他列正交。将U视为通过特定SVD算法从随机矩阵X创建的随机变量,因此,我们注意到,这些k(k+1)/2功能上独立的约束在U的列之间创建统计依赖性。
通过研究U各个组成部分之间的相关性,可以或多或少地揭示这些依赖性,但是出现了第二种现象:SVD解决方案不是唯一的。至少,U每一列都可以独立取反,以k列给出至少2k不同的解。很强的相关性(超过1 / 2)可以通过适当地改变的列的符号进行诱导。(在此线程中,我对变形虫的回答的第一条评论给出了一种方法:我强制所有u i i,i = 1 ,k1/2uii,i=1,…,k具有相同的符号,使它们全都为负或全为正,具有相同的概率。)另一方面,通过独立地以相等的概率独立地选择这些符号,可以使所有相关性消失。(我在下面的“编辑”部分中给出了一个示例。)
在阅读U散点图矩阵时,我们可以谨慎地部分分辨这两种现象。某些特征(例如点的外观几乎均匀分布在定义良好的圆形区域内)相信缺乏独立性。其他散点图(显示清晰的非零相关性)显然取决于算法中做出的选择,但是仅由于首先缺乏独立性,才有可能做出这样的选择。
诸如SVD(或Cholesky,LR,LU等)之类的分解算法的最终测试是它是否达到了要求。在这种情况下,只要检查SVD返回矩阵的三元组(U,D,V),就足以检查X是否被乘积UDV′恢复到预期的浮点误差。U和V的列是正交的;并且D是对角线,其对角线元素为非负,并按降序排列。我已经将这样的测试应用于svd
算法R
从来没有发现它是错误的。尽管这不能保证它是完全正确的,但是我相信很多人都分享了这种经验,这建议任何错误都需要某种特殊的输入才能体现出来。
接下来是对问题中提出的具体问题的更详细分析。
使用R
的svd
过程,首先您可以检查是否随着k增加,U系数之间的相关性变弱,但它们仍为非零。 如果只是执行更大的仿真,您会发现它们很重要。(当k=3,应满足50000次迭代。)与问题中的断言相反,相关性不会“完全消失”。
第二,研究这种现象的更好方法是回到系数独立性这一基本问题。尽管在大多数情况下,相关性趋于接近于零,但显然缺乏独立性。 通过研究U系数的完整多元分布,这一点最为明显。即使在尚无法检测到非零相关性的小型仿真中,也出现了分布的性质。例如,检查系数的散点图矩阵。为了使之可行,我将每个模拟数据集的大小设置为4并保持k=2,从而绘制1000实现4×2矩阵U,创建1000×8矩阵。这是其完整的散点图矩阵,其中变量按其在U的位置列出:
向下浏览第一列揭示了u11与另一个uij之间有趣的缺乏独立性:看看使用u 21时散点图的上象限如何u21几乎是空的;或检查描述(u11,u22)关系的椭圆形向上倾斜的云和(u21,u12)对的向下倾斜的云。 仔细观察发现,几乎所有这些系数之间显然都缺乏独立性: 尽管它们中的大多数具有接近零的相关性,但它们中几乎没有看起来是远程独立的。
(注意:大多数圆形云是超球的投影,该超球是由归一化条件(将每一列的所有成分的平方和统一为统一)创建的。)
k=3和k=4散点图矩阵表现出相似的模式:这些现象不仅限于k=2,也不取决于每个模拟数据集的大小:它们变得更加难以生成和检查。
这些模式的解释将转到用于在奇异值分解中获取U的算法,但是我们知道这种非独立的模式必须通过U的非常定义的属性而存在:因为每个连续的列(在几何上)都与前面的列正交在这些情况下,这些正交性条件在系数之间强加了功能依赖性,从而转化为相应随机变量之间的统计依赖性。
编辑
在回应评论时,可能值得一提的是,这些依赖现象在多大程度上反映了基础算法(用于计算SVD)以及它们在流程性质中固有的程度。
系数之间的相关性的特定模式在很大程度上取决于SVD算法做出的任意选择,因为解决方案不是唯一的:U的列可以始终独立地乘以−1或1。没有内在的方式来选择标志。因此,当两个SVD算法使标志的不同(任意甚至可能是随机的)的选择,他们可以导致的散点图的不同模式(uij,ui′j′)值。如果您希望看到此信息,请用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,j和ui,j′)。
某些原始散点图(如上图所示)的某些象限中缺少数据是由于R
SVD算法如何为列选择符号。
结论没有改变。 由于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=".")