В настоящее время я изучаю этот алгоритм для байесовской классификации, и когда я пытался следовать примеру в книге, я получил эти странные результаты, которые не были краткими с примерами в книге ,Байесовская классификация, пример из Clojure для машинного обучения
Я не думаю, что мой код не так (потому что я в основном скопированы его вручную), но я до сих пор получить результаты в РЕПЛ что невозможно, например, как:
> (+ (evidence-of-sea-bass) (evidence-of-salmon))
==> 2.8139728009700775
Он должен вернуть 1.000 ... с небольшой ошибкой точности с плавающей запятой.
Вот код:
(defn make-sea-bass []
#{:sea-bass
(if (< (rand) 0.2) :fat :thin)
(if (< (rand) 0.7) :long :short)
(if (< (rand) 0.8) :light :dark)})
(defn make-salmon []
#{:salmon
(if (< (rand) 0.8) :fat :thin)
(if (< (rand) 0.5) :long :short)
(if (< (rand) 0.3) :light :dark)})
(defn make-sample-fish []
(if (< (rand) 0.3) (make-sea-bass) (make-salmon)))
(def fish-training-data
(for [i (range 10000)] (make-sample-fish)))
(defn probability
[attribute & {:keys
[category prior-positive prior-negative data]
:or {category nil
data fish-training-data}}]
(let [by-category (if category
(filter category data)
data)
positive (count (filter attribute by-category))
negative (- (count by-category) positive)
total (+ positive negative)]
(/ positive negative)))
(defn evidence-of-salmon [& attrs]
(let [attr-prob (map #(probability % :category :salmon) attrs)
class-and-attr-prob (conj attr-prob (probability :salmon))]
(float (apply * class-and-attr-prob))))
(defn evidence-of-sea-bass [& attrs]
(let [attr-prob (map #(probability % :category :sea-bass) attrs)
class-and-attr-prob (conj attr-prob (probability :sea-bass))]
(float (apply * class-and-attr-prob))))
Ниццы спасибо :) Я предполагаю, что я слепо принял автор представить правильные и связанный код с примерами .. –