Jensen-Shannon Divergence (JSD)是Kullback-Leibler divergence(KLD)的一个变种,转换方式如下:

JSD(P||Q) = 1/2*(D(P||M)+D(Q||M))

$$JSD(P\parallel Q)= \frac{1}{2}D(P\parallel M) + \frac{1}{2}D(Q\parallel M)$$

M=1/2*(P+Q)

参考:http://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence

D(P||R)指的是KLD

KLD(P||Q) = Σ[P(i)*ln(P(i)/Q(i))]

$${D}_{KL}(P\parallel Q)=\sum_{i} P(i)\ln \frac{P(i)}{Q(i)}$$

这里只考虑离散的情况,连续的情况可以参考KLD的维基百科解释

http://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence

如果两个变量P,Q分别有如下性质

P = [2, 3, 4, 1, 1]

Q = [3, 3, 2, 1 ]

为了让他们能用JSD公式,必须先保证他们的长度一样,并且没有共同为0的情况。

那么P’ = P ; Q’ = [3, 3, 2, 1, 0]

这些预处理就不写进程序里了,Python算法如下: