数学:期望vs期望——不一致的结果



以下代码为NExpectationExpectation返回不同的值。如果我对NormalDistribution[]进行同样的尝试,我会得到NExpectation的收敛误差(但最终结果仍然是所有0)。是什么导致了这个问题?

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]
N[Expectation[U[x], x [Distributed] NormalDistribution[1, 1]]]
NExpectation[U[x], x [Distributed] NormalDistribution[1, 1]]
输出:

    -0.104154
     0.796449

我认为这实际上可能是Integrate的bug。

让我们定义你的

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]

和等价的

V[x_] := Piecewise[{{Sqrt[x], x >= 0}, {-Sqrt[-x], x < 0}}]

在实数

上等价
FullSimplify[U[x] - V[x], x [Element] Reals] (* Returns 0 *)

对于UV,解析的Expectation命令使用Method选项"Integrate",这可以通过运行

看到
Table[Expectation[U[x], x [Distributed] NormalDistribution[1, 1], 
  Method -> m], {m, {"Integrate", "Moment", "Sum", "Quantile"}}]
因此,它实际上做的是积分
Integrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]

返回

(Sqrt[Pi] (BesselI[-(1/4), 1/4] - 3 BesselI[1/4, 1/4] + 
   BesselI[3/4, 1/4] - BesselI[5/4, 1/4]))/(4 Sqrt[2] E^(1/4))

V

的积分
Integrate[V[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]

给出了相同的答案,但乘以了一个因子1 + I。这显然是一个bug。

使用UV的数值积分返回期望值0.796449:

NIntegrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]

这大概是正确的解决方案。


编辑: kguler的答案在所有版本中返回相同值的原因是因为u[x_?NumericQ]的定义阻止了解析积分的执行,所以Expectation不被计算,当被要求其数值时,返回到使用NExpectation .


编辑2:进一步分解这个问题,你会发现

In[1]:= N@Integrate[E^(-(1/2) (-1 + x)^2) Sqrt[x] , {x, 0, Infinity}]
         NIntegrate[E^(-(1/2) (-1 + x)^2) Sqrt[x] , {x, 0, Infinity}]
Out[1]= 0. - 0.261075 I   
Out[2]= 2.25748
In[3]:= N@Integrate[Sqrt[-x] E^(-(1/2) (-1 + x)^2) , {x, -Infinity, 0}]
         NIntegrate[Sqrt[-x] E^(-(1/2) (-1 + x)^2) , {x, -Infinity, 0}]
Out[3]= 0.261075    
Out[4]= 0.261075

在这两个范围内,被积函数都是实数的,具有指数衰减的非振荡函数。不应该有任何虚数/复数结果的需要。

最后请注意,上述结果适用于Mathematica 8.0.3版本。在版本7中,积分返回1F1超几何函数,解析结果与数值结果匹配。所以这个bug(目前也存在于Wolfram|Alpha)是一个回归。

如果您更改函数u的参数以避免对非数值求值,则所有三个方法都会给出相同的结果:

u[x_?NumericQ] := If[x >= 0, Sqrt[x], -Sqrt[-x]] ;
Expectation[u[x], x [Distributed] NormalDistribution[1, 1]] // N;
N[Expectation[u[x], x [Distributed] NormalDistribution[1, 1]]] ;
NExpectation[u[x], x [Distributed] NormalDistribution[1, 1]];
{% === %% === %%%, %}

显示结果{真的,0.796449}

最新更新