Я пытался реализовать классификатор спама.Я написал одну функцию, чтобы получить некоторую вероятность, но когда я вызываю эту функцию с двумя аргументами, я получаю clojure.lang.ArityException «Неверное количество аргументов, переданных функции».Вот моя функция:
(defn weightedprob
[f cat]
(let [weight 1
ap 0.5
basicprob (atom 0)
totals (atom 0)
bp (atom 0)]
(swap! basicprob #(fprob f cat))
(swap! totals #(reduce + (vals (get @fc f))))
(swap! bp #(/ (+ (* weight ap) (* totals basicprob)) (+ weight totals)))
bp))
А вот вызов:
(weightedprob "money" "good")
Это работает сейчас.Если у вас есть идея, как реализовать эту функцию, я был бы рад это увидеть.Вот версия, которая работает:
(defn weightedprob
[f cat]
(let [weight 1
ap 0.5
basicprob (atom 0)
totals (atom 0)
bp (atom 0)]
(reset! basicprob (fprob f cat))
(reset! totals (reduce + (vals (get @fc f))))
(reset! bp (/ (+ (* weight ap) (* @totals @basicprob)) (+ weight
@totals)))
@bp))
Функция в Python, которую я реализовывал, выглядит следующим образом:
def weightedprob(self,f,cat,prf,weight=1.0,ap=0.5):
# Calculate current probability
basicprob=prf(f,cat)
# Count the number of times this feature has appeared in
# all categories
totals=sum([self.fcount(f,c) for c in self.categories()])
# Calculate the weighted average
bp=((weight*ap)+(totals*basicprob))/(weight+totals)
return bp
Это из книги Коллективного разума, глава 6, Фильтрация документов
Функция без атомов:
(defn weightedprob1
[f cat]
(let [weight 1
ap 0.5
basicprob (fprob f cat)
totals (reduce + (vals (get @fc f)))
bp (/ (+ (* weight ap) (* totals basicprob)) (+ weight totals))]
bp))