我正在处理一个包含物联网设备数据的数据集,我发现隐马尔可夫模型非常适合我的用例。因此,我尝试修改Tensorflow教程中的一些代码,我找到了here。数据集包含观察变量的实值,并与教程中显示的计数数据进行了比较。
特别是,我认为以下需要改变,使隐马尔可夫模型有正态分布的发射。不幸的是,我找不到任何代码如何改变模型有一个不同的发射以外的泊松。
我应该如何修改代码以发出正态分布的值?
# 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)
2条答案
按热度按时间q3qa4bjr1#
示例模型假设排放量
x
为泊松分布,具有由潜在变量z
确定的四个速率之一。因此,它定义了可训练速率(或对数速率),定义了具有z
上的均匀初始分布的HMM、转移概率和来自泊松分布的观测值,其中对数速率由可训练速率给定。为了更改为正态分布,您说
x
应该是正态分布,其可训练均值和标准差由潜在变量z
确定。因此,您需要将trainable_log_rates
替换为trainable_loc
和trainable_scale
,并更改到
然后,您需要将您的
rate_prior
替换为您选择的loc_prior
和scale_prior
,并使用它们来计算新的log_prob
函数。daolsyd02#
@mCoding的答案是正确的,在Tensorflow发布的示例中,您有一个具有均匀零分布
([0.,0.,0.,0.])
的隐马尔可夫模型,一个重对角转移矩阵,发射概率为泊松分布。为了使其适应“正态”示例,您只需将这些概率更改为“正态”概率。例如,假设您的发射概率正态分布,参数为:
那么
observation_distribution
将是:最后,您还必须更改有关这些参数的先验知识,设置
prior_loc
,prior_scale
。您可能需要考虑无信息/弱信息先验,因为我看到您在之后拟合模型。因此,您的代码应类似于:
现在如果你看参数
training_loc
和training_scale
,它们应该有拟合值。