두 정규 분포의 겹치는 영역 백분율


46

및 정규 분포가 두 개인 경우 궁금합니다.σ1, μ1σ2, μ2

  • 두 분포의 중첩 영역 백분율을 어떻게 계산할 수 있습니까?
  • 이 문제에 특정 이름이 있다고 가정합니다.이 문제를 설명하는 특정 이름을 알고 있습니까?
  • 이 구현 (예 : Java 코드)을 알고 있습니까?

2
겹치는 지역이 무엇입니까? 밀도 곡선 아래에있는 면적을 의미합니까?
Nick Sabbe

두 영역의 교차를 의미합니다
Ali Salehi

4
즉, 두 개의 PDF를 및 로 작성 하면 실제로 하시겠습니까? 이러한 상황이 어떻게 발생하고 어떻게 해석 될 것인지에 대해 알려주시겠습니까? fgmin(f(x),g(x))dx
whuber

답변:


41

이것을 종종 "오버 랩핑 계수"(OVL)라고도합니다. 인터넷 검색으로 많은 인기를 얻을 수 있습니다. 이중 정상 사례에 대한 노모 그램은 여기 에서 찾을 수 있습니다 . 유용한 종이는 다음과 같습니다.

  • 헨리 F. 인 만; 에드윈 L. 브래들리 주니어 (1989). 확률 분포와 두 정규 밀도의 중첩에 대한 포인트 추정 간의 일치를 측정하는 중첩 계수입니다. 통계 커뮤니케이션-이론과 방법, 18 (10), 3851-3874. ( 링크 )

편집하다

이제 이것에 더 관심이 생겼으니 계속해서 이것을 계산하기 위해 R 코드를 만들었습니다 (간단한 통합입니다). 겹치는 영역의 음영을 포함하여 두 분포의 그림으로 던졌습니다.

min.f1f2 <- function(x, mu1, mu2, sd1, sd2) {
    f1 <- dnorm(x, mean=mu1, sd=sd1)
    f2 <- dnorm(x, mean=mu2, sd=sd2)
    pmin(f1, f2)
}

mu1 <- 2;    sd1 <- 2
mu2 <- 1;    sd2 <- 1

xs <- seq(min(mu1 - 3*sd1, mu2 - 3*sd2), max(mu1 + 3*sd1, mu2 + 3*sd2), .01)
f1 <- dnorm(xs, mean=mu1, sd=sd1)
f2 <- dnorm(xs, mean=mu2, sd=sd2)

plot(xs, f1, type="l", ylim=c(0, max(f1,f2)), ylab="density")
lines(xs, f2, lty="dotted")
ys <- min.f1f2(xs, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)
xs <- c(xs, xs[1])
ys <- c(ys, ys[1])
polygon(xs, ys, col="gray")

### only works for sd1 = sd2
SMD <- (mu1-mu2)/sd1
2 * pnorm(-abs(SMD)/2)

### this works in general
integrate(min.f1f2, -Inf, Inf, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)

이 예제의 결과는 다음 0.6099324과 같습니다. with absolute error < 1e-04. 아래 그림.

예


10
(+1) 인터넷 검색은 적어도 세 가지 고유 한 정의 (Matsushita, Morisita 및 Weitzman)를 나타냅니다. 귀하의 구현은 Weitzman입니다.
whuber

1
0.60993 24는 0.60993 43398 78944 33895 ...에 대한 근사값입니다.
whuber

10

이것은 Bhattacharyya 계수에 의해 주어진다 . 다른 분포에 대해서는 일반화 된 버전 인 두 분포 사이의 Hellinger 거리도 참조하십시오.

나는 이것을 계산하는 라이브러리를 모르지만 Mahalanobis 거리와 분산 행렬의 결정에 대한 명시적인 공식을 감안할 때 구현에는 문제가되지 않아야합니다.


3
Bhattacharyya 계수는 중첩의 척도이지만 동일하지는 않습니까?
Stéphane Laurent

7

이 작업을 수행하는 명백한 표준 방법이 있는지 모르겠지만

먼저 두 밀도 사이의 교차점을 찾습니다. 이는 정규 분포의 경우 x에 대한 2 차 방정식을 초래하는 두 밀도를 동일하게함으로써 쉽게 달성 할 수 있습니다.

뭔가에 가까운 :

(xμ2)22σ22(xμ1)22σ12=logσ1σ2

이것은 기본 미적분으로 해결할 수 있습니다.

따라서 0 개, 1 개 또는 2 개의 교차점이 있습니다. 이제이 교점은 실제 선을 1, 2 또는 3 개의 부분으로 나눕니다. 여기서 두 밀도 중 하나가 가장 낮습니다. 더 많은 수학적인 것이 마음에 들지 않는다면, 어느 한 부분이 가장 낮은 부분을 찾기 위해 부분 중 하나의 지점을 시도하십시오.

관심있는 값은 이제 각 부품에서 가장 낮은 밀도 곡선 아래 면적의 합입니다. 이 영역은 이제 누적 분포 함수에서 찾을 수 있습니다 ( '부품'의 양쪽 가장자리에서 값을 빼기 만하면됩니다.


4
(+1) 실제로 일 때 방정식은 이차 방정식으로 풀 수 있습니다 : 미적분학 필요 없음. 대해 (wlg)를 정렬 하면 두 번째 0 사이에서 두 번째 밀도가 가장 작고 그렇지 않으면 첫 번째 밀도가 가장 작습니다. 이것은 계산을 Normal CDF의 네 가지 평가로 줄입니다. 의 상황 은 훨씬 간단하며 선형 방정식의 솔루션과 CDF에 대한 두 가지 평가 만 필요합니다. σ1σ2μ1μ2σ1=σ2
whuber

2
@whuber이 답변을 완전한 답변으로 바꾸실 수 있습니까? 또는 Nick이 자신을 편집 할 수 있습니다.
Aleksandr Dubinsky

@whuber 보다는 을 의미하지 ? σ1σ2μ1μ2
Stéphane Laurent

@ Stéphane SD가 순서를 결정하는 것이 옳다고 생각합니다. 더 작은 SD의 밀도는 결국 양의 방향과 음의 방향 모두에서 더 작은 꼬리를 가지므로 다른 곳에서는 0과 작은 값 사이에서 더 큰 값을 갖습니다.
whuber

@whuber 네, 실제로 SD의 차수가 Nick에 의해 도출 된 다항식의 2 차 계수의 부호를 결정한다는 것을 쉽게 알 수 있습니다.
Stéphane Laurent

1

후손을 위해 볼프강의 솔루션은 저에게 효과적이지 않았습니다. 저는 integrate기능 에 버그가 생겼습니다 . 그래서 Nick Staubbe의 답변과 결합하여 다음과 같은 작은 기능을 개발했습니다. 수치 적분을 사용하는 것보다 더 빠르고 버그가 적어야합니다.

get_overlap_coef <- function(mu1, mu2, sd1, sd2){
  xs  <- seq(min(mu1 - 4*sd1, mu2 - 4*sd2), 
             max(mu1 + 4*sd1, mu2 + 4*sd2), 
             length.out = 500)
  f1  <- dnorm(xs, mean=mu1, sd=sd1)
  f2  <- dnorm(xs, mean=mu2, sd=sd2)
  int <- xs[which.max(pmin(f1, f2))]
  l   <- pnorm(int, mu1, sd1, lower.tail = mu1>mu2)
  r   <- pnorm(int, mu2, sd2, lower.tail = mu1<mu2)
  l+r
}

반환하지 않아야 (l+r)/2합니까?
RSHAP

0

다음은 Java 버전 인 Apache Commons Mathematics Library입니다 .

import org.apache.commons.math3.distribution.NormalDistribution;

public static double overlapArea(double mean1, double sd1, double mean2, double sd2) {

    NormalDistribution normalDistribution1 = new NormalDistribution(mean1, sd1);
    NormalDistribution normalDistribution2 = new NormalDistribution(mean2, sd2);

    double min = Math.min(mean1 - 6 * sd1, mean2 - 6 * sd2);
    double max = Math.max(mean1 + 6 * sd1, mean2 + 6 * sd2);
    double range = max - min;

    int resolution = (int) (range/Math.min(sd1, sd2));

    double partwidth = range / resolution;

    double intersectionArea = 0;

    int begin = (int)((Math.max(mean1 - 6 * sd1, mean2 - 6 * sd2)-min)/partwidth);
    int end = (int)((Math.min(mean1 + 6 * sd1, mean2 + 6 * sd2)-min)/partwidth);

    /// Divide the range into N partitions
    for (int ii = begin; ii < end; ii++) {

        double partMin = partwidth * ii;
        double partMax = partwidth * (ii + 1);

        double areaOfDist1 = normalDistribution1.probability(partMin, partMax);
        double areaOfDist2 = normalDistribution2.probability(partMin, partMax);

        intersectionArea += Math.min(areaOfDist1, areaOfDist2);
    }

    return intersectionArea;

}

0

MATLAB의 해결책은 다음과 같습니다.

[overlap] = calc_overlap_twonormal(2,2,0,1,-20,20,0.01)

% numerical integral of the overlapping area of two normal distributions:
% s1,s2...sigma of the normal distributions 1 and 2
% mu1,mu2...center of the normal distributions 1 and 2
% xstart,xend,xinterval...defines start, end and interval width
% example: [overlap] = calc_overlap_twonormal(2,2,0,1,-10,10,0.01)

function [overlap2] = calc_overlap_twonormal(s1,s2,mu1,mu2,xstart,xend,xinterval)

clf
x_range=xstart:xinterval:xend;
plot(x_range,[normpdf(x_range,mu1,s1)' normpdf(x_range,mu2,s2)']);
hold on
area(x_range,min([normpdf(x_range,mu1,s1)' normpdf(x_range,mu2,s2)']'));
overlap=cumtrapz(x_range,min([normpdf(x_range,mu1,s1)' normpdf(x_range,mu2,s2)']'));
overlap2 = overlap(end);

[overlap] = calc_overlap_twonormal(2,2,0,1,-10,10,0.01) 

적어도이 pdf 에서 그림 1 아래에 주어진 0.8026 값을 재현 할 수있었습니다 .

수치 솔루션 일 뿐이므로 시작 및 종료 및 간격 값을 정확하게 조정하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.