Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@djpowell
Created November 11, 2010 14:53
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save djpowell/672592 to your computer and use it in GitHub Desktop.
Save djpowell/672592 to your computer and use it in GitHub Desktop.
fingertree stats
(ns finger-tree-stats
(:use [clojure.data.finger-tree]))
(defrecord stats [^double number ^double mean ^double variance])
(def null-stats (stats. 0 0 Double/NaN))
(defn make-stats
[^double x]
(stats. 1 x 0))
(defn combine-stats
[nmv1 nmv2]
(let [{n1 :number m1 :mean v1 :variance} nmv1
{n2 :number m2 :mean v2 :variance} nmv2]
(cond
(== n2 0) nmv1
(== n1 0) nmv2
:else
(let [delta (- m2 m1)]
(stats.
(+ n1 n2)
(/ (+ (* n1 m1) (* n2 m2)) (+ n1 n2))
(+ v1 v2 (/ (* delta delta n1 n2) (+ n1 n2))))))))
(def empty-stats-tree (finger-tree (meter make-stats null-stats combine-stats)))
; test
(def st (into empty-stats-tree [9.0 3.0 4.0 5.0 1.0 1.0 1.0 0.0 99.0 99.0]))
(println st)
(println (measured st))
(println (measured (pop (rest st))))
@djpowell
Copy link
Author

Compute statistics using a finger-tree.
Based on: http://blog.sigfpe.com/2010/11/statistical-fingertrees.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment