gpt4 book ai didi

r - 从 R 中的排列中找到平均值

转载 作者:行者123 更新时间:2023-12-03 22:54:51 25 4
gpt4 key购买 nike

袋子中有数值为 1 到 3 的球。我会随机抽取所有三个球而不替换。
对于第一个球,我需要支付球值乘以 1。对于第二个球,我需要支付球值乘以 2。对于第三个球,我需要支付球值乘以3。例如,如果您抽了1,2,3,那么您的总付款为(1*1)+(2*2)+(3*3) = 14。
我想找到所有可能的总付款的平均值。

所以我有这个代码:

library(gtools)

N<-1:3
perms3 <- data.frame(permutations(n = 3, r = 3, v = N))
perms3$total_payment <- perms3$X1 *1+ perms3$X2*2 + perms3$X3*3
mean(perms3$total_payment)

我想做一个通用函数,可以应用于任意数量的 N .例如,有数值为 1 到 5 或 1 到 10 等的球。
我可能会使用上面的代码进行一些操作来计算总付款的平均值,如下所示:
N<-1:5
perms5 <- data.frame(permutations(n = 5, r = 5, v = N))
perms5$total_payment <- perms5$X1 *1+ perms5$X2*2 +perms5$X3*3 +perms5$X4*4 +perms5$X5*5
mean(perms5$total_payment)

但是,我不想每次都这样做。你能帮我解决这个问题吗?

最佳答案

可以使用一点数学将其提炼为恒定时间解决方案。简而言之,我们只是在寻找 Expected Value .

TL; 博士

sum(1:n) * (n + 1) / 2

这等于:
(n * (n + 1) / 2) * (n + 1) / 2   -->>   n * (n + 1)^2 / 4

constantTimeMean <- function(n) n * (n + 1)^2 / 4

constantTimeMean(5)
[1] 45

解释

让 (x1, x2, ... xn) 是数字 1 到 n 的排列。将每个 xi 乘以 i 并像这样求和:
x_1 * 1 + x_2 * 2 ... + x_n * n

由于我们采用所有排列,因此每个索引 i 与每个数字 1 到 n 相乘的概率相等。我们还注意到,如果我们去除系数,每个排列的总和是常数(即 sum(1:n))。因此,我们需要做的就是计算 1 到 n 的平均值并乘以 1 到 n 的总和。

1 到 n 之和的闭式表达式由下式给出:
 (n * (n + 1) / 2)

连同平均值,我们得到:
n * (n + 1)^2 / 4

这很好,因为生成所有排列的速度非常快。例如,如果我们设置 N = 15 甚至 N = 4321 会怎样?那是 facrorial(15) = 1.307674e+12排列...生成已经不可能了( factorial(4321) 返回 Inf ... 使用 gmp 包,我们看到它确实有超过 13000 个十进制数字: gmp::log10.bigz(gmp::factorialZ(4321)) ~= 13834.99 )。但是,有了上面的公式,就没有问题了:
system.time(print(constantTimeMean(15)))
[1] 960
user system elapsed
0 0 0


system.time(print(constantTimeMean(4321)))
[1] 20178728641
user system elapsed
0 0 0

关于r - 从 R 中的排列中找到平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61132398/

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