作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个包含来自 IoT 设备的数据的数据集,我发现隐马尔可夫模型非常适合我的用例。因此,我试图从我发现的 Tensorflow 教程中更改一些代码 here .与教程中显示的计数数据相比,数据集包含观察变量的实值。
特别是,我认为需要更改以下内容,以便 HMM 具有正态分布的发射。不幸的是,我找不到任何关于如何改变模型以具有除泊松以外的不同发射的代码。
我应该如何更改代码以发出正态分布的值?
# Define variable to represent the unknown log rates.
trainable_log_rates = tf.Variable(
np.log(np.mean(observed_counts)) + tf.random.normal([num_states]),
name='log_rates')
hmm = tfd.HiddenMarkovModel(
initial_distribution=tfd.Categorical(
logits=initial_state_logits),
transition_distribution=tfd.Categorical(probs=transition_probs),
observation_distribution=tfd.Poisson(log_rate=trainable_log_rates),
num_steps=len(observed_counts))
rate_prior = tfd.LogNormal(5, 5)
def log_prob():
return (tf.reduce_sum(rate_prior.log_prob(tf.math.exp(trainable_log_rates))) +
hmm.log_prob(observed_counts))
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)
@tf.function(autograph=False)
def train_op():
with tf.GradientTape() as tape:
neg_log_prob = -log_prob()
grads = tape.gradient(neg_log_prob, [trainable_log_rates])[0]
optimizer.apply_gradients([(grads, trainable_log_rates)])
return neg_log_prob, tf.math.exp(trainable_log_rates)
最佳答案
示例模型假设排放量 x
是泊松分布,具有由潜在变量 z
确定的四种比率之一.因此它定义了可训练的速率(或对数速率),定义了具有均匀初始分布的 HMM z
、转移概率和泊松分布的观测值,对数率由可训练分布给出。
为了更改为正态分布,您说的是 x
应该是正态分布,具有由潜在变量确定的可训练均值和标准差z
.因此,您需要替换 trainable_log_rates
与 trainable_loc
和 trainable_scale
并改变
observation_distribution=tfd.Poisson(log_rate=trainable_log_rates)
到
observation_distribution=tfd.Normal(loc=trainable_loc, scale=trainable_scale)
然后您需要更换您的
rate_prior
与
loc_prior
和
scale_prior
您选择并使用它们来计算您的新
log_prob
功能。
关于python - 如何让 HMM 处理 Tensorflow 中的实值数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64993130/
我是一名优秀的程序员,十分优秀!