Clojure Lang Arity Exception - PullRequest
       1

Clojure Lang Arity Exception

0 голосов
/ 09 ноября 2018

Я пытался реализовать классификатор спама.Я написал одну функцию, чтобы получить некоторую вероятность, но когда я вызываю эту функцию с двумя аргументами, я получаю 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))

1 Ответ

0 голосов
/ 09 ноября 2018

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

Исправленный код будет тем, что вы уже опубликовали:

(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))

Хотя это не требует атомов вообще. Атомы в основном используются только для управления данными между потоками. Вам здесь вообще не нужна мутация. Просто продолжайте использовать let:

(defn weightedprob [f cat]
  (let [weight 1
        ap 0.5
        basicprob (fprob f cat)
        totals (reduce + (vals (get @fc f)))]
   (/ (+ (* weight ap) (* totals basicprob)) (+ weight totals)))) 

И неясно, что такое fc, но, скорее всего, он тоже не должен быть атомом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...