Ich habe eine andere Frage, die ich mir erhofft hatte, dass jemand mir helfen könnte.Jensen-Shannon Divergenz
Ich benutze die Jensen-Shannon-Divergence, um die Ähnlichkeit zwischen zwei Wahrscheinlichkeitsverteilungen zu messen. Die Ähnlichkeitswerte scheinen in dem Sinne korrekt zu sein, dass sie zwischen 1 und 0 liegen, wobei 1 bedeutet, dass die Verteilungen gleich sind.
Ich bin mir jedoch nicht sicher, ob es tatsächlich irgendwo einen Fehler gibt und fragte mich, ob jemand vielleicht sagen könnte "Ja, es ist richtig" oder "Nein, du hast etwas falsch gemacht". Hier
ist der Code:
from numpy import zeros, array
from math import sqrt, log
class JSD(object):
def __init__(self):
self.log2 = log(2)
def KL_divergence(self, p, q):
""" Compute KL divergence of two vectors, K(p || q)."""
return sum(p[x] * log((p[x])/(q[x])) for x in range(len(p)) if p[x] != 0.0 or p[x] != 0)
def Jensen_Shannon_divergence(self, p, q):
""" Returns the Jensen-Shannon divergence. """
self.JSD = 0.0
weight = 0.5
average = zeros(len(p)) #Average
for x in range(len(p)):
average[x] = weight * p[x] + (1 - weight) * q[x]
self.JSD = (weight * self.KL_divergence(array(p), average)) + ((1 - weight) * self.KL_divergence(array(q), average))
return 1-(self.JSD/sqrt(2 * self.log2))
if __name__ == '__main__':
J = JSD()
p = [1.0/10, 1.0/10, 0]
q = [0, 1.0/10, 9.0/10]
print J.Jensen_Shannon_divergence(p, q)
Das Problem ist, dass ich das Gefühl, dass die Werte nicht hoch genug sind, wenn zwei Textdokumente zu vergleichen, zum Beispiel. Dies ist jedoch ein rein subjektives Gefühl.
Jede Hilfe wird, wie immer, geschätzt.
Vielleicht versuchen Ausgabe zu vergleichen (https://www.mathworks.com/matlabcentral/fileexchange/20689-jensen-shannon-divergenz) Oder lauf es in Oktave. –
Das 'if p [x]! = 0.0 oder p [x]! = 0 'sieht seltsam aus. –
Wenn p [x]! = 0.0 oder p [x]! = 0 verwendet wird, um sicherzustellen, dass wir Einträge, die Null sind, nicht berücksichtigen, ob sie Floats oder Ganzzahlen sind, ist das, worauf Sie sich beziehen? Oder meintest du, dass diese Linie komisch ist, Punkt? Danke vielmals. – Martyn