gpt4 book ai didi

r - 对矩阵的所有列组合进行计算

转载 作者:行者123 更新时间:2023-12-01 15:54:56 25 4
gpt4 key购买 nike

我正在尝试将函数应用于一个非常大的矩阵,我想最终创建一个 ( 40,000 by 40,000 ) 矩阵(仅完成对角线的一侧)或创建结果列表。

矩阵如下:

            obs 1     obs 2     obs 3     obs 4     obs 5     obs 6     obs 7     obs 8     obs 9
words 1 0.2875775 0.5999890 0.2875775 0.5999890 0.2875775 0.5999890 0.2875775 0.5999890 0.2875775
words 2 0.7883051 0.3328235 0.7883051 0.3328235 0.7883051 0.3328235 0.7883051 0.3328235 0.7883051
words 3 0.4089769 0.4886130 0.4089769 0.4886130 0.4089769 0.4886130 0.4089769 0.4886130 0.4089769
words 4 0.8830174 0.9544738 0.8830174 0.9544738 0.8830174 0.9544738 0.8830174 0.9544738 0.8830174
words 5 0.9404673 0.4829024 0.9404673 0.4829024 0.9404673 0.4829024 0.9404673 0.4829024 0.9404673
words 6 0.0455565 0.8903502 0.0455565 0.8903502 0.0455565 0.8903502 0.0455565 0.8903502 0.0455565

我使用 cosine(mat[, 3], mat[, 4]) 来使用该函数这给了我一个数字。

          [,1]
[1,] 0.7546113

我可以对所有列执行此操作,但我希望能够知道它们来自哪些列,即上面的计算来自列 34这是 "obs 3""obs 4" .

预期输出可能是列表或矩阵中的结果,例如:

          [,1]   [,1]   [,1]
[1,] 1 . .
[1,] 0.75 1 .
[1,] 0.23 0.87 1

(这里的数字是由组成的)

因此尺寸将是 ncol(mat) 的大小通过ncol(mat) (如果我采用矩阵法)。

数据/代码:

#generate some data

mat <- matrix(data = runif(200), nrow = 100, ncol = 20, dimnames = list(paste("words", 1:100),
paste("obs", 1:20)))


mat


#calculate the following function
library(lsa)
cosine(mat[, 3], mat[, 4])
cosine(mat[, 4], mat[, 5])
cosine(mat[, 5], mat[, 6])

附加

我考虑过执行以下操作:- 创建一个空矩阵并在 forloop 中计算函数,但它没有按预期工作并创建 40,000 by 40,000 0 的矩阵会带来内存问题。

co <- matrix(0L, nrow = ncol(mat), ncol = ncol(mat), dimnames = list(colnames(mat), colnames(mat)))
co

for (i in 2:ncol(mat)) {
for (j in 1:(i - 1)) {
co[i, j] = cosine(mat[, i], mat[, j])
}
}

co

我还尝试将结果放入列表中:

List <- list()
for(i in 1:ncol(mat))
{
temp <- List[[i]] <- mat
}

res <- List[1][[1]]
res

这也是错误的。

所以我尝试创建一个函数,它将逐列计算函数并存储结果。

最佳答案

1) 使用问题中显示的 mat,第一行创建一个 20x20 矩阵,其中填充了所有 20*20 余弦。第二行将 上的值清零和对角线上方。如果您希望对角线上方和下方的值清零,请改用 lower.tri

comat <- cosine(mat)
comat[upper.tri(comat, diag = TRUE)] <- 0

2) 或者创建结果的命名数字向量:

covec <- c(combn(as.data.frame(mat), 2, function(x) c(cosine(x[, 1], x[, 2]))))
names(covec) <- combn(colnames(mat), 2, paste, collapse = "-")

3) 我们可以利用以下事实:非对角余弦与高达一个因子 mult 的相关性相同。

mult <- c(cosine(mat[, 1], mat[, 2]) / cor(mat[, 1], mat[, 2]))
co3 <- mult * cor(mat)
co3[upper.tri(co3, diag = TRUE)] <- 0

3a) 这将使用 R 中可用的多个相关函数中的任何一个打开。例如,使用刚刚计算的 mult:

library(HiClimR)
co4 <- mult * fastCor(mat)
co4[upper.tri(co4, diag = TRUE)] <- 0

3b)

library(propagate)
co5 <- mult * bigcor(mat)
co5[upper.tri(co5, diag = TRUE)] <- 0

3c)

co6 <- crossprod(scale(mat)) / (nrow(mat) - 1)
co6[upper.tri(co6, diag = TRUE)] <- 0

关于r - 对矩阵的所有列组合进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com