(Arne Babenhauserheide)
2016-11-25: example/ensemble-estimation.w: setup ensemble deviations from example/ensemble-estimation.w: setup ensemble deviations from covariance matrix
diff --git a/examples/cholesky.w b/examples/cholesky.w
--- a/examples/cholesky.w
+++ b/examples/cholesky.w
@@ -6,7 +6,7 @@ exec guile -L $(dirname $(dirname $(real
;; Cholesky decomposition, following https://de.wikipedia.org/wiki/Cholesky-Zerlegung#Pseudocode
define-module : examples cholesky
- . #:export : cholesky!
+ . #:export : cholesky! matrix-ref matrix-set! matrix-transpose matrix-multiply
use-modules : srfi srfi-42
diff --git a/examples/ensemble-estimation.w b/examples/ensemble-estimation.w
--- a/examples/ensemble-estimation.w
+++ b/examples/ensemble-estimation.w
@@ -1,7 +1,7 @@
#!/usr/bin/env sh
# -*- wisp -*-
guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
-exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples ensemble-estimation) main)' -s "$0" "$@"
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples ensemble-estimation) main)' -l $(dirname $(realpath "$0"))/cholesky.w -s "$0" "$@"
; !#
;; Simple Ensemble Square Root Filter to estimate function parameters
@@ -37,6 +37,7 @@ define-module : examples ensemble-estima
use-modules : srfi srfi-42 ; list-ec
srfi srfi-9 ; records
oop goops ; generic functions
+ examples cholesky ; cholesky! for random variables with covariance
use-modules
: ice-9 popen
. #:select : open-output-pipe close-pipe
@@ -73,6 +74,9 @@ define-method : list-ref (M <sparse-cova
list : list-ref trace i
list-tail zeros : + i 1
+define-generic length
+define-method : length (M <sparse-covariance-matrix>)
+ length : slot-ref M 'trace
define : make-covariance-matrix-from-standard-deviations stds
; make-diagonal-matrix-with-trace : map (lambda (x) (expt x 2)) stds
@@ -175,26 +179,38 @@ define R : make-covariance-matrix-from-s
;; The actual observations
;; define y⁰ : list-ec (: i y⁰-num) : + y⁰-mean : * y⁰-std : random:normal
+define : matrix-times-vector X y
+ . "Calculate the matrix product of X and Y"
+ list-ec (: row (length X))
+ sum-ec (: i (length y))
+ * : list-ref y i
+ list-ref (list-ref X row) i
+
define x^steps '()
define : EnSRT H x P y R y-pos N
- . "Observation function H, parameters x,
+ . "Observation function H, parameters x,
parameter-covariance P, observations y, observation covariance R
and number of ensemble members N.
Limitations: y is a single value. R and P are diagonal.
"
+ let*
+ : P_copy : list-ec (: j (length P)) : list-ec (: k (length (list-ref P j))) : list-ref (list-ref P j) k
+ L
+ cholesky! P_copy
let step
: observations-to-process y
observation-variances : list-ec (: i (length y)) : list-ref (list-ref R i) i
observation-positions y-pos
x^b x
- x-deviations
+ x-deviations ; multiply the sqrt of P (L with LLt=P) with a vector with random perturbations
list-ec (: i N)
- list-ec (: j (length x))
+ matrix-times-vector L
+ list-ec (: j (length x))
* : random:normal
- sqrt : list-ref (list-ref P j) j ; only for diagonal P!
+ . 1 ; sqrt : list-ref (list-ref P j) j ; only for diagonal P!
set! x^steps : cons x-deviations x^steps
cond
: null? observations-to-process