Cumulative standard deviation: Difference between revisions

Content added Content deleted
(Emacs Lisp: Improve solutions)
Line 1,409: Line 1,409:
=={{header|Emacs Lisp}}==
=={{header|Emacs Lisp}}==


<lang lisp>(defun running-std (items)
This implementation uses a temporary buffer (the central data structure of emacs) to have simple local variables.
(let ((running-sum 0)
(running-len 0)
(running-squared-sum 0)
(result 0))
(dolist (item items)
(setq running-sum (+ running-sum item))
(setq running-len (1+ running-len))
(setq running-squared-sum (+ running-squared-sum (* item item)))
(setq result (sqrt (- (/ running-squared-sum (float running-len))
(/ (* running-sum running-sum)
(float (* running-len running-len))))))
(message "%f" result))
result))


<lang lisp>(defun running-std (x)
(running-std '(2 4 4 4 5 5 7 9))</lang>
; ensure that we have a float to avoid potential integer math errors.
(setq x (float x))
; define variables to use
(defvar running-sum 0 "the running sum of all known values")
(defvar running-len 0 "the running number of all known values")
(defvar running-squared-sum 0 "the running squared sum of all known values")
; and make them local to this buffer
(make-local-variable 'running-sum)
(make-local-variable 'running-len)
(make-local-variable 'running-squared-sum)
; now process the new value
(setq running-sum (+ running-sum x))
(setq running-len (1+ running-len))
(setq running-squared-sum (+ running-squared-sum (* x x)))
; and calculate the new standard deviation
(sqrt (- (/ running-squared-sum
running-len) (/ (* running-sum running-sum)
(* running-len running-len )))))</lang>


{{out}}
<lang lisp>(with-temp-buffer
(loop for i in '(2 4 4 4 5 5 7 9) do
(insert (number-to-string (running-std i)))
(newline))
(message (buffer-substring (point-min) (1- (point-max)))))


"0.0
0.000000
1.0
1.000000
0.942809
0.9428090415820636
0.866025
0.8660254037844386
0.979796
0.9797958971132716
1.0
1.000000
1.399708
1.399708424447531
2.000000
2.0"</lang>
2.0


{{libheader|Calc}}
Emacs Lisp with built-in Emacs Calc


<lang emacs-lisp>
<lang lisp>(let ((x '(2 4 4 4 5 5 7 9)))
(string-to-number (calc-eval "sqrt(vpvar($1))" nil (append '(vec) x))))</lang>
(setq x '[2 4 4 4 5 5 7 9])
(string-to-number (calc-eval (format "sqrt(vpvar(%s))" x)))</lang>


{{libheader|generator.el}}
Emacs Lisp with generator library (introduced in Emacs 25.1)


<lang emacs-lisp>
<lang lisp>;; lexical-binding: t
(require 'generator)
(require 'generator)

(setq lexical-binding t)
(iter-defun std-dev-gen (lst)
(iter-defun std-dev-gen (lst)
(let ((sum 0)
(let ((sum 0)
(avg 0)
(avg 0)
(tmp '())
(tmp '())
(std 0))
(std 0))
(dolist (i lst)
(dolist (i lst)
(setq i (float i))
(setq i (float i))
Line 1,469: Line 1,460:
(setq std 0)
(setq std 0)
(dolist (j tmp)
(dolist (j tmp)
(setq std (+ std (expt (- j avg) 2))))
(setq std (+ std (expt (- j avg) 2))))
(setq std (/ std (length tmp)))
(setq std (/ std (length tmp)))
(setq std (sqrt std))
(setq std (sqrt std))
Line 1,475: Line 1,466:


(let* ((test-data '(2 4 4 4 5 5 7 9))
(let* ((test-data '(2 4 4 4 5 5 7 9))
(generator (std-dev-gen test-data)))
(generator (std-dev-gen test-data)))
(dolist (i test-data)
(dolist (i test-data)
(princ (format "with %d : " i))
(message "with %d: %f" i (iter-next generator))))</lang>
(princ (format "%f\n" (iter-next generator))))) </lang>


=={{header|Erlang}}==
=={{header|Erlang}}==