Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wrong batch_shape of distribution for observation distribution in HMM #1850

Open
GongTen opened this issue Oct 28, 2024 · 0 comments
Open

wrong batch_shape of distribution for observation distribution in HMM #1850

GongTen opened this issue Oct 28, 2024 · 0 comments

Comments

@GongTen
Copy link

GongTen commented Oct 28, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant