def test_joint_estimator_full(self): X = array([[0, 1], [1, 0], [1, 1]]) y = array([[0, 1], [1, 0], [1, 0]]) assert_array_approx_equal( joint_estimator_full(X, y), [[[.1667, .0], [.0833, .0833]], [[.0, .1667], [.0833, .0833]], [[.0, .0833], [.0833, .0]], [[.0833, .0], [.0, .0833]]], decimal=3) assert_array_approx_equal( joint_estimator_full(csr_matrix(X), csr_matrix(y)), [[[.1667, .0], [.0833, .0833]], [[.0, .1667], [.0833, .0833]], [[.0, .0833], [.0833, .0]], [[.0833, .0], [.0, .0833]]], decimal=3)
def mutual_information(X, y): num_terms = X.shape[1] num_classes = y.shape[1] p_c = marginal_estimator(y, smoothing=True) p_t = marginal_estimator(X, smoothing=True) p_t_c = joint_estimator_full(X, y, smoothing=True) ig = zeros((num_terms)) for i in xrange(num_terms): for j in xrange(num_classes): ig[i] += p_t_c[0][i, j] * log(p_t_c[0][i, j] / (p_t[i] * p_c[j])) ig[i] += p_t_c[1][i, j] * log(p_t_c[1][i, j] / (p_t[i] * (1 - p_c[j]))) ig[i] += p_t_c[2][i, j] * log(p_t_c[2][i, j] / ((1 - p_t[i]) * p_c[j])) ig[i] += p_t_c[3][i, j] * log(p_t_c[3][i, j] / ((1 - p_t[i]) * (1 - p_c[j]))) return ig