如何按行和列对 R 中的稀疏矩阵进行归一化?
How can I normalize a sparse matrix in R by both rows and columns?
我使用 R 包 "Matrix" 创建了一个稀疏矩阵。矩阵不是正方形,其尺寸为 4561 x 68825。
我希望标准化此矩阵,以便每个值 x 等于 x / 行总和 + 列总和。我在堆栈上找到了一个解决方案,我可以更改它来解决这个问题 here。但是,在链接问题中看到的解决方案中,该问题使用方阵,所以 Diaganal 可以是 used.In 我的情况,我的矩阵不是方阵,所以我无法使这个解决方案有效。
如何按行和列对 R 中的稀疏矩阵进行归一化?
如果您只想将每个单元格除以行总和和列总和的总和,这里有一个简单的方法:
test = matrix(1:20, 4, 5)
test
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
rs = rowSums(test)
cs = colSums(test)
for(j in 1:ncol(test)){
for(i in 1:nrow(test)){
test[i,j] = test[i,j]/(rs[i] + cs[j])
}
}
test
[,1] [,2] [,3] [,4] [,5]
[1,] 0.01818182 0.07042254 0.1034483 0.1262136 0.1428571
[2,] 0.03333333 0.07894737 0.1086957 0.1296296 0.1451613
[3,] 0.04615385 0.08641975 0.1134021 0.1327434 0.1472868
[4,] 0.05714286 0.09302326 0.1176471 0.1355932 0.1492537
希望对您有所帮助!
m_final <- t(t(m/rowSums(m)) + rowSums(t(m)))
m_final
输出为:
[,1] [,2] [,3]
[1,] 0.9748283 3.326324 -0.8274075
[2,] 1.4574957 2.776025 -0.7597753
[3,] 1.9265464 2.937874 -1.3906749
[4,] 0.7105211 3.337394 -0.5741696
[5,] 1.4808831 3.030777 -1.0379153
[6,] 2.2123599 2.537209 -1.2758243
[7,] 2.8672471 2.437124 -1.8306263
[8,] 4.8144351 6.952963 -8.2936531
[9,] 1.9486587 3.382196 -1.8571098
[10,] 0.8897446 3.329129 -0.7451281
#sample data:
set.seed(1)
m <- replicate(3,rnorm(10))
> m
[,1] [,2] [,3]
[1,] -0.6264538 1.51178117 0.91897737
[2,] 0.1836433 0.38984324 0.78213630
[3,] -0.8356286 -0.62124058 0.07456498
[4,] 1.5952808 -2.21469989 -1.98935170
[5,] 0.3295078 1.12493092 0.61982575
[6,] -0.8204684 -0.04493361 -0.05612874
[7,] 0.4874291 -0.01619026 -0.15579551
[8,] 0.7383247 0.94383621 -1.47075238
[9,] 0.5757814 0.82122120 -0.47815006
[10,] -0.3053884 0.59390132 0.41794156
编辑:
如果您想进行以下计算,则可以尝试
m/(row_sum + col_sum)
m/outer(rowSums(m), colSums(m), FUN = "+")
我使用 R 包 "Matrix" 创建了一个稀疏矩阵。矩阵不是正方形,其尺寸为 4561 x 68825。
我希望标准化此矩阵,以便每个值 x 等于 x / 行总和 + 列总和。我在堆栈上找到了一个解决方案,我可以更改它来解决这个问题 here。但是,在链接问题中看到的解决方案中,该问题使用方阵,所以 Diaganal 可以是 used.In 我的情况,我的矩阵不是方阵,所以我无法使这个解决方案有效。
如何按行和列对 R 中的稀疏矩阵进行归一化?
如果您只想将每个单元格除以行总和和列总和的总和,这里有一个简单的方法:
test = matrix(1:20, 4, 5)
test
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
rs = rowSums(test)
cs = colSums(test)
for(j in 1:ncol(test)){
for(i in 1:nrow(test)){
test[i,j] = test[i,j]/(rs[i] + cs[j])
}
}
test
[,1] [,2] [,3] [,4] [,5]
[1,] 0.01818182 0.07042254 0.1034483 0.1262136 0.1428571
[2,] 0.03333333 0.07894737 0.1086957 0.1296296 0.1451613
[3,] 0.04615385 0.08641975 0.1134021 0.1327434 0.1472868
[4,] 0.05714286 0.09302326 0.1176471 0.1355932 0.1492537
希望对您有所帮助!
m_final <- t(t(m/rowSums(m)) + rowSums(t(m)))
m_final
输出为:
[,1] [,2] [,3]
[1,] 0.9748283 3.326324 -0.8274075
[2,] 1.4574957 2.776025 -0.7597753
[3,] 1.9265464 2.937874 -1.3906749
[4,] 0.7105211 3.337394 -0.5741696
[5,] 1.4808831 3.030777 -1.0379153
[6,] 2.2123599 2.537209 -1.2758243
[7,] 2.8672471 2.437124 -1.8306263
[8,] 4.8144351 6.952963 -8.2936531
[9,] 1.9486587 3.382196 -1.8571098
[10,] 0.8897446 3.329129 -0.7451281
#sample data:
set.seed(1)
m <- replicate(3,rnorm(10))
> m
[,1] [,2] [,3]
[1,] -0.6264538 1.51178117 0.91897737
[2,] 0.1836433 0.38984324 0.78213630
[3,] -0.8356286 -0.62124058 0.07456498
[4,] 1.5952808 -2.21469989 -1.98935170
[5,] 0.3295078 1.12493092 0.61982575
[6,] -0.8204684 -0.04493361 -0.05612874
[7,] 0.4874291 -0.01619026 -0.15579551
[8,] 0.7383247 0.94383621 -1.47075238
[9,] 0.5757814 0.82122120 -0.47815006
[10,] -0.3053884 0.59390132 0.41794156
编辑:
如果您想进行以下计算,则可以尝试
m/(row_sum + col_sum)
m/outer(rowSums(m), colSums(m), FUN = "+")