rlm@10
|
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
rlm@10
|
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
rlm@10
|
3 ;;
|
rlm@10
|
4 ;; Monte-Carlo application examples
|
rlm@10
|
5 ;;
|
rlm@10
|
6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
rlm@10
|
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
rlm@10
|
8
|
rlm@10
|
9 (ns
|
rlm@10
|
10 #^{:author "Konrad Hinsen"
|
rlm@10
|
11 :skip-wiki true
|
rlm@10
|
12 :doc "Examples for monte carlo methods"}
|
rlm@10
|
13 clojure.contrib.probabilities.random.examples-monte-carlo
|
rlm@10
|
14 (:require [clojure.contrib.generic.collection :as gc])
|
rlm@10
|
15 (:use [clojure.contrib.probabilities.random-numbers
|
rlm@10
|
16 :only (lcg rand-stream)])
|
rlm@10
|
17 (:use [clojure.contrib.probabilities.finite-distributions
|
rlm@10
|
18 :only (uniform)])
|
rlm@10
|
19 (:use [clojure.contrib.probabilities.monte-carlo
|
rlm@10
|
20 :only (random-stream discrete interval normal lognormal exponential
|
rlm@10
|
21 n-sphere
|
rlm@10
|
22 sample sample-sum sample-mean sample-mean-variance)]
|
rlm@10
|
23 :reload)
|
rlm@10
|
24 (:use [clojure.contrib.monads
|
rlm@10
|
25 :only (domonad state-m)]))
|
rlm@10
|
26
|
rlm@10
|
27 ; Create a linear congruential generator
|
rlm@10
|
28 (def urng (lcg 259200 7141 54773 1))
|
rlm@10
|
29
|
rlm@10
|
30 ;; Use Clojure's built-in random number generator
|
rlm@10
|
31 ;(def urng rand-stream)
|
rlm@10
|
32
|
rlm@10
|
33 ; Sample transformed distributions
|
rlm@10
|
34 (defn sample-distribution
|
rlm@10
|
35 [n rt]
|
rlm@10
|
36 (take n (gc/seq (random-stream rt urng))))
|
rlm@10
|
37
|
rlm@10
|
38 ; Interval [-2, 2)
|
rlm@10
|
39 (sample-distribution 10 (interval -2 2))
|
rlm@10
|
40 ; Compare with a direct transformation
|
rlm@10
|
41 (= (sample-distribution 10 (interval -2 2))
|
rlm@10
|
42 (map (fn [x] (- (* 4 x) 2)) (take 10 (gc/seq urng))))
|
rlm@10
|
43
|
rlm@10
|
44 ; Normal distribution
|
rlm@10
|
45 (sample-distribution 10 (normal 0 1))
|
rlm@10
|
46
|
rlm@10
|
47 ; Log-Normal distribution
|
rlm@10
|
48 (sample-distribution 10 (lognormal 0 1))
|
rlm@10
|
49
|
rlm@10
|
50 ; Exponential distribution
|
rlm@10
|
51 (sample-distribution 10 (exponential 1))
|
rlm@10
|
52
|
rlm@10
|
53 ; n-sphere distribution
|
rlm@10
|
54 (sample-distribution 10 (n-sphere 2 1))
|
rlm@10
|
55
|
rlm@10
|
56 ; Discrete distribution
|
rlm@10
|
57 (sample-distribution 10 (discrete (uniform (range 1 7))))
|
rlm@10
|
58
|
rlm@10
|
59 ; Compose distributions in the state monad
|
rlm@10
|
60 (def sum-two-dists
|
rlm@10
|
61 (domonad state-m
|
rlm@10
|
62 [r1 (interval -2 2)
|
rlm@10
|
63 r2 (normal 0 1)]
|
rlm@10
|
64 (+ r1 r2)))
|
rlm@10
|
65
|
rlm@10
|
66 (sample-distribution 10 sum-two-dists)
|
rlm@10
|
67
|
rlm@10
|
68 ; Distribution transformations
|
rlm@10
|
69 (sample-distribution 5 (sample 2 (interval -2 2)))
|
rlm@10
|
70 (sample-distribution 10 (sample-sum 10 (interval -2 2)))
|
rlm@10
|
71 (sample-distribution 10 (sample-mean 10 (interval -2 2)))
|
rlm@10
|
72 (sample-distribution 10 (sample-mean-variance 10 (interval -2 2)))
|
rlm@10
|
73
|