NumPy - рассчитать пересечение гистограммы - PullRequest
0 голосов
/ 05 сентября 2018

Следующие данные представляют 2 заданные гистограммы, разбитые на 13 блоков:

key 0   1-9 10-18   19-27   28-36   37-45   46-54   55-63   64-72   73-81   82-90   91-99   100
A   1.274580708 2.466224824 5.045757621 7.413716262 8.958855646 10.41325305 11.14150951 10.91949012 11.29095648 10.95054297 10.10976255 8.128781795 1.886568472
B   0   1.700493692 4.059243006 5.320899616 6.747120132 7.899067471 9.434997257 11.24520022 12.94569391 12.83598464 12.6165661  10.80636314 4.388370817

enter image description here

Я пытаюсь следовать этой статье , чтобы вычислить пересечение между этими 2 гистограммами, используя этот метод:

def histogram_intersection(h1, h2, bins):
   bins = numpy.diff(bins)
   sm = 0
   for i in range(len(bins)):
       sm += min(bins[i]*h1[i], bins[i]*h2[i])
   return sm

Поскольку мои данные уже рассчитаны как гистограмма, я не могу использовать встроенную функцию numpy, поэтому я не могу предоставить этой функции необходимые данные.

Как мне обработать мои данные в соответствии с алгоритмом?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Поскольку у вас одинаковые плюшки для обеих гистограмм, вы можете использовать:

def histogram_intersection(h1, h2):
    sm = 0
    for i in range(13):
        sm += min(h1[i], h2[i])
    return sm
0 голосов
/ 05 сентября 2018

Сначала несколько предостережений: в ваших бинах данных есть диапазоны, в вашем алгоритме они - числа. Вы должны переопределить контейнеры для этого.

Кроме того, min(bins[i]*h1[i], bins[i]*h2[i]) равно bins[i]*min(h1[i], h2[i]), поэтому результат можно получить следующим образом:

hists=pandas.read_clipboard(index_col=0) # your data
bins=arange(-4,112,9)   #  try for bins but edges are different here
mins=hists.min('rows')
intersection=dot(mins,bins) 
...