Матрица расстояний попарной дивергенции Кульбака-Лейблера (или Дженсена-Шеннона) в Python

У меня есть две матрицы X и Y (в большинстве случаев они похожи). Теперь я хочу вычислить попарное расхождение KL между всеми строками и вывести их в матрицу. Например:

X = [[0.1, 0.9], [0.8, 0.2]]

Затем функция должна взять kl_divergence(X, X) и вычислить расстояние попарного расхождения Kl для каждой пары строк обеих X-матриц. На выходе будет матрица 2x2.

Есть ли уже какая-то реализация для этого в Python? В противном случае это должно быть довольно просто вычислить. Мне нужна какая-то матричная реализация для этого, потому что у меня много данных, и мне нужно, чтобы время выполнения было как можно меньше. В качестве альтернативы энтропия Дженсена-Шеннона тоже подойдет. В конце концов, это было бы даже лучшим решением для меня.


person fsociety    schedule 15.05.2012    source источник
comment
Что представляют собой строки X, распределения вероятностей для конечного набора событий?   -  person Fred Foo    schedule 15.05.2012
comment
Да, именно так, строки представляют собой распределения вероятностей, и каждая строка имеет одинаковое количество элементов в распределении.   -  person fsociety    schedule 16.05.2012


Ответы (2)


Обратите внимание, что KL-дивергенция, по сути, является скалярным произведением P (i) и журнал (P (i) / Q (i)). Итак, один вариант - сформировать список массивов numpy для P (i), а другой - для журнала (P ( i) / Q (i)), по одной строке для каждого расхождения KL, которое вы хотите вычислить), затем выполните скалярные произведения.

person jrennie    schedule 15.05.2012

Существует новая (ish) библиотека под названием dit, в которой реализован JSD, а также взаимная информация и многие другие показатели расстояния:

import dit
foo = dit.Distribution(['A','B','C'],[0.5,0.5,0.0])
bar = dit.Distribution(['A','B','C'],[0.1,0.0,0.9])
dit.divergences.jensen_shannon_divergence([foo,bar])
0.80499327350549388

Над документами можно немного поработать, но это выглядит многообещающе.

http://docs.dit.io/en/latest/generalinfo.html#quickstart

person hurfdurf    schedule 14.10.2014