gpt4 book ai didi

r - 以不同的概率重复采样

转载 作者:行者123 更新时间:2023-12-02 15:34:23 25 4
gpt4 key购买 nike

在下面的代码中,“权重”是一个权重集的大矩阵。这个矩阵由 1000 行和 4 列组成。每行是一组权重(每行元素之和等于一个)。

此外,有四个对象,我想根据每个权重集选择其中一个。换句话说,应该对所有权重集重复这种随机选择。

现在我已经用for 解决了这个问题。但是有没有更有效的方法在 R 中对其进行编码?

y <- c("a", "b", "c", "d")
for(i in 1:nrow(Weight)){
selection[i] <- sample(y, 1, prob=Weight[i,]) #selection is a vector with the same number of rows as Weight
}

最佳答案

一种更有效的方法是首先计算权重的逐行累积总和,然后在 01 之间绘制一个数字,然后查看它落在哪个位置累计金额。这样,您只需对 runif 执行一次 调用即可获取随机数据,而不是使用其他方法进行 1000 调用。

Weight <- matrix(sample(1:100, 1000 * 4, TRUE), 1000, 4)

x <- runif(nrow(Weight))
cumul.w <- Weight %*% upper.tri(diag(ncol(Weight)), diag = TRUE) / rowSums(Weight)
i <- rowSums(x > cumul.w) + 1L
selection <- y[i]

另请注意我是如何通过乘以三角矩阵而不是使用较慢的 apply(Weight, 1, cumsum) 来计算累积和的。一切都是矢量化的,所以它应该比使用 applyfor 循环快得多。


applyfor 的基准比较:

f_runif <- function(Weight, y) {
x <- runif(nrow(Weight))
cumul.w <- Weight %*% upper.tri(diag(ncol(Weight)), diag = TRUE) /
rowSums(Weight)
i <- rowSums(x > cumul.w) + 1L
y[i]
}

f_for <- function(Weight, y) {
selection <- rep(NA, nrow(Weight))
for(i in 1:nrow(Weight)){
selection[i] <- sample(y, 1, prob=Weight[i,])
}
}

f_apply <- function(Weight, y) {
apply(Weight, 1, function(w)sample(y, 1, prob=w))
}

y <- c("a", "b", "c", "d")
Weight <- matrix(sample(1:100, 1000 * 4, TRUE), 1000, 4)

library(microbenchmark)
microbenchmark(f_runif(Weight, y),
f_for (Weight, y),
f_apply(Weight, y))

# Unit: microseconds
# expr min lq median uq max neval
# f_runif(Weight, y) 223.635 231.111 274.531 281.2165 1443.208 100
# f_for(Weight, y) 10220.674 11238.660 11574.039 11917.1610 14583.028 100
# f_apply(Weight, y) 9006.974 10016.747 10509.150 10879.9245 27060.189 100

关于r - 以不同的概率重复采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508658/

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