2010年5月29日土曜日

Perceptron Common Lisp

The algorithm:


(defun g (sum)
(if (> sum 0) 1 0))

(defun perceptron-predict (weights input g)
(mapcar #'(lambda (weights-k) (funcall g (reduce #'+ (mapcar #'* weights-k input)))) weights))

(defun perceptron-training-step (weights input target eta g)
(let ((ys (perceptron-predict weights input g)))
(mapcar #'(lambda (w_i_k y_k t_k)
(mapcar #'(lambda (w x) (+ w (* eta (- t_k y_k) x))) w_i_k input))
weights ys target)))

(defun perceptron-train (weights inputs targets eta g max-iteration)
(format t "~A~%" (mapcar #'(lambda (input) (perceptron-predict weights input g)) inputs))
(let ((new-weights
(reduce #'(lambda (w input-target)
(perceptron-training-step w (first input-target) (second input-target) eta g))
(mapcar #'list inputs targets) :initial-value weights)))
(format t "ITERATION: ~A / (max iterations: ~A)~%" new-weights max-iteration)
(if (or (< max-iteration 2) (equal weights new-weights))
(progn
(format t "~A~%" (mapcar #'(lambda (input) (perceptron-predict new-weights input g)) inputs))
new-weights)
(perceptron-train new-weights inputs targets eta g (- max-iteration 1)))))


Run on OR:


* (perceptron-train '((3 2 1)) '((-1 0 0) (-1 0 1) (-1 1 0) (-1 1 1)) '((0) (1) (1) (1)) 0.25 #'g 10)

((0) (0) (0) (0))
ITERATION: ((2.5 2.25 1.25)) / (max iterations: 10)
((0) (0) (0) (1))
ITERATION: ((2.0 2.5 1.5)) / (max iterations: 9)
((0) (0) (1) (1))
ITERATION: ((1.75 2.5 1.75)) / (max iterations: 8)
((0) (0) (1) (1))
ITERATION: ((1.5 2.5 2.0)) / (max iterations: 7)
((0) (1) (1) (1))
ITERATION: ((1.5 2.5 2.0)) / (max iterations: 6)
((0) (1) (1) (1))
((1.5 2.5 2.0))


Run on XOR:


* (perceptron-train '((3 2 1)) '((-1 0 0) (-1 0 1) (-1 1 0) (-1 1 1)) '((0) (1) (1) (0)) 0.25 #'g 10)

((0) (0) (0) (0))
ITERATION: ((2.75 2.0 1.0)) / (max iterations: 10)
((0) (0) (0) (1))
ITERATION: ((2.5 2.0 1.0)) / (max iterations: 9)
((0) (0) (0) (1))
ITERATION: ((2.25 2.0 1.0)) / (max iterations: 8)
((0) (0) (0) (1))
ITERATION: ((2.0 2.0 1.0)) / (max iterations: 7)
((0) (0) (0) (1))
ITERATION: ((2.0 1.75 1.0)) / (max iterations: 6)
((0) (0) (0) (1))
ITERATION: ((1.75 1.75 1.0)) / (max iterations: 5)
((0) (0) (0) (1))
ITERATION: ((1.75 1.5 1.0)) / (max iterations: 4)
((0) (0) (0) (1))
ITERATION: ((1.5 1.5 1.0)) / (max iterations: 3)
((0) (0) (0) (1))
ITERATION: ((1.5 1.25 1.0)) / (max iterations: 2)
((0) (0) (0) (1))
ITERATION: ((1.25 1.25 1.0)) / (max iterations: 1)
((0) (0) (0) (1))
((1.25 1.25 1.0))

0 件のコメント:

コメントを投稿

フォロワー