def neg_log_likelihood(theta_vec): theta = np.reshape(theta_vec, theta_dim) h, b = dp(theta) log_kappa = logaddexp(h[0] + b[1]) nll = log_kappa nll -= h[0][0] for k in range(1, params['M']): nll -= h[k][0,0] return nll
def dp(theta): h = [None] * params['M'] h[0] = np.empty(n_w[0]) for w in range(n_w[0]): h[0][w] = np.sum(theta * hits[0][w]) for k in range(1, params['M']): h[k] = np.empty((n_w[k-1], n_w[k])) for w_prev in range(n_w[k-1]): for w in range(n_w[k]): h[k][w_prev,w] = np.sum(theta * hits[k][w_prev,w]) b = [None] * (params['M']+1) b[params['M']] = np.zeros(n_w[params['M']-1]) for k in range(params['M']-1, 0, -1): b[k] = np.empty(n_w[k-1]) for w_prev in range(n_w[k-1]): b[k][w_prev] = logaddexp(h[k][w_prev] + b[k+1]) return h, b