カタベログ

IT技術に関するブログを書きたい.食べ物関連はInstagramをご参照の事.

Clojure始めました

ClojureJVM上で動くLISP方言です.関数型言語を触ろうと思い立ち,いろいろ足りない頭で考えた結果,Clojureを触ろうってなった感じです.

いろいろなWebサイトやブログのエントリを見ながら,Clojure入れて,Clojure-contrib入れて,Emacs用にClojure-mode,Swank-Clojure,SLIME入れてとやってました.
しかしSLIMEは上手く動いてくれませんし,REPLも起動前に例外投げて起動しないことも有ります.マジ俺涙目.

想像力を母体に置き去りにしてしまった自分は,自分で問題設定して新しい言語を触ってみるなんて芸当が出来ません.
なので,学校で出たプログラミングを伴う課題をClojureで解いてみました.

;;Simple Perceptron Program
;;2012/01/13
(use 'clojure.contrib.math)

(defn staircase-function [var]
  (if (> var 0)
    1
    0))

(defn sgn [var]
  (if (> var 0)
    1
    (if (= var 0)
      0
      -1)))

(defn learning-theta [lambda sig_t sig_s]
  (* lambda (* sig_t (* (staircase-function (* (- sig_t) sig_s))))))

(defn main [th_ast l0]
  (loop [t 0 th (rand)]
    (let [x (rand) l l0]
      (print t  "\t" th "\t" l "\t" (expt (- th_ast th) 2) "\n")
      (if (and (< (- th_ast th) 0.001) (> (- th_ast th) -0.0001))
        th
        (recur (inc t)
               (+ th (learning-theta l (sgn (- th_ast x)) (sgn (- th x)))))))))

(def theta 0.5)
(def lambda-zero 0.0001)

(main theta lambda-zero)

これと

(use 'clojure.contrib.math)

(defn staircase-function [var]
  (if (> var 0)
    1
    0))

(defn sgn [var]
  (if (> var 0)
    1
    (if (= var 0)
      0
      -1)))

(defn attenuation-function [l0 a t]
  (* l0 (. Math (exp (* (- a) t)))))

(defn learning-theta [lambda sig_t sig_s]
  (* lambda (* sig_t (* (staircase-function (* (- sig_t) sig_s))))))

(defn main [th_ast l0]
  (loop [t 0 th (rand)]
    (let [x (rand) l (attenuation-function l0 0.001 t)]
      (print t  "\t" th "\t" l "\t" (expt (- th_ast th) 2) "\n")
      (if (and (< (- th_ast th) 0.001) (> (- th_ast th) -0.001))
        th
        (recur (inc t)
               (+ th (learning-theta l (sgn (- th_ast x)) (sgn (- th x)))))))))

(def theta 0.5)
(def lambda-zero 0.99)

(main theta lambda-zero)

これです.
とてもシンプルなパーセプトロンです.前者は学習率係数が固定で後者が減衰型です.
慣れてしまえば結構面白いものだなー.