从两个正态分布的混合中获取随机数

机器算法验证 r
2022-03-23 07:26:42

我想从混合正态分布中采样,第一个是,第二个是我用过这个对吗?N(1,2)N(5,4)rnorm(100, c(mean=c(1,5), sd=c(2,4)))

我要解决的问题是从上面的 2 个分布中抽样,第一个占 75%,第二个占 25%。我在正确的轨道上吗?

编辑: 我将用更简单的数字重写问题以解决问题。:)

我想以70% 的概率中抽样,以 30% 的概率当然,这只是为了讨论,我正在使用的实际分布是​​ n(21, 3.3), n(26,4)。N(0,1)N(100,10)

2个回答

如果您想从具有参数的两个高斯中进行不相等的采样(概率为 0.7 和 0.3) ,那么您可以尝试这样的事情:(μ1,σ12)(μ2,σ22)

n <- 100
yn <- rbinom(n, 1, .7)
# draw n units from a mixture of N(0,1) and N(100,3^2)
s <- rnorm(n, 0 + 100*yn, 1 + 2*yn)

事实上,这是 Venables 和 Ripley 在Modern Applied Statistics with S中提供的插图之一(Springer,2002;§5.2,第 110-111 页)。

使用不同的参数,您可以使用ifelse表达式根据 中给出的二项式序列选择均值和 SD yn,例如rnorm(n, mean=ifelse(yn, 21, 26), sd=ifelse(yn, 3.3, 4))(无需使用yn进行逻辑转换as.logical。)

为了实现从分布的不均匀混合中采样的目标,最直接的方法是按所需比例分别采样:

 p <- 0.70 #P(from N(mu1, sd1)) 
 n.samps <- 10000
 mu1 <- 0
 sd1 <- 1
 mu2 <- 100
 sd2 <- 10

 x <- vector()
 for(i in 1:n.samps){
    b <- runif(1, 0, 1)
    if(b < p){
       x[i] <- rnorm(1, mu1, sd1)
     } else { 
       x[i] <- rnorm(1, mu2, sd2)
     }
   }

这可以快 50 倍左右完成:

 binary <- runif(n.samps, 0, 1) > p
 x <- c(rnorm(sum(binary), 1, 2), rnorm(sum(!binary), 5, 4)

然后抽取样本:

sample(x, 1)

或重新洗牌:

x <- sample(x, n.samp)