【问题标题】:How can I normalize a sparse matrix in R by both rows and columns?如何按行和列对 R 中的稀疏矩阵进行归一化?
【发布时间】:2018-05-21 03:49:50
【问题描述】:

我使用 R 包“Matrix”创建了一个稀疏矩阵。该矩阵不是正方形,其尺寸为 4561 x 68825。

我希望标准化这个矩阵,以便每个值 x 等于 x / 行总和 + 列总和。我在堆栈上找到了一个解决方案,我可以改变它来解决这个问题here。但是,在链接问题中看到的解决方案中,该问题使用方阵,因此可以使用对角线。在我的情况下,我的矩阵不是方阵,因此我无法使此解决方案起作用。

如何按行和列对 R 中的稀疏矩阵进行归一化?

【问题讨论】:

    标签: r matrix sparse-matrix normalization


    【解决方案1】:

    希望这会有所帮助!

    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 = "+")
    

    【讨论】:

    • 我刚刚意识到在描述我希望如何规范化数据时我没有括号。我实际上希望将其标准化为 x /(行总和 + 列总和)。但是,使用您的代码,是否可以这样正确地完成:m/(rowSums(m) + colSums(m))?
    • @J0HN_TIT0R 查看更新后的答案。希望这会有所帮助!
    【解决方案2】:

    如果您只是想将每个单元格除以行总和和列总和,这里有一个简单的方法:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多