및 정규 분포가 두 개인 경우 궁금합니다.
- 두 분포의 중첩 영역 백분율을 어떻게 계산할 수 있습니까?
- 이 문제에 특정 이름이 있다고 가정합니다.이 문제를 설명하는 특정 이름을 알고 있습니까?
- 이 구현 (예 : Java 코드)을 알고 있습니까?
및 정규 분포가 두 개인 경우 궁금합니다.
답변:
이것을 종종 "오버 랩핑 계수"(OVL)라고도합니다. 인터넷 검색으로 많은 인기를 얻을 수 있습니다. 이중 정상 사례에 대한 노모 그램은 여기 에서 찾을 수 있습니다 . 유용한 종이는 다음과 같습니다.
편집하다
이제 이것에 더 관심이 생겼으니 계속해서 이것을 계산하기 위해 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
. 아래 그림.
이것은 Bhattacharyya 계수에 의해 주어진다 . 다른 분포에 대해서는 일반화 된 버전 인 두 분포 사이의 Hellinger 거리도 참조하십시오.
나는 이것을 계산하는 라이브러리를 모르지만 Mahalanobis 거리와 분산 행렬의 결정에 대한 명시적인 공식을 감안할 때 구현에는 문제가되지 않아야합니다.
이 작업을 수행하는 명백한 표준 방법이 있는지 모르겠지만
먼저 두 밀도 사이의 교차점을 찾습니다. 이는 정규 분포의 경우 x에 대한 2 차 방정식을 초래하는 두 밀도를 동일하게함으로써 쉽게 달성 할 수 있습니다.
뭔가에 가까운 :
이것은 기본 미적분으로 해결할 수 있습니다.
따라서 0 개, 1 개 또는 2 개의 교차점이 있습니다. 이제이 교점은 실제 선을 1, 2 또는 3 개의 부분으로 나눕니다. 여기서 두 밀도 중 하나가 가장 낮습니다. 더 많은 수학적인 것이 마음에 들지 않는다면, 어느 한 부분이 가장 낮은 부분을 찾기 위해 부분 중 하나의 지점을 시도하십시오.
관심있는 값은 이제 각 부품에서 가장 낮은 밀도 곡선 아래 면적의 합입니다. 이 영역은 이제 누적 분포 함수에서 찾을 수 있습니다 ( '부품'의 양쪽 가장자리에서 값을 빼기 만하면됩니다.
후손을 위해 볼프강의 솔루션은 저에게 효과적이지 않았습니다. 저는 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
합니까?
다음은 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;
}
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 값을 재현 할 수있었습니다 .
수치 솔루션 일 뿐이므로 시작 및 종료 및 간격 값을 정확하게 조정하면됩니다.