缩放标准化或加权

scaling standardized or weighting

我希望我能在这里找到这个问题的答案。我正在尝试仔细分析这段代码,

alphas <- matrix(runif(900), ncol=3, byrow=TRUE)
z <- t(apply(alphas, 1, cumsum)) 

for(i in 1:nrow(z)){
  z[i, ] <- z[i, ] / (1:ncol(z))
}

我想了解 z[i,]<- z[i,]/(1:ncol(z)) 代码对矩阵 alpha 做了什么。我知道我们将每一列除以输入矩阵中的列序列。我也知道当使用 apply with margin 2 时,我们应用了我们感兴趣的函数,在本例中是 "cumsum" 矩阵 alpha 的行。这基本上就是我所知道的,我不知道为什么下一行以及对我的矩阵 alpha 有什么影响?

我会很感激一些见解 非常感谢

根据您的代码,我会说您正在计算 alphas.

行累积均值

在你的循环中,你正在做一个矢量除法,它产生每一列的累积和的平均值。

看看 ncol(z) 的结果

> ncol(z)
[1] 3

所以基本上你在循环中用 z[i, ] / (1:ncol(z)) 做的是将每一行分别除以一个向量或序列,列号的长度,即 c(1, 2, 3) 或只是 1:3.

考虑您的 alphasz 的第一行。

set.seed(42)  # for sake of reproducibility

alphas <- matrix(runif(900), ncol=3, byrow=TRUE)
z <- t(apply(alphas, 1, cumsum)) 

> alphas[1, ]
[1] 0.9148060 0.9370754 0.2861395

> z[1, ]
[1] 0.914806 1.851881 2.138021

> cbind(alphas[1, 1], mean(c(alphas[1, 1:2])), mean(c(alphas[1, 1:3])))
         [,1]      [,2]      [,3]
[1,] 0.914806 0.9259407 0.7126737

循环的核心产生

> z[1, ] / 1:ncol(z)
[1] 0.9148060 0.9259407 0.7126737

因此 z[1, ] 行中的每个元素将除以其相应的向量除数,得到聚合单元格的均值 您的循环只是对整个 z 矩阵执行此操作。

Apropos — 在 R 中更快更方便,我们在一个函数中以矢量化方式执行此操作。懂了apply()就懂了sapply()。我们将通过首先定义一个函数来使用它。

FUN1 <- function(i){
  z[i, ] / 1:ncol(z)
}

M <- t(sapply(1:nrow(z), FUN1))

> head(M, 3)
          [,1]      [,2]      [,3]
[1,] 0.9148060 0.9259407 0.7126737
[2,] 0.8304476 0.7360966 0.6637630
[3,] 0.7365883 0.4356275 0.5094157

这与您的循环产生的结果相同,但采用 R 方式。

一步就可以做到这句话

z <- t(sapply(seq_len(nrow(alphas)), 
              function(i) cumsum(alphas[i, ]) / seq_along(alphas[i, ])))

> head(z, 3)
          [,1]      [,2]      [,3]
[1,] 0.9148060 0.9259407 0.7126737
[2,] 0.8304476 0.7360966 0.6637630
[3,] 0.7365883 0.4356275 0.5094157