;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; perceptron learning - single-layer neural networks
;;; make-perceptron returns a one-layer network with m units, n inputs each
(defun make-perceptron (n m &optional (g #'(lambda (i) (step-function 0 i)))
&aux (l nil))
(dotimes (i m (list l))
(push (make-unit :parents (iota (1+ n))
:children nil
:weights (random-weights (1+ n) -0.5 +0.5)
:g g)
l)))
(defun majority-perceptron (n &optional (g #'(lambda (i) (step-function 0 i))))
(list (list (make-unit :parents (iota (1+ n))
:children nil
:weights (cons (/ n 4)
(make-list n :initial-element 0.5))
:g g))))
;;; perceptron-learning is the standard "induction algorithm"
;;; and interfaces to the learning-curve functions
(defun perceptron-learning (problem)
(nn-learning problem
(make-perceptron
(length (learning-problem-attributes problem))
(length (learning-problem-goals problem)))
#'perceptron-update))
;;; Perceptron updating - simple version without lower bound on delta
;;; Hertz, Krogh, and Palmer, eq. 5.19 (p.97)
(defun perceptron-update (perceptron actual-inputs predicted target
&optional (learning-rate 0.1)
&aux (all-inputs (cons -1 actual-inputs)))
(mapc #'(lambda (unit predicted-i target-i)
(mapl #'(lambda (weights inputs)
(incf (car weights)
(* learning-rate
(- target-i predicted-i)
(car inputs))))
(unit-weights unit) all-inputs))
(car perceptron) predicted target)
perceptron)