给定两条高斯密度曲线,我如何识别v,使得v在重叠时具有相同的独立区域?

时间:2016-02-17 12:33:37

标签: r

给定两条高斯密度曲线,我如何识别'v',使'v'在重叠区域内均匀分开?

以下代码将创建我的问题的可视化。我有兴趣计算区域'A',然后找到x值'v',它将区域分成两个?

# Define Gaussian parameters
mu1 = 10
sd1 = 0.9
mu2 = 12
sd2 = 0.6

# Visualise, set values
sprd = 3
xmin = min(c(mu1-sprd*sd1,mu2-sprd*sd2))
xmax = max(c(mu1+sprd*sd1,mu2+sprd*sd2))
x    = seq(xmin,xmax,length.out=1000)
y1   = dnorm(x,mean=mu1,sd=sd1)
y2   = dnorm(x,mean=mu2,sd=sd2)
ymin = min(c(y1,y2))
ymax = max(c(y1,y2))

# Visualise, plot
plot(x,y1,xlim=c(xmin,xmax),ylim=c(ymin,ymax),type="l",col=2,ylab="Density(x)")
lines(x,y2,col=3)
abline(v=c(mu1,mu2),lty=2,col=c(2,3))
abline(h=0,lty=2)
legend("topleft",legend=c("N(mu1,sd1)","N(mu2,sd2)","mu1","mu2"),lty=c(1,1,2,2),col=c(2,3))
text(11,0.05,"A",cex=2)

Problem visualisation

基于对这篇文章的评论,我写过我写了一个自己的解决方案提案:

gaussIsect = function(mu1,mu2,sd1,sd2){
    sd12 = sd1**2
    sd22 = sd2**2
    sqdi = sd12-sd22
    x1 = (mu2 * sd12 - sd2*( mu1*sd2 + sd1*sqrt( (mu1-mu2)**2 + 2*sqdi * log(sd1/sd2) ) )) / sqdi
    x2 = (mu2 * sd12 - sd2*( mu1*sd2 - sd1*sqrt( (mu1-mu2)**2 + 2*sqdi * log(sd1/sd2) ) )) / sqdi
    return(c(x1,x2))
}
gaussSplitOlap = function(mu1,mu2,sd1,sd2){
    if( mu1 > mu2 ){
        tmp = c(mu1,mu2)
        mu1 = tmp[2]
        mu2 = tmp[1]
        tmp = c(sd1,sd2)
        sd1 = tmp[2]
        sd2 = tmp[1]
    }
    isct = gaussIsect(mu1=mu1,mu2=mu2,sd1=sd1,sd2=sd2)
    isct = isct[which(mu1 < isct & isct < mu2)]

    a1 = 1-pnorm(isct,mean=mu1,sd=sd1)
    a2 = pnorm(isct,mean=mu2,sd=sd2)
    A  = a1 + a2

    v1 = qnorm(1-A/2,mean=mu1,sd=sd1)
    v2 = qnorm(A/2,mean=mu2,sd=sd2)

    results = list(isct=isct,A=A,v1=v1,v2=v2)
    return(results)
}
test = gaussSplitOlap(mu1 = 10,sd1 = 0.9,mu2 = 12,sd2 = 0.6)
print(test)

运行此测试的输出如下

$isct
[1] 11.09291

$A
[1] 0.1775984

$v1
[1] 11.21337

$v2
[1] 11.19109

我会假设v1v2值相等?

2 个答案:

答案 0 :(得分:0)

首先解决找到重叠点x的问题(这是deg 2多项式方程)。

然后给出这个x区域是两条尾巴的总和:

area = min(pnorm(x, mean = mu1, sd = sd1), 1 - pnorm(x, mean = mu1, sd = sd1)) +
       min(pnorm(x, mean = mu2, sd = sd2), 1 - pnorm(x, mean = mu2, sd = sd2))

答案 1 :(得分:0)

就像我在评论中所说的那样,你可以使用简单的蒙特卡罗模拟:

prob<-c()
med<-c()
for(i in 1:1000){
randomX<-runif(1000000,xmin,xmax)
randomY<-runif(1000000,0,0.3)
cond<-(randomY<dnorm(randomX,mean=mu1,sd=sd1) & randomY<dnorm(randomX,mean=mu2,sd=sd2))
prob<-c(prob,sum(cond)/1000000*(xmax-xmin)*0.3)
med<-c(med,median(randomX[which(cond==1)]))
}
cat("Area of A is equal to: ", mean(prob),"\n")
# Area of A is equal to:  0.1778459
cat("Value of v is equal to: ",mean(med),"\n")
# Value of v is equal to:  11.21008

plot(x,y1,xlim=c(xmin,xmax),ylim=c(ymin,ymax),type="l",col=2,ylab="Density(x)")
lines(x,y2,col=3)
abline(v=c(mu1,mu2,mean(med)),lty=2,col=c(2,3,4))
abline(h=0,lty=2)
legend("topleft",legend=c("N(mu1,sd1)","N(mu2,sd2)","mu1","mu2"),lty=c(1,1,2,2),col=c(2,3))
text(11,0.05,"A",cex=2)

enter image description here