2016-11-29 7 views
3

pyMC3のモデルを徐々に更新することは可能ですか?私は現在これに関する情報を見つけることができません。すべての文書は、常に先験的に既知のデータで動作しています。インクリメンタルモデルの更新pyMC3

私の理解では、ベイジアンモデルは信念を更新できることを意味します。これはpyMC3でも可能ですか?これについての情報はどこにありますか?

ありがとう:)

+0

AFAIK、これはPyMC3では実装されていません。それにもかかわらず、あなたは_手動でこれを行うことができます。いくつかのデータとそれ以前のものを使用し、PyMC3を使用して更新して後部を計算し、後部を前のものとして使用します。この質問[ここ](https://gitter.im/pymc-devs/pymc) – aloctavodia

+0

を聞きたいかもしれません。主な制約は、各更新の後に、あなたの後任者をプリオーサーに変換して組み込むことですデータの次のバッチ。 –

+0

明確にする: 特定のイベントがいつ起こっているかを予測するモデルを構築したい。実際のイベントが発生するたびに私は自分の信念を更新したい。 pymc3でこれを行うことはできますか?私が理解している限り、図書館は主にMCMCをサポートしているため、単純なベイジアンの更新で実際には動作しませんか?私は基本的にライブラリを使用しようとしていました。なぜなら、複数のイベントが特定の知識を共有する複雑なモデルを構築できるからです。 – Christian

答えて

3

をChrisFonnesbeckのアドバイス、@の後、私は、増分更新前についての簡単なチュートリアルのノートブックを書きました。これは、ここで見つけることができます:

https://github.com/pymc-devs/pymc3/blob/master/docs/source/notebooks/updating_priors.ipynb

は基本的に、あなたは彼らからKDEを計算するカスタム連続クラスであなたの事後サンプルをラップする必要があります。次のコードはまさにそれを行います。

def from_posterior(param, samples): 

    class FromPosterior(Continuous): 

     def __init__(self, *args, **kwargs): 
      self.logp = logp 
      super(FromPosterior, self).__init__(*args, **kwargs) 

    smin, smax = np.min(samples), np.max(samples) 
    x = np.linspace(smin, smax, 100) 
    y = stats.gaussian_kde(samples)(x) 
    y0 = np.min(y)/10 # what was never sampled should have a small probability but not 0 

    @as_op(itypes=[tt.dscalar], otypes=[tt.dscalar]) 
    def logp(value): 
     # Interpolates from observed values 
     return np.array(np.log(np.interp(value, x, y, left=y0, right=y0))) 

    return FromPosterior(param, testval=np.median(samples)) 

その後、あなたはパラメータ名と前の反復の後方からの微量のサンプルでfrom_posterior機能を呼び出すことによって、あなたのモデルパラメータ(alpha言う)の前を定義します。

alpha = from_posterior('alpha', trace['alpha']) 
関連する問題