2009-10-16 40 views
3

我有一個函數,我知道它是(x,y)中的多元分佈,而當我形成邊際分佈時,數學有數值穩定性問題。在數學中創建分佈

例如沿y方向邊緣化產生以下: 0.e ^(154.88-0.5x^2)

由於我知道結果必須是一個分佈,我想只提取電子^ (-.5x^2),並自己做一個重整化。另外,如果數學可以讓我採取多元函數並以某種方式將其指定爲概率分佈,那將會更好。

無論如何,有沒有人知道如何以編程方式實現上述兩個解決方案之一?

+0

這將是看問題的更完整的陳述和你的方法來解決它有用。 但是,請記住,通過對變量進行整合可以實現對變量的邊緣化,如果您有密度的代數形式,Mathematica應該能夠做到這一點。或者,將邊緣化考慮爲一個過程,可能會有所幫助,在這個過程中,你基本上假裝你永遠不知道你想要邊緣化的變量。 – Microserf 2009-10-17 19:06:16

回答

1

好的,這裏是我的意思的一個例子。假設我有以下的2D分佈:

Dist = 
3.045975040844157` E^(-(x^2/2) - y^2/ 
2) (-1 + E^(-1.` (x + 0.1` y) UnitStep[x + 0.1` y]))^2 

我試圖

Integrate[Dist, {y, -Infinity, Infinity}] 

數學不提供答案,或者至少不會爲我的電腦上很長一段時間這樣做。建議?

編輯:好吧,實際上是這樣,但是在我的英特爾i5上用4GB內存需要5分鐘...我仍然希望能夠採用Mathematica的內置分配類型(儘管它似乎是單個變量只有)並使用他們的RandomReal [dist]。我希望的最好的方式是,如果Mathematica允許我將這個2D函數指定爲分佈,並且能夠調用RandomRealVector [dist]。

1

ProbabilityDistribution確實帶有多元函數,儘管你的Dist函數對它的味道有點太怪異。

另外,似乎用戶定義的多變量分佈目前不能與RandomVariate(更通用的V8版本RandomReal/RandomInteger)結合使用。單變量分佈工作。我向WRI提交了一個錯誤報告。

1

好,處理的數學符號表達式,最好讓事情變得準確,即避免近似數:

In[36]:= pdf = PiecewiseExpand[Rationalize[E^(-(x^2/2) - y^2/2)* 
     (-1 + E^(-1.*(x + 0.1*y)*UnitStep[x + 0.1*y]))^2], 
    Element[{x, y}, Reals]] 

Out[36]= Piecewise[{{E^(-2*x - x^2/2 - y/5 - y^2/2)*(-1 + 
     E^(x + y/10))^2, 10*x + y >= 0}}, 0] 

爲了攻擊問題,不如改變變量:

In[56]:= cvr = 
First[Solve[{10 x + y == u, (10 y - x)/101 == v}, {x, y}]] 

Out[56]= {x -> (10 u)/101 - v, y -> u/101 + 10 v} 

注意,係數選擇爲使得雅可比是單位:

In[42]:= jac = Simplify[Det[Outer[D, {x, y} /. cvr, {u, v}]]] 

Out[42]= 1 

變量的變化之後,你看到密度因子分解成一個產品:

In[45]:= npdf = FullSimplify[jac*pdf /. cvr] 

Out[45]= Piecewise[{{E^(-(u/5) - u^2/202 - (101*v^2)/2)*(-1 + 
     E^(u/10))^2, u >= 0}}, 0] 

也就是說,現在變量「u」和「V」是獨立的。 'v'變量爲NormalDistribution[0, 1/101],而'u'變量稍微複雜一些,但現在可以通過ProbabilityDistribution來處理。

In[53]:= updf = 
Refine[npdf/nc, u >= 0]/PDF[NormalDistribution[0, 1/Sqrt[101]], v] 

Out[53]= (E^(-(u/5) - u^2/202)*(-1 + E^(u/10))^2*Sqrt[2/(101*Pi)])/ 
    (1 - 2*E^(101/200)*Erfc[Sqrt[101/2]/10] + 
    E^(101/50)*Erfc[Sqrt[101/2]/5]) 

所以,你現在可以定義的聯合分佈爲矢量{u,v}

dist = ProductDistribution[NormalDistribution[0, 1/101], 
    ProbabilityDistribution[updf, {u, 0, Infinity}]]; 

由於{u,v}{x,y}之間的關係是已知的,的{x,y}產生個變量是容易的:

XYRandomVariates[len_] := 
RandomVariate[dist, len].{{-1, 10}, {10/101, 1/101}} 

您可以使用TransformedDistribution封裝累積的知識:

origdist = 
    TransformedDistribution[{(10 u)/101 - v, 
    u/101 + 10 v}, {Distributed[v, NormalDistribution[0, 1/101]], 
    Distributed[u, ProbabilityDistribution[updf, {u, 0, Infinity}]]}]; 

例如爲:

In[68]:= Mean[RandomVariate[origdist, 10^4]] 

Out[68]= {1.27198, 0.126733}