Я хотел бы рассчитать дивергенцию Дженсена-Шеннона для следующих трех распределений. Является ли приведенный ниже расчет правильным? (Я следовал формуле JSD из Википедии ):
P1 a:1/2 b:1/2 c:0
P2 a:0 b:1/10 c:9/10
P3 a:1/3 b:1/3 c:1/3
All distributions have equal weights, ie 1/3.
JSD(P1, P2, P3) = H[(1/6, 1/6, 0) + (0, 1/30, 9/30) + (1/9,1/9,1/9)] -
[1/3*H[(1/2,1/2,0)] + 1/3*H[(0,1/10,9/10)] + 1/3*H[(1/3,1/3,1/3)]]
JSD(P1, P2, P3) = H[(1/6, 1/5, 9/30)] - [0 + 1/3*0.693 + 0] = 1.098-0.693 = 0.867
Заранее спасибо...
РЕДАКТИРОВАТЬ Вот простой грязный код Python, который также рассчитывает это:
def entropy(prob_dist, base=math.e):
return -sum([p * math.log(p,base) for p in prob_dist if p != 0])
def jsd(prob_dists, base=math.e):
weight = 1/len(prob_dists) #all same weight
js_left = [0,0,0]
js_right = 0
for pd in prob_dists:
js_left[0] += pd[0]*weight
js_left[1] += pd[1]*weight
js_left[2] += pd[2]*weight
js_right += weight*entropy(pd,base)
return entropy(js_left)-js_right
usage: jsd([[1/2,1/2,0],[0,1/10,9/10],[1/3,1/3,1/3]])
distance-functions
information-theory
kanzen_master
источник
источник
Ответы:
В распределении смеси есть ошибка. Это должно быть вместо которое не суммирует до 1. Энтропия (с натуральным логарифмом) для этого равна 1,084503 , Ваши другие условия энтропии неверны.( 5 / 18 , 28 / 90 , 37 / 90 ) ( 1 / 6 , 1 / 5 , 9 / 30 )
Я приведу детали одного вычисления:
Аналогичным образом, другими терминами являются 0.325083 и 1.098612. Таким образом, окончательный результат равен 1,084503 - (0,6931472 + 0,325083 + 1,098612) / 3 = 0,378889.
источник
h <- function(x) {h <- function(x) {y <- x[x > 0]; -sum(y * log(y))}; jsd <- function(p,q) {h(q %*% p) - q %*% apply(p, 2, h)}
p
q
p <- matrix(c(1/2,1/2,0, 0,1/10,9/10, 1/3,1/3,1/3), ncol=3, byrow=TRUE); q <- c(1/3,1/3,1/3); jsd(p,q)
h <- function(x) {
была вставлена дважды. Просто удалите его: все остальное работает и дает результаты, которые я цитирую. Затем модифицировать ,apply(p, 2, h)
чтобы ,apply(p, 1, h)
как отметил в комментарии по Легенде .Python:
Джава:
источник
Вы дали ссылку на Википедию. Здесь я приведу полное выражение для дивергенции Дженсена-Шеннона с несколькими вероятностными распределениями:
Оригинальный вопрос был опубликован без математического выражения множественной JS-дивергенции, что приводит к путанице в понимании предоставленных вычислений. Кроме того,
weight
был использован термин, который снова вызывает путаницу в том, как вы выбираете подходящие веса для умножения. Выше выражение проясняет эти заблуждения. Как ясно из приведенного выше выражения, веса автоматически выбираются в зависимости от количества распределения.источник
Scala-версия JS-расходимости двух последовательностей произвольной длины:
Перепроверьте этот ответ с кодом в разделе редактирования вопроса:
источник
Общая версия для n распределений вероятностей на языке python, основанная на формуле Википедии и комментариях в этом посте, с вектором весов ( pi ) в качестве параметра и пользовательской базой журналов :
источник