Mathematica 中的符号条件期望
我想实现条件期望运算符。我将使用大写的 epsilon E
来表示运算符。我期望至少以下输入(下划线表示下标)
E_2[a]
E_2[x_1]
E_2[x_1 + y_5]
E_1[3 a + b - 4 + 2 x_]
E_6[x_5 x_7]
E_t[x_t]
E_t[3 x_{t - 1} x_{t + 2}]
产生以下输出
a
x_1
E_2[y_5] + x_1
-4 + 3 a + b + 2 E_2[x_5]
E_6[x_7] x_5
x_t
3 E_t[x_{t + 2}] x_{t - 1}
上面的示例并不是我需要生成的唯一输入/输出对,而是作为我喜欢的语法的测试和说明。
我已经走到这一步了ce
表示 Conditional Expectation,其第三个组成部分是“期望传播”是否最终确定(否则乘积规则中会出现无限递归),mv
表示 Measurable Variable 。
Notation[Subscript[E, t_][y_] ==> ce[y_, t_, False]];
Notation[Subscript[E, t_][y_] <== ce[y_, t_, _]];
Notation[Subscript[x_, t_] <==> mv[x_, t_]];
(* Atomic Elements and Measurable Variables *)
ce[x_, t_, _] := x /; (AtomQ[x] || Head[x] === mv && 0 <= t - x[[2]]);
(* Distribution over Addition *)
ce[x_ + y__, t_, s_] := ce[x, t, s] + Plus @@ (ce[#, t, s] & /@ {y});
(* Distribution over Product *)
ce[x__Times, t_, False] := Module[{v, m, n},
(* All Variables in the Product *)
v = List @@ x;
(* Measurable Among Them *)
m = Select[v, AtomQ[#] || Head[#] === mv && 0 <= t - #[[2]] &];
(* The Rest is not Measurable *)
n = Complement[v, m];
Times[Times @@ m, ce[Times @@ n, t, True]]
];
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想我可以让你接近你想要的;不过,我不会全部完成,因为这可能很棘手,但我会为您指出正确的方向。
首先,在 Mathematica 中使用下标来表示不同的变量是很棘手的,因为它将
E
0
解释为Subscript[E,0]
以及E
和Subscript
均被保留。 (正如 Sjoerd 所说,E = 2.718...
。)让 Mathematica 识别
作为一个独特的符号,您需要通过< 加载 Notations 包。然后使用符号面板,
Symbolize
Subscript[E,0]
。 (需要注意的是,如果没有使用调色板正确设置代码,请勿尝试这样做,否则它可能无法工作。)一旦所有变量都根据需要进行了符号化,您需要设置适当的变换规则。前两个是最简单的,请输入
规则 3 和 4:
这些是简单的规则,接下来的三个需要不同类型的关联,两者都不是
Set
也不是SetDelayed
将在这里工作,因为正在评估的外部符号是Dt
,并且您无法将新规则与其关联,因为它是受保护
。但是,有两种方法可以将此类表达式与内部符号关联起来:UpSet (^=)
(或UpSetDelayed (^:=)
) 或TagSet (/:)
。我更喜欢使用TagSet
因为它更明确,但两者都应该有效。规则 5 和 6:
这也将使您接近规则 7,但是将其与规则 3 和 4 一起添加会导致递归限制错误,因为它来回跳动试图找出如何评估它。相反,应将规则 3 和 4 替换为
Which Making Define Limits on the recursion。就规则 7 而言,您得到的结果
是
Dt
规则和规则 4 的结果。让E_0
不通过D
进行分发code> 和Dt
留作练习。编辑:
我想对您提供的解决方案代码发表一些评论。首先,巧妙地使用布尔值来停止递归,并且它与您的
Notation
配合得很好。不过,我建议您对产品分销进行一些更改。首先,我会使用x__Times
而不是条件 (/; Head[x] == Times
),因为它更容易阅读,而且我相信(但还没有) t 测试)它可能会更快,即处理它的开销更少。其次,将Table
的使用替换为List @@ x
,其中@@
,称为Apply
,将Times
替换为 < code>List,并且它再次更容易阅读和编写。对于n
的定义,请考虑使用补足
;我不知道它是否更快,但我倾向于更喜欢此类事物的集合论构造。最后,除非您需要在使用时重新评估变量,否则不要使用SetDelayed
(:=),使用
设置
(=
)。通过使用:=
,m 被计算两次,v 被计算 3 次!优点和缺点:
这样做的主要原因是易于使用和可读性。通过定义您自己的对象及其行为方式,您可以为自己提供很大的灵活性并简化代码。仅此一点就值得了。然而,我过去很难做到这一点,而且这样的设置可能很挑剔,我建议进行彻底的测试。其次,通过添加这些额外的层,您可能会减慢代码速度,因此如果要在关键任务应用程序中使用它,请务必小心。此外,每次使用时都必须包含
Notation
,并且调色板在某些时候会变得烦人。不过,可以通过在加载 Notation 包之前设置 AutoLoadNotationPalette = False 来处理调色板。I think I can get you close to what you want; I'm not going to do it all, though, as it can be tricky, but I'll point you in the right direction.
First of all, using subscripts to denote different variables is tricky in Mathematica as it interprets
E
0
asSubscript[E,0]
and bothE
andSubscript
are reserved. (As Sjoerd said,E = 2.718...
.) To get Mathematica to recognize<anything>
<something>
as a distinct symbol, you need to load the Notations package via<<Notations`
. Then using the Notations Palette,Symbolize
Subscript[E,0]
. (As a word of caution, don't try to do that without using the palette to set up the code correctly, otherwise it may not work.)Once all of your variables are symbolized, as needed, you need to set up the appropriate transformation rules. The first two are simplest, enter
Rule 3 and 4:
Those were the easy ones, the next three require a different kind of association, neither
Set
norSetDelayed
will work here as the outer symbol being evaluated isDt
, and you can't associate new rules with it as it isProtected
. However, there are two methods of associating such expressions with an internal symbol:UpSet (^=)
(orUpSetDelayed (^:=)
) orTagSet (/:)
. I prefer to useTagSet
as it is more explicit, but either should work.Rule 5 and 6:
This will also get you close to rule 7, but adding this alongside rules 3 and 4 causes a Recursion Limit error as it bounces back and forth trying to figure out how to evaluate it. Instead, replace rule 3 and 4 with
Which puts definite limits on the recursion. As far as rule 7 is concerned, you get this
which is a consequence of the
Dt
rule and rule 4. To getE_0
not to distribute overD
andDt
is left as an exercise.Edit:
I'd like to make a few comments on the solution code you've provided. First, clever use of a Boolean to stop the recursion, and it works well with your
Notation
. I'd suggest several changes to you product distribution, though. First, I'd usex__Times
instead of the condition (/; Head[x] == Times
) as it is easier to read, and I believe (but haven't tested) it may be faster, i.e. less overhead to process it. Second, replace you use ofTable
withList @@ x
, where@@
, calledApply
, replacesTimes
withList
, and it is again easier to read and write. For your definition ofn
, consider usingComplement
; I don't know if it is faster, but I tend to prefer set theoretic constructs for this type of thing. Lastly, unless you need a variable to be reevaluated whenever it is used, do not useSetDelayed
(:=
), useSet
(=
). By using:=
, m is evaluated twice, and v is evaluated 3 times!Pros and Cons:
The chief reasons to do this is ease of use and readability. By defining your own objects and how they behave, you give yourself a lot of flexibility and simplify your code. That alone makes it worth it. However, I've had difficulty doing this in the past, and such a setup can be persnickety, and I'd recommend thorough testing. Secondly, by adding these extra layers, you may slow down your code, so be careful if this is to be used in mission critical applications. Additionally, you have to include
Notation
every time you use it, and the palette will become annoying at some point. Although, the palette can be dealt with by settingAutoLoadNotationPalette = False
prior to loading the Notation package.