我有一個函數,我知道它是(x,y)中的多元分佈,而當我形成邊際分佈時,數學有數值穩定性問題。在數學中創建分佈
例如沿y方向邊緣化產生以下: 0.e ^(154.88-0.5x^2)
由於我知道結果必須是一個分佈,我想只提取電子^ (-.5x^2),並自己做一個重整化。另外,如果數學可以讓我採取多元函數並以某種方式將其指定爲概率分佈,那將會更好。
無論如何,有沒有人知道如何以編程方式實現上述兩個解決方案之一?
我有一個函數,我知道它是(x,y)中的多元分佈,而當我形成邊際分佈時,數學有數值穩定性問題。在數學中創建分佈
例如沿y方向邊緣化產生以下: 0.e ^(154.88-0.5x^2)
由於我知道結果必須是一個分佈,我想只提取電子^ (-.5x^2),並自己做一個重整化。另外,如果數學可以讓我採取多元函數並以某種方式將其指定爲概率分佈,那將會更好。
無論如何,有沒有人知道如何以編程方式實現上述兩個解決方案之一?
好的,這裏是我的意思的一個例子。假設我有以下的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]。
ProbabilityDistribution
確實帶有多元函數,儘管你的Dist函數對它的味道有點太怪異。
另外,似乎用戶定義的多變量分佈目前不能與RandomVariate
(更通用的V8版本RandomReal
/RandomInteger
)結合使用。單變量分佈工作。我向WRI提交了一個錯誤報告。
好,處理的數學符號表達式,最好讓事情變得準確,即避免近似數:
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}
這將是看問題的更完整的陳述和你的方法來解決它有用。 但是,請記住,通過對變量進行整合可以實現對變量的邊緣化,如果您有密度的代數形式,Mathematica應該能夠做到這一點。或者,將邊緣化考慮爲一個過程,可能會有所幫助,在這個過程中,你基本上假裝你永遠不知道你想要邊緣化的變量。 – Microserf 2009-10-17 19:06:16