Wie kann ich mit pymc ein diskretes Zustands-Markov-Modell erstellen?

Ich versuche herauszufinden, wie man mit Markov ein diskretes Kettenmodell erstelltpymc.

Als Beispiel (siehe innbviewer), lassen Sie uns eine Kette der Länge T = 10 bilden, in der der Markov-Zustand binär ist, die Anfangszustandsverteilung [0,2, 0,8] ist und die Wahrscheinlichkeit, Zustände in Zustand 1 zu wechseln, 0,01 beträgt, während sie in Zustand 2 0,5 beträgt

import numpy as np
import pymc as pm
T = 10
prior0 = [0.2, 0.8]
transMat = [[0.99, 0.01], [0.5, 0.5]]

Um das Modell zu erstellen, erstelle ich ein Array von Statusvariablen und ein Array von Übergangswahrscheinlichkeiten, die von den Statusvariablen abhängen (mithilfe der Funktion pymc.Index).

states = np.empty(T, dtype=object)
states[0] = pm.Categorical('state_0', prior0)
transPs = np.empty(T, dtype=object)
transPs[0] = pm.Index('trans_0', transMat, states[0])

for i in range(1, T):
    states[i] = pm.Categorical('state_%i' % i, transPs[i-1])
    transPs[i] = pm.Index('trans_%i' %i, transMat, states[i])

Die Auswahl des Modells zeigt, dass die Randbedingungen der Bundesstaaten so sind, wie sie sein sollten (im Vergleich zu Modellen, die mit dem BNT-Paket von Kevin Murphy in Matlab erstellt wurden).

model = pm.MCMC([states, transPs])
model.sample(10000, 5000)
[np.mean(model.trace('state_%i' %i)[:]) for i in range(T)]    

druckt aus:

[-----------------100%-----------------] 10000 of 10000 complete in 7.5 sec

[0.80020000000000002,
 0.39839999999999998,
 0.20319999999999999,
 0.1118,
 0.064199999999999993,
 0.044600000000000001,
 0.033000000000000002,
 0.026200000000000001,
 0.024199999999999999,
 0.023800000000000002]

Meine Frage ist - dies scheint nicht die eleganteste Art zu sein, eine Markov-Kette mit Pymc zu bauen. Gibt es einen saubereren Weg, der keine deterministischen Funktionen erfordert?

Mein Ziel ist es, ein Pymc-basiertes Paket für allgemeinere dynamische Bayes-Netzwerke zu schreiben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage