矩阵所有行对之间的向量化 KL 散度计算
Vectorized KL divergence calculation between all pairs of rows of a matrix
我想找出矩阵所有行对之间的 KL 散度。为了解释,我们假设有一个形状为 N x K
的矩阵 V
。现在我想创建一个维度 N x N
的矩阵 L
,其中每个元素 L[i,j] = KL(V[i,:],V[j,:])
。到目前为止,我已经使用以下 scipy.stats.entropy
来计算
upper_triangle = [entropy(V[i,:],V[j,:]) for (i,j) in itertools.combinations(range(N,2)]
lower_triangle = [entropy(V[j,:],V[i,:]) for (i,j) in itertools.combinations(range(N,2)]
L = np.zeroes((N,N))
L[np.triu_indices(N,k = 1)] = upper_triangle
L[np.tril_indices(N,k = -1)] = lower_triangle
有没有更聪明的方法?
好的,在稍微修改 KL 散度的方程式之后,下面的方程式应该也适用,当然,它的数量级更快,
kl = np.dot(V, np.log(Vc).T)
right = kl + kl.T
left = np.tile(np.diag(kl),(kl.shape[0],1))
left = left + left.T
L = left - right
我想找出矩阵所有行对之间的 KL 散度。为了解释,我们假设有一个形状为 N x K
的矩阵 V
。现在我想创建一个维度 N x N
的矩阵 L
,其中每个元素 L[i,j] = KL(V[i,:],V[j,:])
。到目前为止,我已经使用以下 scipy.stats.entropy
来计算
upper_triangle = [entropy(V[i,:],V[j,:]) for (i,j) in itertools.combinations(range(N,2)]
lower_triangle = [entropy(V[j,:],V[i,:]) for (i,j) in itertools.combinations(range(N,2)]
L = np.zeroes((N,N))
L[np.triu_indices(N,k = 1)] = upper_triangle
L[np.tril_indices(N,k = -1)] = lower_triangle
有没有更聪明的方法?
好的,在稍微修改 KL 散度的方程式之后,下面的方程式应该也适用,当然,它的数量级更快,
kl = np.dot(V, np.log(Vc).T)
right = kl + kl.T
left = np.tile(np.diag(kl),(kl.shape[0],1))
left = left + left.T
L = left - right