Преобразование количества совпадений в вероятности совпадения с помощью cascalog

У меня есть таблица количества совпадений, хранящаяся на s3 (где каждая строка — [key-a, key-b, count]), и я хочу создать из нее матрицу вероятности совпадения.

Для этого мне нужно вычислить сумму счетчиков для каждого ключа-а, а затем разделить каждую строку на сумму для ее ключа-а.

Если бы я делал это «вручную», я бы сделал проход по данным, чтобы создать хэш-таблицу от ключей к итогам (в leveldb или что-то подобное), а затем сделал второй проход по данным, чтобы выполнить деление. Это не похоже на очень каскалогический способ сделать это.

Есть ли способ получить общую сумму для строки, выполнив эквивалент самосоединения?


person bobpoekert    schedule 18.05.2013    source источник


Ответы (1)


Образец данных:

(def coocurrences
  [["foo" "bar" 3]
   ["bar" "foo" 3]
   ["foo" "quux" 6]
   ["quux" "foo" 6]
   ["bar" "quux" 2]
   ["quux" "bar" 2]])

Запрос:

(require '[cascalog.api :refer :all] '[cascalog.ops :as c])

(let [total (<- [?key-a ?sum]
              (coocurrences ?key-a _ ?c)
              (c/sum ?c :> ?sum))]
  (?<- (stdout) [?key-a ?key-b ?prob]
    (div ?c ?sum :> ?prob)
    (coocurrences ?key-a ?key-b ?c)
    (total ?key-a ?sum)))

Выход:

RESULTS
-----------------------
bar     foo     0.6
bar     quux    0.4
foo     bar     0.3333333333333333
foo     quux    0.6666666666666666
quux    foo     0.75
quux    bar     0.25
-----------------------
person Michał Marczyk    schedule 18.05.2013