Дивергенция Дженсена-Шеннона
У меня есть еще один вопрос, с которым я надеялся, что кто-то может мне помочь.
m с использованием расхождения Дженсена-Шеннона для измерения сходства между двумя вероятностными распределениями. Оценки подобия кажутся правильными в том смысле, что они падают между 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)
Проблема в том, что я чувствую, что оценки не достаточно высоки, например, при сравнении двух текстовых документов. Однако это чисто субъективное чувство.
Любая помощь, как всегда, ценится.