[Larceny-users] Request for implementation

Philippos Apolinarius phi500ac at yahoo.ca
Wed May 6 03:02:54 EDT 2009


When I compare Larceny with other Scheme implementations, I notice that it excells exactly in that kind of programs that make people choose a Lisp dialect over other languages: Machine learning and induction. For instance, I wrote a neural network in Scheme that is used in a pattern recognition system written by Professor Marcus Vinicius from Ryerson University (Toronto) and Paulo Caparelli from UFU (Uberlandia). Larceny runs it as fast as compiled Gambit, but does not require a (slow) compilation step. However, Gambit has a feature that final users find very attractive: It provides a quite complete conventional language, with infix notation, and the like. Even doctors and nurses are able to modify the Gambit program, once they learn the language.

 I believe that Larceny with its interpreter-like compilation is better than Gambit for implementing neural networks, genetic algorithms and other trainable systems. However, final users likes so much the Gambit Matlab-like notation that they pratically force me to write the programs in Gambit.  Therefore, I would like to suggest a Gambit-like infix notation for Larceny. It would be great if Larceny team could provide complete compatibility with Gambit. By the way, I am sending a simplified version of my Larceny neural network so people can compare Larceny with Gambit. To run it in Larceny, type:

> (load "larcenet.scm")

> (train xor *exs* )

> (xor '(1 1))
0.01259132904526414

> (xor '(1 0))
0.9889715928565634

> (xor '(0 1))
0.9889715928640815

> (xor '(0 0))
0.009909459444548928

To run it in Gambit, comment the line
;;(load "ec.scm")
and uncomment
(include "ec.scm")  ;; and uncomment this one


Here is how to compile the program in Gambit:

C:\larceny\tutorial>gsc -:s larcenet.scm

C:\larceny\tutorial>gsc
Gambit v4.4.2

> (load "larcenet.o1")
"C:\\larceny\\tutorial\\larcenet.o1"
> (train xor *exs*)


========== The Program ================


;; Larceny version.
;; This program is part of a pattern recognition
;; system that drives a wheel-chair for quadriplegic
;; people: www.ciaem.org.br/ciaem.qps/Ref/QUIS-7GJP7J
;; A description of the complete system, written in 
;; Scheme by Philippos, will be published in a paper
;; by Marcus Vinicius dos Santos, that can be reached
;; at web.mac.com/marcusvsantos/iWeb/Site/About%20Me.html
;; The wheel chair learns how to recognize EMG signals
;; from facial muscles. A neural network recognizes
;; the coeficients of a polynomial approximation of
;; the signal, and drives the chair accordingly.
;; The chair will be available soon, although the
;; pattern recognition version needs a special
;; order, and user training. This Larceny version
;; is not used in the chair prototype.
;; Store in file larcenet.scm

(load "ec.scm") ;; To compile in Gambit, comment this line
;;(include "ec.scm")  ;; and uncomment this one


;; In Gambit, the sigmoid function is defined thus:
;; \float sig(float x) {1.0/(1.0+exp(-x));}

(define (sig x)
   (/ 1.0 (+ 1.0 (exp (- x)) )))

(define (newn v ws)
   (lambda(xs)
     (sig (sum-ec (:parallel 
                       (:list i ws)
                       (:list x (cons 1.0 xs)))
                (* (vector-ref v i) x) ))  ))      ;; Gambit: \v[i]*x;  

(define in-1 car)
(define in-2 cadr)

(define (gate vt)
 (let [ (n1 (newn vt '(4 5 6)) ) 
        (ns (newn vt '(0 1 2 3)))]
     (lambda (i)
       (if (null? i) vt
          (ns (list (in-1 i) 
                    (n1 (list (in-1 i) (in-2 i))) 
                    (in-2 i)  )))   )))

;; Here is how to create a xor neural network:

(define xor (gate (vector -4 -7 14 -7 -3 8 8)))


(define dx 0.01)
(define lc 0.5)

(define *nuweights*  (make-vector 90)  )
(define *examples* #f)

(define (assertWgt vt I R)
   (vector-set! vt I R)   R)

(define (egratia eg) 
   (vector-ref *examples* 
     (min eg (- (vector-length *examples*) 1)) ))   
           
(define (setWeights vt Qs)
  (do-ec (:range i (vector-length vt))
      (vector-set! vt i 
         (vector-ref Qs i)) ) )
         
(define (errSum prt Exs)
  (sum-ec (:list e Exs) 
     (:let eg (egratia e))
     (:let vc (prt (cdr eg)  ))
     (:let v (car eg) )
       (* (- vc v) (- vc v)) ) )

(define (updateWeights prt vt err0  ns Exs)
  [do-ec (:range i (+ ns 1))
      (:let v (vector-ref vt i))
      (:let v1 (assertWgt vt i  (+ v dx))) 
      (:let nerr (errSum prt Exs)) 
      (:let nv  (+ v (/ (* lc (- err0 nerr)) dx)) )  ;; Gambit:  \v+lc*(err0-nerr)/dx; 
      (begin (assertWgt vt i v)
            (vector-set! *nuweights* i nv)   ) ]
  (setWeights vt *nuweights*) )
 
(define (train p exs)   
   (set! *examples* exs )
   (set! *nuweights* (make-vector 90)) 
   (setWeights  (p '()) '#(0 1 0 0 2 0 0))
   (do ( (vt (p '())) 
         (exs '(0 1 2 3 3 2 1 0)) )
      ( (< (errSum p exs) 0.001) )
      (updateWeights p vt (errSum p exs) 
                        (- (vector-length vt) 1) exs)  ) )

(define *exs* 
   '#( (0 1 1) (1 0 1) (1 1 0) (0 0 0)) )

;;(training xor '( (0 1 1) (1 1 0) (1 0 1) (0 0 0)) )







      __________________________________________________________________
Connect with friends from any web browser - no download required. Try the new Yahoo! Canada Messenger for the Web BETA at http://ca.messenger.yahoo.com/webmessengerpromo.php
-------------- next part --------------
HTML attachment scrubbed and removed


More information about the Larceny-users mailing list