Условная вероятность

как сделать вероятностные агрегации внутри моего редуктора с помощью мапперов;

Я пытаюсь реализовать как подход "полос", так и подход "пар" в Hadoop для следующих задач, но мне хотелось бы знать, как осуществлять связь между несколькими сопоставителями и как выполнять вероятностные агрегации внутри моего редуктора.

  • Совместное вхождение каждой пары элементов Count (A, B)=# транзакций содержит как A, так и B, а условная вероятность Prob(B|A)=Count(A,B)/Count(A).
  • Совместное вхождение каждой тройки элементов Count (A,B,C) =# транзакций содержит как A, так и B, а условная вероятность Prob(A|B,C)=Count(A,B,C)/Count(В, С)
  • Каждая строка записывает транзакцию (набор предметов, приобретаемых вместе): входные наборы данных представляют собой данные транзакции в следующем формате:

    25 52 164 240 274 ​​328 368 448 538 561 630 687 730 775 825 834 39 120 124 205 401 581 704 814 825 834 35 249 674 712 733 759 854 950 39 422 449 704 825 857 895 937 954 964 15 229 262 283 294 352 381 708 738 766 853 883 966 978 26 104 143 320 569 620 798 7 185 214 350 529 658 682 782 809 849 883 947 970 979 227 390 71 192 208 272 279 280 300 333 496 529 530 597 618 674 675 720 855 914 932 =======================================================================================**

1 ответ

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

Из вашей исходной информации в вопросе становится ясно, что вы понимаете, что рассчитать интересующие вас условные вероятности - это всего лишь упражнение в подсчете. Обычная схема здесь - сделать все подсчеты на одном проходе сокращения карты, а затем взять эти выходные данные и затем разделить соответствующие количества (попытка включить их в проход уменьшения карты добавляет ненужную сложность)

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

код маппера в python для потоковой передачи hadoop

import sys
output={}


for line in sys.stdin:
   temp=line.strip().split('\t')
   # we should sort the input so that all occurrences of items x and y appear with x before y
   temp.sort()
   # count the occurrences of all the single items
   for item in temp:
      if item in output:
         output[item]+=1
      else:
         output[item]=1


   #count the occurrences of each pair of items
   for i in range(len(temp)):
      for j in range(i+1,len(temp)):
         key=temp[i]+'-'+temp[j]
         if key in output:
            output[key]+=1
         else:
            output[key]=1
   #you can triple nest a loop if you want to count all of the occurrences of each 3 item pair, but be warned the number of combinations starts to get large quickly
   #for 100 items as in your example there would be 160K combinations


#this point of the program will be reached after all of the data has been streamed in through stdin
#output the keys and values of our output dictionary with a tab separating them
for data in output.items():
   print data[0]+'\t'+data[1]

#end mapper code

Код для редуктора теперь такой же, как и все примеры подсчета слов, которые так плодотворны. Пример для кода Python с поточной передачей map-Reduce можно найти здесь. Результатом программы map-redund будет строка с ключом, описывающим то, что было подсчитано, а также количество вхождений каждого отдельного элемента, а также ключ и количество вхождений всех пар, и оттуда вы можете написать программу рассчитать условные вероятности, которые вас интересуют.

Другие вопросы по тегам