オーストラリアで勉強してきたMLデザイナーの口語自由詩

主に、データ分析・機械学習・ベイズ・統計について自由に書く。

pymc4のソースコード読んでみた - “RandomVariable”, Add model tests, fix travis pytest problem [4357d39]

f:id:yukinagae:20171122095115p:plain

TL;DR

  • treedict クラスの依存性を以前のコミットで削除した代わりに、 RandomVariable クラス内で Modelcontexts.stack 全てに値を設定することで、ほぼ同等の動きをしている。

コミット

2018/06/03のコミットです。

RandomVariable - random_variable.py

どちらにしろ挙動が変わらないことがわかる

  • 【before】treedictクラスに依存している場合、ModelがネストするとparentにもRandomVariableが伝搬する
with WithTreeModel(name="model1") as model1:
    rv1 = WithTreeRandomVariable(name="rv1")
    with WithTreeModel(name="model2") as model2:
        rv2 = WithTreeRandomVariable(name="rv2")
        rv3 = WithTreeRandomVariable(name="rv3")
        print("model1: {}".format([v for v in model1.named_vars]))
        print("model2: {}".format([v for v in model2.named_vars]))

# 出力:
# => model1: ['rv1', 'rv2', 'rv3']
# => model2: ['rv2', 'rv3']
  • 【after】treedictクラスに依存せず、RandomVarible内でModel.get_contextsを辿っている場合、ModelがネストするとparentにもRandomVariableが伝搬する
with Model(name="model1") as model1:
    rv1 = RandomVariable(name="rv1")
    with Model(name="model2") as model2:
        rv2 = RandomVariable(name="rv2")
        rv3 = RandomVariable(name="rv3")
        print("model1: {}".format([v for v in model1.named_vars]))
        print("model2: {}".format([v for v in model2.named_vars]))

# 出力:
# => model1: ['rv1', 'rv2', 'rv3']
# => model2: ['rv2', 'rv3']

TODO

  • [ ] ほぼ同じ挙動がに見えるが、設計を少し変更した理由がわからない

参考資料