def compute_forwards(self, reuse=None):
"""Compute the forward step in the Kalman filter.
The forward pass is intialized with p(z_1)=N(self.mu, self.Sigma).
We then return the mean and covariances of the predictive distribution p(z_t|z_tm1,u_t), t=2,..T+1
and the filtering distribution p(z_t|x_1:t,u_1:t), t=1,..T
We follow the notation of Murphy's book, section 18.3.1
"""
# To make sure we are not accidentally using the real outputs in the steps with missing values, set them to 0.
y_masked = tf.multiply(tf.expand_dims(self.mask, 2), self.y)
inputs = tf.concat([y_masked, self.u, tf.expand_dims(self.mask, 2)], axis=2)
y_prev = tf.expand_dims(self.y_0, 0) # (1, dim_y)
y_prev = tf.tile(y_prev, (tf.shape(self.mu)[0], 1))
alpha, state, u, buffer = self.alpha(y_prev, self.state, self.u[:, 0], init_buffer=True, reuse= reuse)
# dummy matrix to initialize B and C in scan
dummy_init_A = tf.ones([self.Sigma.get_shape()[0], self.dim_z, self.dim_z])
dummy_init_B = tf.ones([self.Sigma.get_shape()[0], self.dim_z, self.dim_u])
dummy_init_C = tf.ones([self.Sigma.get_shape()[0], self.dim_y, self.dim_z])
forward_states = tf.scan(self.forward_step_fn, tf.transpose(inputs, [1, 0, 2]),
initializer=(self.mu, self.Sigma, self.mu, self.Sigma, alpha, u, state, buffer,
dummy_init_A, dummy_init_B, dummy_init_C),
parallel_iterations=1, name='forward')
return forward_states
评论列表
文章目录