让我先从一个简单的问题示例开始。
假设一个10人的世界,其中1人拥有产品A,2人拥有产品B
U = 10,A = 1,B = 2
现在我想找到机会:
1)一个人没有产品==> (1 - 1/10)*(1 - 2/10)= 0.72
2)一个人拥有至少1个产品==> 1 - ((1 - 1/10)*(1 - 2/10))= 0.28
3)一个人拥有2个产品==> (1/10)*(2/10)= 0.02
但是,如果有 n 产品,我希望有一个通用算法来排除所有这些选项。
输入如下:
U <- 10
products <- c('A','B')
owned_by <- c(1, 2)
df <- data.frame(products, owned_by)
答案 0 :(得分:0)
我认为封闭式解决方案涉及的条款太多而且过于复杂。所以这个问题看起来像是蒙特卡罗方法的完美候选者。
set.seed(1984)
U <- 10
products <- c('A','B')
owned_by <- c(1,2)
df <- data.frame(products, owned_by)
p = rep(0, nrow(df)+1)
num.runs = 1000
for(n in 1:num.runs)
{
x=c() ## list of people who own a product
for (i in 1:nrow(df))
x = c(x, sample(1:U, df$owned_by[i]))
## get the number of people who own 0, 1, 2...products
p[1] = p[1] + (sum(hist(x,breaks=0:U,plot=F)$counts == 0) / U)
for(i in 1:nrow(df))
p[i+1] = p[i+1] + (sum(hist(x,breaks=0:U,plot=F)$counts >= i) / U)
}
p = p / num.runs ## average over all runs
p
## 0.7197 0.2803 0.0197