2

我正在使用以下函数计算两个正态双变量分布的重叠

function [ oa ] = bivariate_overlap_integral(mu_x1,mu_y1,mu_x2,mu_y2)
    %calculating pdf. Using x as vector because of MATLAB requirements for integration
    bpdf_vec1=@(x,y,mu_x,mu_y)(exp(-((x-mu_x).^2)./2.-((y-mu_y)^2)/2)./(2*pi));

    %calcualting overlap of two distributions at the point x,y
    overlap_point = @(x,y) min(bpdf_vec1(x,y,mu_x1,mu_y1),bpdf_vec1(x,y,mu_x2,mu_y2));

    %calculating overall overlap area
    oa=dblquad(overlap_point,-100,100,-100,100);

您可以看到这涉及从函数 overlay_point 中取一个双积分(x:-100 到 100,y:-100 到 100,理想情况下是 -inf 到 inf 但现在就足够了),该函数的最小值为 2 pdf-s,由下式给出x,y 点的两个分布的函数 bpdf_vec1。

现在,PDF 永远不会为 0,所以我希望区间的面积越大,最终结果就会越大,显然在某个点之后差异可以忽略不计。但是,有时,当我减小间隔的大小时,结果似乎会增加。例如:

>> mu_x1=0;mu_y1=0;mu_x2=5;mu_y2=0;
>> bpdf_vec1=@(x,y,mu_x,mu_y)(exp(-((x-mu_x).^2)./2.-((y-mu_y)^2)/2)./(2*pi));
>>  overlap_point = @(x,y) min(bpdf_vec1(x,y,mu_x1,mu_y1),bpdf_vec1(x,y,mu_x2,mu_y2));
>> dblquad(overlap_point,-10,10,-10,10)
ans =
    0.0124
>> dblquad(overlap_point,-100,100,-100,100)
ans =
    1.4976e-005  -----> strange, as theoretically cannot be smaller then the first answer
>> dblquad(overlap_point,-3,3,-3,3)
ans =
    0.0110  -----> makes sense that the result is less than the first answer as the           
interval is decreased

在这里,我们可以检查重叠在间隔的边界点处(接近)为 0。

>> overlap_point (100,100)
ans =
 0
>> overlap_point (-100,100)
ans =
 0
>> overlap_point (-100,-100)
ans =
 0
>> overlap_point (100,-100)
ans =
 0

这可能与 dblquad 的实现有关,还是我在某处犯了错误?我使用 MATLAB R2011a。

谢谢

4

2 回答 2

2

恭喜!您因成为第 12 百万个提出这个问题的人而获奖。:) 我想说的是,这是一个每个人一开始都会遇到的问题。老实说,这个问题被一遍又一遍地问到,所以真的,这个问题应该被标记为一个重复。

当从足够远的地方观察时,这些事情发生的情况是双变量法线本质上是一个 delta 函数。而且您不需要真正将该区域分散得太远,因为正常密度会迅速下降。在您尝试整合的大部分域上,它基本上为零,至少在所采用的容差范围内。

因此,如果求积恰好碰到有质量的区域附近的一些样本点,那么您可能会得到对积分的一些现实估计。但是,如果该工具看到的所有数字都是在整个域上基本上为零的数字,则它得出的结论是积分为零。请记住,自适应集成工具并非无所不知。他们对您的功能一无所知。对他们来说,这是一个黑匣子。这些不是象征性的工具。

顺便说一句,这不是我希望看到 Octave 与 MATLAB 始终不同的东西。这只是自适应积分器的一个问题,它选择在哪里设置它的样本点。

于 2013-04-16T19:03:21.350 回答
2

好的,这是我的八度音阶结果。

>fomat long
>z10 = dblquad(overlap_point,-10,10,-10,10)
z10 =  0.0124193303284589
>z100 = dblquad(overlap_point,-100,100,-100,100)
z100 =  0.0124193303245106
>z100 - z10
ans = -3.94835379669001e-012

>z10a = dblquad(overlap_point,-10,10,-10,10,1e-8)
z10a =  0.0124193306514996
>z100a = dblquad(overlap_point,-100,100,-100,100,1e-8)
z100a =  0.0124193306527155
>z100a-z10a
ans = 1.21588676627038e-012

顺便提一句。我以前用数值解法就注意到了这种类型的问题。有时,您所做的更改会提高结果的准确性(在这种情况下,通过使您的限制更接近完整平面的理想情况),但您会得到相反的效果,结果会变得不那么准确。在这种情况下发生的情况是,通过“扩大”到 -100..100,您将焦点从函数中真正重要的动作发生的地方转移,这接近原点。在某些时候,您正在使用的 dblquad 的实现必须随着您增加限制而开始增加样本间距离,然后它开始丢失靠近原点的一些重要内容。

也许运行更高版本的matlab的人可以检查一下,看看它是否得到了改进。

于 2013-04-16T17:41:00.380 回答