Cumulative standard deviation: Difference between revisions
Content added Content deleted
ReeceGoding (talk | contribs) m (→"Running" SD) |
(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. |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
(dolist (item items) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
(setq result (sqrt (- (/ running-squared-sum (float running-len)) |
|||
⚫ | |||
(float (* running-len running-len)))))) |
|||
(message "%f" result)) |
|||
result)) |
|||
(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) |
|||
⚫ | |||
; now process the new value |
|||
⚫ | |||
⚫ | |||
⚫ | |||
; and calculate the new standard deviation |
|||
⚫ | |||
⚫ | |||
⚫ | |||
{{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))) |
|||
⚫ | |||
(message (buffer-substring (point-min) (1- (point-max))))) |
|||
0.000000 |
|||
1. |
1.000000 |
||
0.942809 |
|||
0.9428090415820636 |
|||
0.866025 |
|||
0.8660254037844386 |
|||
0.979796 |
|||
0.9797958971132716 |
|||
1. |
1.000000 |
||
1.399708 |
|||
1.399708424447531 |
|||
2.000000 |
|||
2.0"</lang> |
|||
2.0 |
|||
{{libheader|Calc}} |
|||
Emacs Lisp with built-in Emacs Calc |
|||
<lang |
<lang lisp>(let ((x '(2 4 4 4 5 5 7 9))) |
||
⚫ | |||
(setq x '[2 4 4 4 5 5 7 9]) |
|||
⚫ | |||
{{libheader|generator.el}} |
|||
Emacs Lisp with generator library (introduced in Emacs 25.1) |
|||
<lang |
<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) |
|||
(tmp '()) |
|||
(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 (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) |
||
( |
(message "with %d: %f" i (iter-next generator))))</lang> |
||
(princ (format "%f\n" (iter-next generator))))) </lang> |
|||
=={{header|Erlang}}== |
=={{header|Erlang}}== |