【问题标题】:Singular value decomposition in RR中的奇异值分解
【发布时间】:2023-03-22 12:21:01
【问题描述】:

按照example of wikipedia's page on SVD,我在R中创建了以下矩阵:

M <- matrix(0, 4, 5)
M[1, 1] <- 1
M[4, 2] <- 2
M[2, 3] <- 3
M[1, 5] <- 2

从包 base 计算 SVD:

s <- svd(M)

然而,s$u 是一个 4x4 矩阵,s$v 是一个 5x4 矩阵,而 V 应该是一个 5x5 矩阵,如维基百科页面(以及有关该主题的其他页面)。

所以,我有点困惑..

【问题讨论】:

标签: r svd


【解决方案1】:

默认情况下,R 不会计算所有奇异向量。 (阅读doc

如果要计算所有这些,可以使用svd 的参数nunv

例如,在你的情况下:

s = svd(M, nv = 5)

检查:

dim(s$v)
# [1] 5 5

s$u %*% cbind(diag(s$d), rep(0,4)) %*% t(s$v)
# You get M.

更一般地说,您可以通过这种方式获得所有奇异向量:

s = svd(M, nu = nrow(M), nv = ncol(M))

【讨论】:

  • 我在文档中阅读了nv &lt;= min(n, p),但我没想过尝试nv = 5。谢谢!
【解决方案2】:

我的知识 id 线性代数有点初级和尘土飞扬,但我认为这个满足 SVD 的所有条件。 SVD 只不过是将原始矩阵 M 分解为三个矩阵——一个对角矩阵 d 和两个正交矩阵 u 和 v,这样M=udv' 所以唯一的限制是v'的行数应该和u*d的列数一样

代码如下:

M <- matrix(0, 4, 5)
M[1, 1] <- 1
M[4, 2] <- 2
M[2, 3] <- 3
M[1, 5] <- 2
M

ans<- svd(M)
u<- ans$u
v<- ans$v
d<- ans$d
#u %*% I(u)
u %*% t(u) #Ok, is orthogonal 
v %*% t(v) #OK, is orthogonal
d1<- diag(d)
d1

(u%*% d1) %*% t(v) # is same as M 
u%*% (d1 %*% t(v)) # is same as M 
M

【讨论】:

  • 不应该v %*% t(v)返回一个单位矩阵吗?
  • 你是对的,实际上v %*% t(v) 没有这样做,但t(v) %*%v 返回一个完美的身份矩阵。问题是为什么。 有人能解释一下吗?
  • @R.S. v 不是真正的 SVD 中的 the v,因此它不应该是正交的。 (它甚至不是正方形)
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2010-10-31
  • 2015-04-16
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多