Clojure Lang Arity异常

时间:2018-11-09 15:22:39

标签: clojure

我一直在尝试实现垃圾邮件分类器。我编写了一个函数来获得一定的概率,但是当我用两个参数调用该函数时,我得到clojure.lang.ArityException“传递给函数的args数量错误”。这是我的功能:

.custom-nav {
  background-color: rgba(0,0,0,0.85);
  height:50px;
  font-size:20px;
}

.custom-nav:hover {
  background-color: red;
  color: white; // Any color for text
}

这里是电话:

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

我一直在实现的Python函数如下所示:

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

这是来自Collective Intelligence的书,第6章,文档过滤

没有原子的功能:

  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 

1 个答案:

答案 0 :(得分:1)

您的原始问题是由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是什么,但也不一定是原子。