2

次の関数を使用して、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);

これには、次の式で与えられる 2 つの pdf-s の最小値である関数 overlay_point から二重積分 (x: -100 から 100、y: -100 から 100、理想的には -inf から inf ですが、現時点では十分です) を取得することが含まれていることがわかります。点 x、y における 2 つの分布の関数 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

OK、これが私のオクターブの結果です。

>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 に答える
2

おめでとう!あなたは、本質的にこの質問をした 1,200 万人目の人物として賞を受賞しました。:) 私が言おうとしているのは、これは誰もが最初につまずく問題だということです。正直なところ、この質問は何度も聞かれるので、実際には、この質問は重複としてマークする必要があります.

これらのことで何が起こるかというと、十分に遠くから見た場合、二変量法線は本質的にデルタ関数です。また、通常の密度は急速に低下するため、その領域を実際に広げすぎる必要はありません。統合しようとしているほとんどのドメインで、少なくとも採用されている許容範囲内で、本質的にゼロです。

したがって、直交がたまたま質量のある領域の近くのいくつかのサンプルポイントにヒットした場合、積分の現実的な推定値が得られる可能性があります。しかし、ツールが認識したすべての数値が領域全体で本質的にゼロである場合、積分はゼロであると結論付けます。アダプティブ インテグレーション ツールは全知全能ではないことに注意してください。彼らはあなたの機能について何も知りません。彼らにとってはブラックボックスです。これらは象徴的なツールではありません。

ところで、これは、Octave と MATLAB で一貫して異なるとは思わないものです。これは、適応積分器の問題であり、サンプル ポイントをどこに設定するかを選択するだけです。

于 2013-04-16T19:03:21.350 に答える