Lorsque l'on considère les avantages de la métrique de Wasserstein par rapport à la divergence de KL, alors le plus évident est que W est une métrique alors que la divergence de KL ne l'est pas, car KL n'est pas symétrique (c'est-à-dire en général) et ne satisfait pas l'inégalité du triangle (ie ne tient pas en général).D K L ( R | | P ) ≤ D K L ( Q | | P ) + D K L ( R | | Q )DKL(P||Q)≠DKL(Q||P)DKL(R||P)≤DKL(Q||P)+DKL(R||Q)
En ce qui concerne la différence pratique, l'une des plus importantes est que, contrairement à KL (et à de nombreuses autres mesures), Wasserstein prend en compte l'espace métrique et ce que cela signifie en termes moins abstraits est peut-être mieux expliqué par un exemple (n'hésitez pas à sauter à la figure, code juste pour la produire):
# 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()
Ici, les mesures entre les distributions rouge et bleue sont les mêmes pour la divergence KL tandis que la distance de Wasserstein mesure le travail requis pour transporter la masse de probabilité de l'état rouge à l'état bleu en utilisant l'axe des x comme une «route». Cette mesure est évidemment d'autant plus grande que la masse de probabilité est éloignée (d'où la distance du pseudo-terrasseur). Ainsi, celui que vous souhaitez utiliser dépend de votre domaine d'application et de ce que vous souhaitez mesurer. À noter, au lieu de la divergence KL, il existe également d'autres options comme la distance Jensen-Shannon qui sont des mesures appropriées.