【问题标题】:SVD function in R. I want to get the singular values $d from a list of datasets. I want to put it in a table formR中的SVD函数。我想从数据集列表中获取奇异值$d。我想把它放在表格中
【发布时间】:2021-05-26 04:18:12
【问题描述】:

我想使用 svd 函数来获取列表中大型数据集的奇异值。 当我在单个矩阵中使用 svd 函数时,我可以使用 $d 并获取值,但对于列表,我无法获取输出。 这是矩阵和输出的代码。

     tb = matrix(c(64,  112,    59, 174,    111,    37,
              39,   135,    115,    92, 161,    70,
              93,   119,    50, 142,    20, 114,
              149,  191,    62, 17, 145,    21,
              60,   37, 29, 74, 42, 242), nrow = 5, ncol = 6, byrow = TRUE)




## Compute SVD of tb
#
     my_svd = svd(tb)

## Retrieve (save) singular values
#
     sv = my_svd$d

## Compute ratio between "1st/2nd" & "2nd/3rd" singular values
#
    ratios = matrix(c(sv[1]/sv[2], sv[2]/sv[3]), nrow = 1)
    colnames(ratios) = c("sv1/sv2", "sv2/sv3")

## Print ratios
ratios

如何将其应用于数据集列表? 我当前的代码

     svdresult <- lapply(d1,svd)
     svdresult

d1 是我的数据集列表

如何在数据集列表中获取 svdresult$d。

Thanks in advance

【问题讨论】:

  • 请按照上面的代码制作一个表格

标签: r svd


【解决方案1】:

可能类似于以下内容?


get_svd_ratios <- function(data) {
  sv = svd(data)$d
  n = length(sv)
  ratios = matrix(sv[1:(n - 1)] / sv[2:n] , nrow = 1)
  names = paste(
    paste0("sv", 1:(n - 1)), 
    paste0("sv", 2:n), 
    sep = "/"
  )
  colnames(ratios) = names
  return(ratios)
}

lapply(list(tb), get_svd_ratios)

# [[1]]
#       sv1/sv2  sv2/sv3 sv3/sv4  sv4/sv5
# [1,] 2.261771 1.680403 1.29854 2.682195

【讨论】:

  • 非常感谢。这行得通。但是,我只需要前两个。即 sv1/sv2、sv2/sv3。请问如何调整代码。
  • 我已经设法调整了代码。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2019-06-13
  • 2015-12-11
  • 2022-07-06
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多