def latent_correlation(self):
"""Compute correlation matrix among latent features.
This computes the generalization of Pearson's correlation to discrete
data. Let I(X;Y) be the mutual information. Then define correlation as
rho(X,Y) = sqrt(1 - exp(-2 I(X;Y)))
Returns:
A [V, V]-shaped numpy array of feature-feature correlations.
"""
logger.debug('computing latent correlation')
V, E, M, R = self._VEMR
edge_probs = self._edge_probs
vert_probs = self._vert_probs
result = np.zeros([V, V], np.float32)
for root in range(V):
messages = np.empty([V, M, M])
program = make_propagation_program(self._tree.tree_grid, root)
for op, v, v2, e in program:
if op == OP_ROOT:
# Initialize correlation at this node.
messages[v, :, :] = np.diagflat(vert_probs[v, :])
elif op == OP_OUT:
# Propagate correlation outward from parent to v.
trans = edge_probs[e, :, :]
if v > v2:
trans = trans.T
messages[v, :, :] = np.dot( #
trans / vert_probs[v2, np.newaxis, :],
messages[v2, :, :])
for v in range(V):
result[root, v] = correlation(messages[v, :, :])
return result
评论列表
文章目录