def test_rbm_fim(self): j = np.random.normal(0, 1) visbias = np.random.normal() hidbias = np.random.normal() model = IsingModel(2) model.import_rbm01(1, 1, [visbias], [hidbias], [[j]]) z = (np.exp(visbias) + np.exp(hidbias) + np.exp(visbias + hidbias + j) + 1) def f(x): return x / z * (1 - x / z) exp0 = np.exp(visbias + hidbias + j) exp1 = np.exp(visbias) + exp0 exp2 = np.exp(hidbias) + exp0 varvis = f(exp1) varhid = f(exp2) varprod = f(exp0) cov_vishid = exp0 / z - exp1 * exp2 / z ** 2 cov_visprod = exp0 / z * (1 - exp1 / z) cov_hidprod = exp0 / z * (1 - exp2 / z) sample = model.sample(20000) fim = model.fisher_information(sample, model.fimfunction_rbm) self.assertAlmostEqual(fim[0, 0], varvis, places=2) self.assertAlmostEqual(fim[1, 1], varhid, places=2) self.assertAlmostEqual(fim[2, 2], varprod, places=2) self.assertAlmostEqual(fim[1, 0], cov_vishid, places=2) self.assertAlmostEqual(fim[2, 0], cov_visprod, places=2) self.assertAlmostEqual(fim[1, 2], cov_hidprod, places=2)
def test_rbm_hamiltonian(self): nvis, nhid = 10, 5 vishid = np.random.normal(size=(nvis, nhid)) model = IsingModel(nvis + nhid) model.import_rbm01(nvis, nhid, np.zeros(nvis), np.zeros(nhid), vishid) state = np.random.choice([True, False], size=nvis + nhid) vis, hid = state[:nvis], state[nvis:] energy = -np.dot(vis, np.dot(hid, vishid.T)) self.assertAlmostEqual(model.hamiltonian(state), energy)