def generate_samples(): model = HMM.from_fixed_params() T = 10 Z, X = model.sample(T) print(model) print(f"X: {X}, True Z: {Z}") smcmc = SMCMC(model, T) samples = smcmc.sample(N=100, x_sequence=X) print(f"Last L samples: \n{samples[:, -1]}") # print(np.unique(samples[:, 0], return_counts=True)[1] / len(samples)) print(f"Mean sample: {samples.mean((0, 1)).round(1)}")
Z_samples = np.empty((N, T), dtype=int) Z_samples[0] = self.model.sample_Z(T) for n in range(1, N): z_proposal = self.model.sample_Z(T) log_alpha = compute_log_alpha(z_proposal, Z_samples[n - 1], x_sequence, self.model) self.acceptance_probs.append(np.exp(min(0., log_alpha))) if np.random.rand() <= self.acceptance_probs[-1]: Z_samples[n] = z_proposal else: Z_samples[n] = Z_samples[n - 1] return Z_samples def plot_acceptance(self): fig, ax = plt.subplots(1, 1) ax.plot(self.acceptance_probs) plt.show() if __name__ == '__main__': model = HMM.from_fixed_params() T = 5 Z, X = model.sample(10, 10, None) mh = MH(model, T) print(model) print(X, Z) samples = mh.sample(X) print(samples[-10:]) # mh.plot_acceptance() # print(np.array(mh.acceptance_probs)) print(samples.mean(0).round())