我试图计算从高斯1到高斯2的Kullback-Leibler散度 我有高斯函数的平均值和标准差 我从http://www.cs.cmu.edu/~chanwook/MySoftware/rm1_Spk-by-Spk_MLLR/rm1_PNCC_MLLR_1/rm1/python/sphinx/divergence.py尝试了这段代码
def gau_kl(pm, pv, qm, qv):
"""
Kullback-Leibler divergence from Gaussian pm,pv to Gaussian qm,qv.
Also computes KL divergence from a single Gaussian pm,pv to a set
of Gaussians qm,qv.
Diagonal covariances are assumed. Divergence is expressed in nats.
"""
if (len(qm.shape) == 2):
axis = 1
else:
axis = 0
# Determinants of diagonal covariances pv, qv
dpv = pv.prod()
dqv = qv.prod(axis)
# Inverse of diagonal covariance qv
iqv = 1./qv
# Difference between means pm, qm
diff = qm - pm
return (0.5 *
(numpy.log(dqv / dpv) # log |\Sigma_q| / |\Sigma_p|
+ (iqv * pv).sum(axis) # + tr(\Sigma_q^{-1} * \Sigma_p)
+ (diff * iqv * diff).sum(axis) # + (\mu_q-\mu_p)^T\Sigma_q^{-1}(\mu_q-\mu_p)
- len(pm))) # - N
我使用平均值和标准偏差作为输入,但是代码的最后一行(len(pm))
会导致错误,因为平均值是一个数字,我不理解这里的len函数。在
注意。两组(即高斯数)不相等,所以我不能用scipy.stats.熵在
如果你还感兴趣。。。在
该函数期望多元高斯协方差矩阵的对角项,而不是您提到的标准差。如果您的输入是一元高斯函数,那么}都是对应高斯函数方差的长度为1的向量。在
pv
和{另外,
len(pm)
对应于均值向量的维数。在多元正态分布的截面here中,它确实是k。对于一元高斯函数,k为1,对于二元高斯函数,k为2,依此类推。在以下函数计算任意两个多元正态分布之间的KL散度(协方差矩阵不需要是对角的)(其中numpy作为np导入)
相关问题 更多 >
编程相关推荐