我有一个函数,我知道它是(x,y)中的多元分布,当我形成边际分布时,mathematica有数值稳定性问题。
例如,沿y边缘化会产生以下结果: 0.e ^(154.88-0.5x ^ 2)
因为我知道结果必须是分布,所以我想提取e ^( - 。5x ^ 2)并自己进行重整化。或者,如果mathematica让我采用多变量函数并以某种方式将其指定为概率分布,那就更好了。
无论如何,有没有人知道如何以编程方式实现上述两种解决方案中的任何一种?
答案 0 :(得分: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}]
Mathematica没有提供答案,或者至少在我的计算机上没有这么做。建议?
编辑:好吧,实际上它确实如此,但是我的英特尔i5需要花费5分钟才能使用4GB内存...我仍然希望有一些方法可以使用Mathematica的内置分发类型(虽然它似乎只是单变量并利用他们的RandomReal [dist]。我希望最好的是,如果Mathematica允许我将这个2D函数指定为分布,并且能够调用RandomRealVector [dist]。
答案 1 :(得分:1)
ProbabilityDistribution
确实采用了多变量函数,尽管你的Dist函数有点太奇怪了。
另外,似乎用户定义的多变量分布目前不能与RandomVariate
(RandomReal
/ RandomInteger
的稍微多功能的V8版本)结合使用。单变量分布工作。我向WRI提交了一份错误报告。
答案 2 :(得分:1)
那么,在Mathematica中处理符号表达式时,最好保持一致,即避免使用近似数字:
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}]]}];
E.g:
In[68]:= Mean[RandomVariate[origdist, 10^4]]
Out[68]= {1.27198, 0.126733}