wrong batch_shape of distribution for observation distribution in HMM

Aperta
#1,850 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
python

Direzione di ricerca

Inizia con il comportamento di batch_shape ed event_shape di tfd.Mixture, tfd.MixtureSameFamily e tfd.HiddenMarkovModel mostrato nell’issue. Confronta le shape dei parametri dei componenti e categoriali con i requisiti della distribuzione di transizione dell’HMM. Il lavoro è completato quando viene identificata una shape valida della distribuzione delle osservazioni che rappresenti entrambi gli stati nascosti senza gli errori scalar-batch o last-dimension segnalati.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

I got a serial of observations with shape of (N, 1). These observations correspond to two hidden states.

For hidden state 0, I declare the distribution as below:
dis0 = tfd.MixtureSameFamily( mixture_distribution=tfd.Categorical(probs=[0.4, 0.4, 0.2]), # mixture_distribution=tfd.Categorical(probs=[0.4, 0.4, 0.2]) components_distribution=tfd.Normal(loc=tf.Variable([100.0, 260.0, 180.0], trainable=True), scale=tf.Variable([10.0], trainable=True)) # tfd.Normal(loc=[100, 260, 180], scale=[10, 10, 10]) )
which mean it's a mixed Normal Distribution with three peaks.

For hidden. state 1, I declare the distribution as below:
dis1 = tfd.Normal(loc=tf.Variable(0.0, trainable=True), scale=tf.Variable(40.0, trainable=True))
which means it's a simple Normal Distribution

then I declare the 'observation distribution' as :
observation_distribution = tfd.Mixture( cat=tfd.Categorical(probs=[0.9, 0.1]), # 对应两个状态的概率 components=[dis_0, dis_1] )

After running the above code, I got observation_distribution.batch_shape = []

Even if I adjust the code as below:
`dis_swim = tfd.MixtureSameFamily(
mixture_distribution=tfd.Categorical(probs=[[0.4, 0.4, 0.2]]), # mixture_distribution=tfd.Categorical(probs=[0.4, 0.4, 0.2])
components_distribution=tfd.Normal(loc=tf.Variable([100.0, 260.0, 180.0], trainable=True), scale=tf.Variable([10.0], trainable=True)) # tfd.Normal(loc=[100, 260, 180], scale=[10, 10, 10])
)

dis_turn = tfd.Normal(loc=tf.Variable([0.0], trainable=True), scale=tf.Variable([40.0], trainable=True))
print(dis_turn.batch_shape, dis_turn.event_shape)

observation_distribution = tfd.Mixture(
cat=tfd.Categorical(probs=[[0.9, 0.1]]), # 对应两个状态的概率
components=[dis_swim, dis_turn]
)`

I got observation_distribution.batch_shape = [1]

!!!
However, the observation distribution in HMM needs batch_size equals 2 when I definate the HMM model as below:
hmm = tfd.HiddenMarkovModel( initial_distribution=tfd.Categorical(probs=[0.5, 0.5]), transition_distribution=tfd.Categorical(probs=[[0.9, 0.1], [0.1, 0.9]]), observation_distribution=observation_distribution, num_steps=N)

so I got the error "observation_distribution can't have scalar batches" or "transition_distribution and observation_distribution must agree on last dimension of batch size"

Is there anyone could introduct me to fix my code?

PS: Tensorflow:2.17.0 Tensorflow-probability 0.24.0

Lingua principale
Jupyter Notebook
Stelle
4.4k
Fork
1.1k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di tensorflow/probability

Tutte le issue di tensorflow/probability

Issue simili

Altre issue su Machine Learning

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.