Дивергенция Дженсена-Шеннона

У меня есть еще один вопрос, с которым я надеялся, что кто-то может мне помочь.

Я использую Jensen-Shannon-Divergence для измерения сходства между двумя вероятностными распределениями. Оценки подобия кажутся правильными в том смысле, что они падают между 1 и 0, если использовать логарифм по основанию 2, где 0 означает, что распределения равны.

Однако я не уверен, есть ли где-то ошибка на самом деле, и мне было интересно, сможет ли кто-нибудь сказать «да, это правильно» или «нет, вы сделали что-то не так».

Вот код:

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)

Проблема в том, что я чувствую, что оценки не достаточно высоки, например, при сравнении двух текстовых документов. Однако это чисто субъективное чувство.

Любая помощь, как всегда, ценится.

Ответы на вопрос(5)

Ваш ответ на вопрос