我遇到以下问题。我正在尝试在整个支持范围内整合双变量正态的pdf函数。但是,Matlab对于d返回0,实际情况并非如此。我的方法有什么问题?
代码如下:
mu1=100;
mu2=500;
sigma1=1;
sigma2=2;
rho=0.5;
var1=sigma1^2;
var2=sigma2^2;
pdf = @(x,y) (1/(2*pi*sigma1*sigma2*sqrt(1-rho^2))).*exp((-1/(2*(1-rho^2)))*(((x-mu1).^2/var1)+((y-mu2).^2/var2)-((2*rho*(x-mu1).*(y-mu2))/(sigma1*sigma2))));
d = integral2(pdf,-Inf,Inf,-Inf,Inf)
答案 0 :(得分:2)
正如@Andras Deak所评论的那样,“指数从峰顶迅速切断”。 实际上,您可以将其可视化:
mu1=100;
mu2=500;
sigma1=1;
sigma2=2;
rho=0.5;
var1=sigma1^2;
var2=sigma2^2;
pdf = @(x,y) (1/(2*pi*sigma1*sigma2*sqrt(1-rho^2))).*exp((-1/(2*(1-rho^2)))*(((x-mu1).^2/var1)+((y-mu2).^2/var2)-((2*rho*(x-mu1).*(y-mu2))/(sigma1*sigma2))));
figure
fsurf(pdf,[90 110 490 510])
figure
fsurf(pdf,[0 200 400 600])
在第一个图中,限制接近于您提供的均值。您可以看到二元法线的形状:
内置积分函数试图求积分,但是如果您的极限是-inf
和inf
,则您的函数几乎在任何地方都为零,且不均值接近均值。
To treat singularities,您应该按照MATLAB的建议中断域。由于该函数几乎在任何地方都为零,因此您只能在以下均值附近进行积分:
d = integral2(pdf,90,110,490,510)
> d =
>
> 1.0000
您也可以将其编写为变量的函数。 empirical rule指出,您的数据的99.7%与均值相差3个标准差以内,因此:
d = integral2(pdf,mu1-3*sigma1,mu1+3*sigma1,mu2-3*sigma2,mu2+3*sigma2)
> d =
>
> 0.9948
这将为您带来很好的结果。 我们可以详细说明。在经验规则的维基百科页面中,表达式
erf(x/sqrt(2))
将给出“ mu+-x*sigma
范围内的预期人口比例”。对于MATLAB中作为标准显示的短精度,如果选择x = 5,则将得到:
x = 5;
erf(x/sqrt(2))
> ans =
>
> 1.0000
几乎每个数据都包含在5个标准偏差内。因此,在双重积分中您可能会忽略此范围之外的域,从而避免(几乎)奇异。
d = integral2(pdf,mu1-x*sigma1,mu1+x*sigma1,mu2-x*sigma2,mu2+x*sigma2)
> d =
>
> 1.0000