def update_alpha(self, p_y_given_x, theta, Xm, tcs):
"""A rule for non-tree CorEx structure.
"""
sample = np.random.choice(np.arange(Xm.shape[0]), min(self.max_samples, Xm.shape[0]), replace=False)
p_y_given_x = p_y_given_x[:, sample, :]
not_missing = np.logical_not(ma.getmaskarray(Xm[sample]))
alpha = np.empty((self.n_hidden, self.n_visible))
n_samples, n_visible = Xm.shape
memory_size = float(self.max_samples * n_visible * self.n_hidden * self.dim_hidden * 64) / 1000**3 # GB
batch_size = np.clip(int(self.ram * n_visible / memory_size), 1, n_visible)
for i in range(0, n_visible, batch_size):
log_marg_x = self.calculate_marginals_on_samples(theta[i:i+batch_size], Xm[sample, i:i+batch_size])
correct_predictions = np.argmax(p_y_given_x, axis=2)[:, :, np.newaxis] == np.argmax(log_marg_x, axis=3)
for ip in range(i, min(i + batch_size, n_visible)):
alpha[:, ip] = self.unique_info(correct_predictions[:, not_missing[:, ip], ip - i].T)
for j in np.where(np.abs(tcs) < self.tc_min)[0]: # Priming for un-used hidden units
amax = np.clip(np.max(alpha[j, :]), 0.01, 0.99)
alpha[j, :] = alpha[j, :]**(np.log(0.99)/np.log(amax)) + 0.001 * np.random.random(self.n_visible)
self.alpha = alpha[:, :, np.newaxis] # TODO: This is the "correct" update but it is quite noisy. Add smoothing?
评论列表
文章目录