缩放标准化或加权
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
.
考虑您的 alphas
和 z
的第一行。
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
我希望我能在这里找到这个问题的答案。我正在尝试仔细分析这段代码,
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
.
考虑您的 alphas
和 z
的第一行。
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