【发布时间】:2013-04-16 15:36:24
【问题描述】:
我正在使用以下函数计算两个正态双变量分布的重叠
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);
您可以看到这涉及从最小为 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。
谢谢
【问题讨论】:
-
我检查了你的代码,没有发现任何错误,所以我认为这是 matlab 的精度问题(精度与限制的范围有关)。我会用八度音阶测试你的代码,看看它是否有同样的问题。顺便说一句,您可以尝试使用可选的精度参数,例如 dblquad(-100,100,-100,100,1e-8)。
-
有趣的是,在 gnu-Octave 中运行完全相同的代码时并没有出现问题。在默认精度下,[-10,10,-10,10] 上的积分结果与 [-100,100,-100,100] 上的积分结果几乎没有区别。两个结果都约为 0.01241933 btw。
-
你能不能通过逐渐增加限制来测试,看看它首先开始失败的地方。像 [-30,30,-30,30] 然后 [-40,40,-40,40] 等等,直到结果开始发散。然后尝试添加可选的精度参数 1e-7 或 1e-8 等,看看是否能解决问题。顺便提一句。我的 Octave 版本是 3.6.1
-
感谢 cmets。结果从 [-10,10,-10,10]
>> dblquad(overlap_point,-9,9,-9,9) ans = 0.012434302954144>> dblquad(overlap_point,-10,10,-10,10) ans = 0.012426083045525开始递减。指定(一个相当大的)精度参数似乎确实有积极的效果,但并不能完全解决问题,例如:>> dblquad(-9,9,-9,9,1e-10) ans = 0.012419331486452、dblquad(-10,10,-10,10,1e-10) ans = 0.012419330851169、dblquad(-100,100,-100,100,1e-10) ans = 0.012415587111195结果彼此更接近,但仍然从[-10,10,-10,10]。 -
Octave 中的这些值是略微减少还是增加?
标签: matlab statistics normal-distribution integral