Используя отличную библиотеку TensorFlow, это просто для моделирования следующей динамической байесовской сети:
где H i - вероятностная переменная, представляющая HMM, а S i - вероятностная переменная, представляющая наблюдения.
Что, если бы я хотел, чтобы H зависел от еще одного HMM (Hierarchical HMM) или просто другой вероятностной переменной вроде этой:
Определение HiddenMarkovModel
в TensorFlow выглядит следующим образом:
tfp.distributions.HiddenMarkovModel(
initial_distribution, transition_distribution, observation_distribution,
num_steps, validate_args=False, allow_nan_stats=True,
time_varying_transition_distribution=False,
time_varying_observation_distribution=False, name='HiddenMarkovModel'
)
Он принимает только начальные, переходные и наблюдательные распределения.
Как я мог смоделировать вышеупомянутое и передать дополнительное распределение вероятностных переменных в HiddenMarkovModel
? Возможно ли это, каким-то образом включив C
в параметр transition_distribution
? Может быть, C
тоже следует рассматривать как наблюдение? (Я не уверен, что это будет полный эквивалент структуры, которую я хотел бы смоделировать)
Было бы здорово иметь простой пример / объяснение.
ОБНОВЛЕНИЕ
Я попытался построить простое совместное распределение двух зависимых переменных и передать его как transition_distribution в HMM:
def mydist(y):
samples_length = 1 if tf.rank(y) == 0 else y.shape[0]
b = tf.ones([samples_length], dtype=tf.int32) - y
a = tf.reshape(y, [samples_length,1])
b = tf.reshape(b, [samples_length,1])
c = tf.concat([a, b], axis=1)
condprobs = tf.constant([ [0.1, 0.9], [0.5, 0.5] ])
d = tf.matmul(tf.cast(c, tf.float32), condprobs)
return tfd.Categorical(d, dtype=tf.int32)
jd = tfd.JointDistributionSequential([
tfd.Categorical(probs=[0.9, 0.1]),
lambda y: mydist(y)
], validate_args=True)
initial_distribution = tfd.Categorical(probs=[0.8, 0.2])
transition_distribution = tfd.Categorical(probs=[[0.7, 0.3],
[0.2, 0.8]])
observation_distribution = tfd.Normal(loc=[0., 15.], scale=[5., 10.])
model = tfd.HiddenMarkovModel(
initial_distribution=initial_distribution,
transition_distribution=jd,
observation_distribution=observation_distribution,
num_steps=7)
temps = [-2., 0., 2., 4., 6., 8., 10.]
model.posterior_mode(temps)
Это дает ошибку:
ValueError: если две фигуры не могут быть переданы. AttributeError: объект 'list' не имеет атрибута 'ndims'
В руководстве HMM упоминается:
Эта модель предполагает, что матрицы переходов фиксируются во времени.
И это transition_distribution должно быть
Категорически-подобный экземпляр. Крайнее правое пакетное измерение индексирует распределение вероятностей каждого скрытого состояния, обусловленного предыдущим скрытым состоянием.
который tfd.JointDistributionSequential, вероятно, не является.
Все еще ищу способы построения иерархических HMM с помощью TensorFlow.