我一直在尝试实现垃圾邮件分类器。我编写了一个函数来获得一定的概率,但是当我用两个参数调用该函数时,我得到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
答案 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
是什么,但也不一定是原子。