def __init__(self, nu=1.5, dt=1.0, obs_dim=2, num_gps=1, length_scale_init=None, kernel_scale_init=None, obs_noise_scale_init=None): self.nu = nu self.dt = dt assert obs_dim > 1, "If obs_dim==1 you should use IndependentMaternGP" self.obs_dim = obs_dim self.num_gps = num_gps if obs_noise_scale_init is None: obs_noise_scale_init = 0.2 * torch.ones(obs_dim) assert obs_noise_scale_init.shape == (obs_dim,) self.dt = dt self.obs_dim = obs_dim self.num_gps = num_gps super().__init__() self.kernel = MaternKernel(nu=nu, num_gps=num_gps, length_scale_init=length_scale_init, kernel_scale_init=kernel_scale_init) self.full_state_dim = num_gps * self.kernel.state_dim self.obs_noise_scale = PyroParam(obs_noise_scale_init, constraint=constraints.positive) self.A = nn.Parameter(0.3 * torch.randn(self.num_gps, self.obs_dim))
def __init__( self, nu=1.5, dt=1.0, obs_dim=1, length_scale_init=None, kernel_scale_init=None, obs_noise_scale_init=None, ): self.nu = nu self.dt = dt self.obs_dim = obs_dim if obs_noise_scale_init is None: obs_noise_scale_init = 0.2 * torch.ones(obs_dim) assert obs_noise_scale_init.shape == (obs_dim, ) super().__init__() self.kernel = MaternKernel( nu=nu, num_gps=obs_dim, length_scale_init=length_scale_init, kernel_scale_init=kernel_scale_init, ) self.obs_noise_scale = PyroParam(obs_noise_scale_init, constraint=constraints.positive) obs_matrix = [1.0] + [0.0] * (self.kernel.state_dim - 1) self.register_buffer("obs_matrix", torch.tensor(obs_matrix).unsqueeze(-1))
def __init__( self, nu=1.5, dt=1.0, obs_dim=1, linearly_coupled=False, length_scale_init=None, obs_noise_scale_init=None, ): if nu != 1.5: raise NotImplementedError("The only supported value of nu is 1.5") self.dt = dt self.obs_dim = obs_dim if obs_noise_scale_init is None: obs_noise_scale_init = 0.2 * torch.ones(obs_dim) assert obs_noise_scale_init.shape == (obs_dim, ) super().__init__() self.kernel = MaternKernel(nu=nu, num_gps=obs_dim, length_scale_init=length_scale_init) self.full_state_dim = self.kernel.state_dim * obs_dim # we demote self.kernel.kernel_scale from being a nn.Parameter # since the relevant scales are now encoded in the wiener noise matrix del self.kernel.kernel_scale self.kernel.register_buffer("kernel_scale", torch.ones(obs_dim)) self.obs_noise_scale = PyroParam(obs_noise_scale_init, constraint=constraints.positive) self.wiener_noise_tril = PyroParam( torch.eye(obs_dim) + 0.03 * torch.randn(obs_dim, obs_dim).tril(-1), constraint=constraints.lower_cholesky, ) if linearly_coupled: self.obs_matrix = nn.Parameter( 0.3 * torch.randn(self.obs_dim, self.obs_dim)) else: obs_matrix = torch.zeros(self.full_state_dim, obs_dim) for i in range(obs_dim): obs_matrix[self.kernel.state_dim * i, i] = 1.0 self.register_buffer("obs_matrix", obs_matrix)