Дивергенция Кульбака-Либера для измерения перекрытия между двумя функциями вероятности - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь определить расхождение KL, чтобы измерить перекрытие между двумя функциями плотности (2 гистограммы).

Ниже приведен код, который у меня есть. Но вывод представляет собой список чисел, а не одно значение?

import matplotlib.pyplot as plt
import random
import scipy.stats

A_x = [random.randrange(1,100,1) for _ in range (10000)]
A_y = [random.randrange(1,100,1) for _ in range (10000)]

B_x = [random.randrange(1,100,1) for _ in range (100000)]
B_y = [random.randrange(1,100,1) for _ in range (100000)]

fig, ax = plt.subplots()
ax.grid(False)

a,x,y,p = plt.hist2d(A_x,A_y, bins = 100)
b,x,y,p = plt.hist2d(B_x,B_y, bins = 100)      

div = scipy.stats.entropy(a, qk= b, base=None)     

1 Ответ

0 голосов
/ 03 мая 2018

scipy.stats.entropy предполагает, что распределения являются одномерными. Глядя на строку документации, вы можете увидеть:

S = -sum(pk * log(pk), axis=0)

, что означает, что суммы по первой оси. Придав ему массив формы (m, n), вы получите результат формы (n,), который подобен обработке каждого ряда ваших массивов как отдельной пары распределений.

Но определение энтропии не заботит размерность распределений. Речь идет о вероятностях события, которое в вашем случае представляет собой отдельный элемент a или b. Так что вы можете сделать:

div = scipy.stats.entropy(a.ravel(), qk=b.ravel(), base=None)

и вы получите одно значение для дивергенции KL.

...