Rozbieżność Jensen-Shannon

Mam kolejne pytanie, które miałem nadzieję, że ktoś może mi pomóc.

Używam dywergencji Jensen-Shannona do pomiaru podobieństwa między dwoma rozkładami prawdopodobieństwa. Wyniki podobieństwa wydają się być poprawne w tym sensie, że mieszczą się między 1 a 0, biorąc pod uwagę, że używa się logarytmu bazowego 2, przy czym 0 oznacza, że ​​rozkłady są równe.

Jednak nie jestem pewien, czy rzeczywiście jest gdzieś błąd i zastanawiałem się, czy ktoś może powiedzieć „tak, to jest poprawne” lub „nie, zrobiłeś coś źle”.

Oto kod:

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, 9.0/10, 0]
    q = [0, 1.0/10, 9.0/10]
    print J.Jensen_Shannon_divergence(p, q)

Problem polega na tym, że uważam, że wyniki nie są wystarczająco wysokie, na przykład podczas porównywania dwóch dokumentów tekstowych. Jest to jednak uczucie czysto subiektywne.

Jakakolwiek pomoc jest, jak zawsze, doceniana.

questionAnswers(5)

yourAnswerToTheQuestion