User:Sethalves/scheme-perceptron
Jump to navigation
Jump to search
#!/usr/bin/guile \
--debug -s
!#
(use-modules (ice-9 format))
(define (dot-product v0 v1)
(apply + (map (lambda (m0 m1) (* m0 m1)) v0 v1)))
(define (sigmoid beta x)
;; sigmoid (beta, x) = 1/(1+e^(-beta*x))
(/ 1.0 (+ 1.0 (exp (* x (- 0.0 beta))))))
(define (sigmoid-1 x)
(sigmoid 1.0 x))
(define (perceptron)
(let ((inputs (list (list 1 0 0) (list 1 0 1) (list 1 1 0) (list 1 1 1)))
(answers (list 1 1 1 0))
(weights (list 0.0 0.0 0.0)))
(format #t "inputs : ~a~%" inputs)
(format #t "answers : ~a~%" answers)
(format #t "starting weights : ~a~%" weights)
(format #t "ending weights : ~a~%"
(mainfunc inputs answers weights))
))
(define (mainfunc inputs answers weights)
;; (format #t "weights : ~a~%" weights)
(let ((checked (check-all-inputs inputs weights answers)))
(if (equal? checked weights)
weights
(mainfunc inputs answers checked))))
(define (check-all-inputs inputs weights answers)
(let loop ((inputs inputs)
(weights weights)
(answers answers))
(if (null? inputs) weights
(loop (cdr inputs)
(adjust-weights (car inputs) weights (car answers))
(cdr answers)))))
(define (adjust-weights inputs weights answer)
(let* ((got (sigmoid-1 (dot-product inputs weights)))
(err (- answer got)))
(map (lambda (input weight)
(* (+ weight (* err 0.1)) input))
inputs
weights)))
(perceptron)