考虑Wasserstein度量与KL散度相比的优势时,最明显的是W是一个度量,而KL散度则不是,因为KL不对称(即在普通)和不满足三角不等式(即d ķ 大号([R | | P )≤ d ķ 大号(Q | | P )+ d ķDKL(P||Q)≠DKL(Q||P)通常不成立。DKL(R||P)≤DKL(Q||P)+DKL(R||Q)
至于实际的区别,最重要的一点是,与KL(以及许多其他度量)不同,Wasserstein考虑了度量空间,这也许可以通过一个示例来最好地用较少的抽象术语进行解释(随意跳过)该图,仅用于生成它的代码):
# define samples this way as scipy.stats.wasserstein_distance can't take probability distributions directly
sampP = [1,1,1,1,1,1,2,3,4,5]
sampQ = [1,2,3,4,5,5,5,5,5,5]
# and for scipy.stats.entropy (gives KL divergence here) we want distributions
P = np.unique(sampP, return_counts=True)[1] / len(sampP)
Q = np.unique(sampQ, return_counts=True)[1] / len(sampQ)
# compare to this sample / distribution:
sampQ2 = [1,2,2,2,2,2,2,3,4,5]
Q2 = np.unique(sampQ2, return_counts=True)[1] / len(sampQ2)
fig = plt.figure(figsize=(10,7))
fig.subplots_adjust(wspace=0.5)
plt.subplot(2,2,1)
plt.bar(np.arange(len(P)), P, color='r')
plt.xticks(np.arange(len(P)), np.arange(1,5), fontsize=0)
plt.subplot(2,2,3)
plt.bar(np.arange(len(Q)), Q, color='b')
plt.xticks(np.arange(len(Q)), np.arange(1,5))
plt.title("Wasserstein distance {:.4}\nKL divergence {:.4}".format(
scipy.stats.wasserstein_distance(sampP, sampQ), scipy.stats.entropy(P, Q)), fontsize=10)
plt.subplot(2,2,2)
plt.bar(np.arange(len(P)), P, color='r')
plt.xticks(np.arange(len(P)), np.arange(1,5), fontsize=0)
plt.subplot(2,2,4)
plt.bar(np.arange(len(Q2)), Q2, color='b')
plt.xticks(np.arange(len(Q2)), np.arange(1,5))
plt.title("Wasserstein distance {:.4}\nKL divergence {:.4}".format(
scipy.stats.wasserstein_distance(sampP, sampQ2), scipy.stats.entropy(P, Q2)), fontsize=10)
plt.show()
在这里,红色和蓝色分布之间的度量对于KL散度是相同的,而Wasserstein距离使用x轴作为“道路”来度量将概率质量从红色状态传输到蓝色状态所需的功。显然,此度量越大,概率质量越远(因此别名推土机的距离)。因此,您要使用哪一个取决于您的应用领域和要测量的内容。需要注意的是,除了KL散度以外,还有其他一些选项(如Jensen-Shannon距离)是适当的指标。