Berechnung der Kullback-Leibler (KL) Distanz zwischen Textdokumenten mit numpy
Mein Ziel ist es, den KL-Abstand zwischen folgenden Textdokumenten zu berechnen:
1)The boy is having a lad relationship
2)The boy is having a boy relationship
3)It is a lovely day in NY
Ich habe zuerst die Dokumente vektorisiert, um numpy leicht anwenden zu können
1)[1,1,1,1,1,1,1]
2)[1,2,1,1,1,2,1]
3)[1,1,1,1,1,1,1]
Ich habe dann den folgenden Code zum Berechnen des KL-Abstands zwischen den Texten angewendet:
import numpy as np
import math
from math import log
v=[[1,1,1,1,1,1,1],[1,2,1,1,1,2,1],[1,1,1,1,1,1,1]]
c=v[0]
def kl(p, q):
p = np.asarray(p, dtype=np.float)
q = np.asarray(q, dtype=np.float)
return np.sum(np.where(p != 0,(p-q) * np.log10(p / q), 0))
for x in v:
KL=kl(x,c)
print KL
Hier ist das Ergebnis des obigen Codes:[0.0, 0.602059991328, 0.0]
. Die Texte 1 und 3 sind völlig unterschiedlich, aber der Abstand zwischen ihnen beträgt 0, während die stark verwandten Texte 1 und 2 einen Abstand von 0 haben0.602059991328
. Das ist nicht richtig.
Hat jemand eine Idee, was ich in Bezug auf KL nicht richtig mache? Vielen Dank für Ihre Anregungen.