Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,3 @@
---
from: http://rosettacode.org/wiki/Cumulative_standard_deviation
note: Probability and statistics

View file

@ -0,0 +1,21 @@
{{task heading}}
Write a stateful function, class, generator or co-routine that takes a series of floating point numbers, ''one at a time'', and returns the running [[wp:Standard Deviation|standard deviation]] of the series.
The task implementation should use the most natural programming style of those listed for the function in the implementation language; the task ''must'' state which is being used.
Do not apply [[wp:Bessel's correction|Bessel's correction]]; the returned standard deviation should always be computed as if the sample seen so far is the entire population.
;Test case:
Use this to compute the standard deviation of this demonstration set, <math>\{2, 4, 4, 4, 5, 5, 7, 9\}</math>, which is <math>2</math>.
;Related tasks:
* [[Random numbers]]
{{Related tasks/Statistical measures}}
<hr>

View file

@ -0,0 +1,14 @@
T SD
sum = 0.0
sum2 = 0.0
n = 0.0
F ()(x)
.sum += x
.sum2 += x ^ 2
.n += 1.0
R sqrt(.sum2 / .n - (.sum / .n) ^ 2)
V sd_inst = SD()
L(value) [2, 4, 4, 4, 5, 5, 7, 9]
print(value sd_inst(value))

View file

@ -0,0 +1,102 @@
******** Standard deviation of a population
STDDEV CSECT
USING STDDEV,R13
SAVEAREA B STM-SAVEAREA(R15)
DC 17F'0'
DC CL8'STDDEV'
STM STM R14,R12,12(R13)
ST R13,4(R15)
ST R15,8(R13)
LR R13,R15
SR R8,R8 s=0
SR R9,R9 ss=0
SR R4,R4 i=0
LA R6,1
LH R7,N
LOOPI BXH R4,R6,ENDLOOPI
LR R1,R4 i
BCTR R1,0
SLA R1,1
LH R5,T(R1)
ST R5,WW ww=t(i)
MH R5,=H'1000' w=ww*1000
AR R8,R5 s=s+w
LR R15,R5
MR R14,R5 w*w
AR R9,R15 ss=ss+w*w
LR R14,R8 s
SRDA R14,32
DR R14,R4 /i
ST R15,AVG avg=s/i
LR R14,R9 ss
SRDA R14,32
DR R14,R4 ss/i
LR R2,R15 ss/i
LR R15,R8 s
MR R14,R8 s*s
LR R3,R15
LR R15,R4 i
MR R14,R4 i*i
LR R1,R15
LA R14,0
LR R15,R3
DR R14,R1 (s*s)/(i*i)
SR R2,R15
LR R10,R2 std=ss/i-(s*s)/(i*i)
LR R11,R10 std
SRA R11,1 x=std/2
LR R12,R10 px=std
LOOPWHIL EQU *
CR R12,R11 while px<>=x
BE ENDWHILE
LR R12,R11 px=x
LR R15,R10 std
LA R14,0
DR R14,R12 /px
LR R1,R12 px
AR R1,R15 px+std/px
SRA R1,1 /2
LR R11,R1 x=(px+std/px)/2
B LOOPWHIL
ENDWHILE EQU *
LR R10,R11
CVD R4,P8 i
MVC C17,MASK17
ED C17,P8
MVC BUF+2(1),C17+15
L R1,WW
CVD R1,P8
MVC C17,MASK17
ED C17,P8
MVC BUF+10(1),C17+15
L R1,AVG
CVD R1,P8
MVC C18,MASK18
ED C18,P8
MVC BUF+17(5),C18+12
CVD R10,P8 std
MVC C18,MASK18
ED C18,P8
MVC BUF+31(5),C18+12
WTO MF=(E,WTOMSG)
B LOOPI
ENDLOOPI EQU *
L R13,4(0,R13)
LM R14,R12,12(R13)
XR R15,R15
BR R14
DS 0D
N DC H'8'
T DC H'2',H'4',H'4',H'4',H'5',H'5',H'7',H'9'
WW DS F
AVG DS F
P8 DS PL8
MASK17 DC C' ',13X'20',X'2120',C'-'
MASK18 DC C' ',10X'20',X'2120',C'.',3X'20',C'-'
C17 DS CL17
C18 DS CL18
WTOMSG DS 0F
DC H'80',XL2'0000'
BUF DC CL80'N=1 ITEM=1 AVG=1.234 STDDEV=1.234 '
YREGS
END STDDEV

View file

@ -0,0 +1,52 @@
MODE VALUE = STRUCT(CHAR value),
STDDEV = STRUCT(CHAR stddev),
MEAN = STRUCT(CHAR mean),
VAR = STRUCT(CHAR var),
COUNT = STRUCT(CHAR count),
RESET = STRUCT(CHAR reset);
MODE ACTION = UNION ( VALUE, STDDEV, MEAN, VAR, COUNT, RESET );
LONG REAL sum := 0;
LONG REAL sum2 := 0;
INT num := 0;
PROC stat object = (LONG REAL v, ACTION action)LONG REAL:
(
LONG REAL m;
CASE action IN
(VALUE):(
num +:= 1;
sum +:= v;
sum2 +:= v*v;
stat object(0, LOC STDDEV)
),
(STDDEV):
long sqrt(stat object(0, LOC VAR)),
(MEAN):
IF num>0 THEN sum/LONG REAL(num) ELSE 0 FI,
(VAR):(
m := stat object(0, LOC MEAN);
IF num>0 THEN sum2/LONG REAL(num)-m*m ELSE 0 FI
),
(COUNT):
num,
(RESET):
sum := sum2 := num := 0
ESAC
);
[]LONG REAL v = ( 2,4,4,4,5,5,7,9 );
main:
(
LONG REAL sd;
FOR i FROM LWB v TO UPB v DO
sd := stat object(v[i], LOC VALUE);
printf(($"value: "g(0,6)," standard dev := "g(0,6)l$, v[i], sd))
OD
)

View file

@ -0,0 +1,75 @@
MODE STAT = STRUCT(
LONG REAL sum,
LONG REAL sum2,
INT num
);
OP INIT = (REF STAT new)REF STAT:
(init OF class stat)(new);
MODE CLASSSTAT = STRUCT(
PROC (REF STAT, LONG REAL #value#)VOID plusab,
PROC (REF STAT)LONG REAL stddev, mean, variance, count,
PROC (REF STAT)REF STAT init
);
CLASSSTAT class stat;
plusab OF class stat := (REF STAT self, LONG REAL value)VOID:(
num OF self +:= 1;
sum OF self +:= value;
sum2 OF self +:= value*value
);
OP +:= = (REF STAT lhs, LONG REAL rhs)VOID: # some syntatic sugar #
(plusab OF class stat)(lhs, rhs);
stddev OF class stat := (REF STAT self)LONG REAL:
long sqrt((variance OF class stat)(self));
OP STDDEV = ([]LONG REAL value)LONG REAL: ( # more syntatic sugar #
REF STAT stat = INIT LOC STAT;
FOR i FROM LWB value TO UPB value DO
stat +:= value[i]
OD;
(stddev OF class stat)(stat)
);
mean OF class stat := (REF STAT self)LONG REAL:
sum OF self/LONG REAL(num OF self);
variance OF class stat := (REF STAT self)LONG REAL:(
LONG REAL m = (mean OF class stat)(self);
sum2 OF self/LONG REAL(num OF self)-m*m
);
count OF class stat := (REF STAT self)LONG REAL:
num OF self;
init OF class stat := (REF STAT self)REF STAT:(
sum OF self := sum2 OF self := num OF self := 0;
self
);
[]LONG REAL value = ( 2,4,4,4,5,5,7,9 );
main:
(
# printf(($"standard deviation operator = "g(0,6)l$, STDDEV value));
#
REF STAT stat = INIT LOC STAT;
FOR i FROM LWB value TO UPB value DO
stat +:= value[i];
printf(($"value: "g(0,6)," standard dev := "g(0,6)l$, value[i], (stddev OF class stat)(stat)))
OD
#
;
printf(($"standard deviation = "g(0,6)l$, (stddev OF class stat)(stat)));
printf(($"mean = "g(0,6)l$, (mean OF class stat)(stat)));
printf(($"variance = "g(0,6)l$, (variance OF class stat)(stat)));
printf(($"count = "g(0,6)l$, (count OF class stat)(stat)))
#
)

View file

@ -0,0 +1,16 @@
LONG REAL sum, sum2;
INT n;
PROC sd = (LONG REAL x)LONG REAL:(
sum +:= x;
sum2 +:= x*x;
n +:= 1;
IF n = 0 THEN 0 ELSE long sqrt(sum2/n - sum*sum/n/n) FI
);
sum := sum2 := n := 0;
[]LONG REAL values = (2,4,4,4,5,5,7,9);
FOR i TO UPB values DO
LONG REAL value = values[i];
printf(($2(xg(0,6))l$, value, sd(value)))
OD

View file

@ -0,0 +1,25 @@
begin
long real sum, sum2;
integer n;
long real procedure sd (long real value x) ;
begin
sum := sum + x;
sum2 := sum2 + (x*x);
n := n + 1;
if n = 0 then 0 else longsqrt(sum2/n - sum*sum/n/n)
end sd;
sum := sum2 := n := 0;
r_format := "A"; r_w := 14; r_d := 6; % set output to fixed point format %
for i := 2,4,4,4,5,5,7,9
do begin
long real val;
val := i;
write(val, sd(val))
end for_i
end.

View file

@ -0,0 +1,19 @@
# syntax: GAWK -f STANDARD_DEVIATION.AWK
BEGIN {
n = split("2,4,4,4,5,5,7,9",arr,",")
for (i=1; i<=n; i++) {
temp[i] = arr[i]
printf("%g %g\n",arr[i],stdev(temp))
}
exit(0)
}
function stdev(arr, i,n,s1,s2,variance,x) {
for (i in arr) {
n++
x = arr[i]
s1 += x ^ 2
s2 += x
}
variance = ((n * s1) - (s2 ^ 2)) / (n ^ 2)
return(sqrt(variance))
}

View file

@ -0,0 +1,46 @@
INCLUDE "H6:REALMATH.ACT"
REAL sum,sum2
INT count
PROC Calc(REAL POINTER x,sd)
REAL tmp1,tmp2,tmp3
RealAdd(sum,x,tmp1) ;tmp1=sum+x
RealAssign(tmp1,sum) ;sum=sum+x
RealMult(x,x,tmp1) ;tmp1=x*x
RealAdd(sum2,tmp1,tmp2) ;tmp2=sum2+x*x
RealAssign(tmp2,sum2) ;sum2=sum2+x*x
count==+1
IF count=0 THEN
IntToReal(0,sd) ;sd=0
ELSE
IntToReal(count,tmp1)
RealMult(sum,sum,tmp2) ;tmp2=sum*sum
RealDiv(tmp2,tmp1,tmp3) ;tmp3=sum*sum/count
RealDiv(tmp3,tmp1,tmp2) ;tmp2=sum*sum/count/count
RealDiv(sum2,tmp1,tmp3) ;tmp3=sum2/count
RealSub(tmp3,tmp2,tmp1) ;tmp1=sum2/count-sum*sum/count/count
Sqrt(tmp1,sd) ;sd=sqrt(sum2/count-sum*sum/count/count)
FI
RETURN
PROC Main()
INT ARRAY values=[2 4 4 4 5 5 7 9]
INT i
REAL x,sd
Put(125) PutE() ;clear screen
MathInit()
IntToReal(0,sum)
IntToReal(0,sum2)
count=0
FOR i=0 TO 7
DO
IntToReal(values(i),x)
Calc(x,sd)
Print("x=") PrintR(x)
Print(" sum=") PrintR(sum)
Print(" sd=") PrintRE(sd)
OD
RETURN

View file

@ -0,0 +1,35 @@
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Test_Deviation is
type Sample is record
N : Natural := 0;
Sum : Float := 0.0;
SumOfSquares : Float := 0.0;
end record;
procedure Add (Data : in out Sample; Point : Float) is
begin
Data.N := Data.N + 1;
Data.Sum := Data.Sum + Point;
Data.SumOfSquares := Data.SumOfSquares + Point ** 2;
end Add;
function Deviation (Data : Sample) return Float is
begin
return Sqrt (Data.SumOfSquares / Float (Data.N) - (Data.Sum / Float (Data.N)) ** 2);
end Deviation;
Data : Sample;
Test : array (1..8) of Integer := (2, 4, 4, 4, 5, 5, 7, 9);
begin
for Index in Test'Range loop
Add (Data, Float(Test(Index)));
Put("N="); Put(Item => Index, Width => 1);
Put(" ITEM="); Put(Item => Test(Index), Width => 1);
Put(" AVG="); Put(Item => Float(Data.Sum)/Float(Index), Fore => 1, Aft => 3, Exp => 0);
Put(" STDDEV="); Put(Item => Deviation (Data), Fore => 1, Aft => 3, Exp => 0);
New_line;
end loop;
end Test_Deviation;

View file

@ -0,0 +1,53 @@
-------------- CUMULATIVE STANDARD DEVIATION -------------
-- stdDevInc :: Accumulator -> Num -> Index -> Accumulator
-- stdDevInc :: {sum:, squaresSum:, stages:} -> Real -> Integer
-- -> {sum:, squaresSum:, stages:}
on stdDevInc(a, n, i)
set sum to (sum of a) + n
set squaresSum to (squaresSum of a) + (n ^ 2)
set stages to (stages of a) & ¬
((squaresSum / i) - ((sum / i) ^ 2)) ^ 0.5
{sum:(sum of a) + n, squaresSum:squaresSum, stages:stages}
end stdDevInc
--------------------------- TEST -------------------------
on run
set xs to [2, 4, 4, 4, 5, 5, 7, 9]
stages of foldl(stdDevInc, ¬
{sum:0, squaresSum:0, stages:[]}, xs)
--> {0.0, 1.0, 0.942809041582, 0.866025403784, 0.979795897113, 1.0, 1.399708424448, 2.0}
end run
-------------------- GENERIC FUNCTIONS -------------------
-- foldl :: (a -> b -> a) -> a -> [b] -> a
on foldl(f, startValue, xs)
tell mReturn(f)
set v to startValue
set lng to length of xs
repeat with i from 1 to lng
set v to |λ|(v, item i of xs, i, xs)
end repeat
return v
end tell
end foldl
-- mReturn :: First-class m => (a -> b) -> m (a -> b)
on mReturn(f)
-- 2nd class handler function lifted into 1st class script wrapper.
if script is class of f then
f
else
script
property |λ| : f
end script
end if
end mReturn

View file

@ -0,0 +1,2 @@
{0.0, 1.0, 0.942809041582, 0.866025403784,
0.979795897113, 1.0, 1.399708424448, 2.0}

View file

@ -0,0 +1,69 @@
-------------- CUMULATIVE STANDARD DEVIATION -------------
-- cumulativeStdDevns :: [Float] -> [Float]
on cumulativeStdDevns(xs)
script go
on |λ|(sq, x, i)
set {s, q} to sq
set _s to x + s
set _q to q + (x ^ 2)
{{_s, _q}, ((_q / i) - ((_s / i) ^ 2)) ^ 0.5}
end |λ|
end script
item 2 of mapAccumL(go, {0, 0}, xs)
end cumulativeStdDevns
--------------------------- TEST -------------------------
on run
cumulativeStdDevns({2, 4, 4, 4, 5, 5, 7, 9})
end run
------------------------- GENERIC ------------------------
-- foldl :: (a -> b -> a) -> a -> [b] -> a
on foldl(f, startValue, xs)
tell mReturn(f)
set v to startValue
set lng to length of xs
repeat with i from 1 to lng
set v to |λ|(v, item i of xs, i, xs)
end repeat
return v
end tell
end foldl
-- mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
on mapAccumL(f, acc, xs)
-- 'The mapAccumL function behaves like a combination of map and foldl;
-- it applies a function to each element of a list, passing an
-- accumulating parameter from |Left| to |Right|, and returning a final
-- value of this accumulator together with the new list.' (see Hoogle)
script
on |λ|(a, x, i)
tell mReturn(f) to set pair to |λ|(item 1 of a, x, i)
{item 1 of pair, (item 2 of a) & {item 2 of pair}}
end |λ|
end script
foldl(result, {acc, []}, xs)
end mapAccumL
-- mReturn :: First-class m => (a -> b) -> m (a -> b)
on mReturn(f)
-- 2nd class handler function lifted into 1st class script wrapper.
if script is class of f then
f
else
script
property |λ| : f
end script
end if
end mReturn

View file

@ -0,0 +1,5 @@
arr: new []
loop [2 4 4 4 5 5 7 9] 'value [
'arr ++ value
print [value "->" deviation arr]
]

View file

@ -0,0 +1,15 @@
Data := [2,4,4,4,5,5,7,9]
for k, v in Data {
FileAppend, % "#" a_index " value = " v " stddev = " stddev(v) "`n", * ; send to stdout
}
return
stddev(x) {
static n, sum, sum2
n++
sum += x
sum2 += x*x
return sqrt((sum2/n) - (((sum*sum)/n)/n))
}

View file

@ -0,0 +1,17 @@
)abbrev package TESTD TestDomain
TestDomain(T : Join(Field,RadicalCategory)): Exports == Implementation where
R ==> Record(n : Integer, sum : T, ssq : T)
Exports == AbelianMonoid with
_+ : (%,T) -> %
_+ : (T,%) -> %
sd : % -> T
Implementation == R add
Rep := R -- similar representation and implementation
obj : %
0 == [0,0,0]
obj + (obj2:%) == [obj.n + obj2.n, obj.sum + obj2.sum, obj.ssq + obj2.ssq]
obj + (x:T) == obj + [1, x, x*x]
(x:T) + obj == obj + x
sd obj ==
mean : T := obj.sum / (obj.n::T)
sqrt(obj.ssq / (obj.n::T) - mean*mean)

View file

@ -0,0 +1,14 @@
T ==> Expression Integer
D ==> TestDomain(T)
items := [2,4,4,4,5,5,7,9+x] :: List T;
map(sd, scan(+, items, 0$D))
+---------------+
+-+ +-+ +-+ +-+ | 2
2\|2 \|3 2\|6 4\|6 \|7x + 64x + 256
(1) [0,1,-----,----,-----,1,-----,------------------]
3 2 5 7 8
Type: List(Expression(Integer))
eval subst(last %,x=0)
(2) 2
Type: Expression(Integer)

View file

@ -0,0 +1,15 @@
MAXITEMS = 100
FOR i% = 1 TO 8
READ n
PRINT "Value = "; n ", running SD = " FNrunningsd(n)
NEXT
END
DATA 2,4,4,4,5,5,7,9
DEF FNrunningsd(n)
PRIVATE list(), i%
DIM list(MAXITEMS)
i% += 1
list(i%) = n
= SQR(MOD(list())^2/i% - (SUM(list())/i%)^2)

View file

@ -0,0 +1,39 @@
#include <assert.h>
#include <cmath>
#include <vector>
#include <iostream>
template<int N> struct MomentsAccumulator_
{
std::vector<double> m_;
MomentsAccumulator_() : m_(N + 1, 0.0) {}
void operator()(double v)
{
double inc = 1.0;
for (auto& mi : m_)
{
mi += inc;
inc *= v;
}
}
};
double Stdev(const std::vector<double>& moments)
{
assert(moments.size() > 2);
assert(moments[0] > 0.0);
const double mean = moments[1] / moments[0];
const double meanSquare = moments[2] / moments[0];
return sqrt(meanSquare - mean * mean);
}
int main(void)
{
std::vector<int> data({ 2, 4, 4, 4, 5, 5, 7, 9 });
MomentsAccumulator_<2> accum;
for (auto d : data)
{
accum(d);
std::cout << "Running stdev: " << Stdev(accum.m_) << "\n";
}
}

View file

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace standardDeviation
{
class Program
{
static void Main(string[] args)
{
List<double> nums = new List<double> { 2, 4, 4, 4, 5, 5, 7, 9 };
for (int i = 1; i <= nums.Count; i++)
Console.WriteLine(sdev(nums.GetRange(0, i)));
}
static double sdev(List<double> nums)
{
List<double> store = new List<double>();
foreach (double n in nums)
store.Add((n - nums.Average()) * (n - nums.Average()));
return Math.Sqrt(store.Sum() / store.Count);
}
}
}

View file

@ -0,0 +1,48 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef enum Action { STDDEV, MEAN, VAR, COUNT } Action;
typedef struct stat_obj_struct {
double sum, sum2;
size_t num;
Action action;
} sStatObject, *StatObject;
StatObject NewStatObject( Action action )
{
StatObject so;
so = malloc(sizeof(sStatObject));
so->sum = 0.0;
so->sum2 = 0.0;
so->num = 0;
so->action = action;
return so;
}
#define FREE_STAT_OBJECT(so) \
free(so); so = NULL
double stat_obj_value(StatObject so, Action action)
{
double num, mean, var, stddev;
if (so->num == 0.0) return 0.0;
num = so->num;
if (action==COUNT) return num;
mean = so->sum/num;
if (action==MEAN) return mean;
var = so->sum2/num - mean*mean;
if (action==VAR) return var;
stddev = sqrt(var);
if (action==STDDEV) return stddev;
return 0;
}
double stat_object_add(StatObject so, double v)
{
so->num++;
so->sum += v;
so->sum2 += v*v;
return stat_obj_value(so, so->action);
}

View file

@ -0,0 +1,13 @@
double v[] = { 2,4,4,4,5,5,7,9 };
int main()
{
int i;
StatObject so = NewStatObject( STDDEV );
for(i=0; i < sizeof(v)/sizeof(double) ; i++)
printf("val: %lf std dev: %lf\n", v[i], stat_object_add(so, v[i]));
FREE_STAT_OBJECT(so);
return 0;
}

View file

@ -0,0 +1,71 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. run-stddev.
environment division.
input-output section.
file-control.
select input-file assign to "input.txt"
organization is line sequential.
data division.
file section.
fd input-file.
01 inp-record.
03 inp-fld pic 9(03).
working-storage section.
01 filler pic 9(01) value 0.
88 no-more-input value 1.
01 ws-tb-data.
03 ws-tb-size pic 9(03).
03 ws-tb-table.
05 ws-tb-fld pic s9(05)v9999 comp-3 occurs 0 to 100 times
depending on ws-tb-size.
01 ws-stddev pic s9(05)v9999 comp-3.
PROCEDURE DIVISION.
move 0 to ws-tb-size
open input input-file
read input-file
at end
set no-more-input to true
end-read
perform
test after
until no-more-input
add 1 to ws-tb-size
move inp-fld to ws-tb-fld (ws-tb-size)
call 'stddev' using by reference ws-tb-data
ws-stddev
display 'inp=' inp-fld ' stddev=' ws-stddev
read input-file at end set no-more-input to true end-read
end-perform
close input-file
stop run.
end program run-stddev.
IDENTIFICATION DIVISION.
PROGRAM-ID. stddev.
data division.
working-storage section.
01 ws-tbx pic s9(03) comp.
01 ws-tb-work.
03 ws-sum pic s9(05)v9999 comp-3 value +0.
03 ws-sumsq pic s9(05)v9999 comp-3 value +0.
03 ws-avg pic s9(05)v9999 comp-3 value +0.
linkage section.
01 ws-tb-data.
03 ws-tb-size pic 9(03).
03 ws-tb-table.
05 ws-tb-fld pic s9(05)v9999 comp-3 occurs 0 to 100 times
depending on ws-tb-size.
01 ws-stddev pic s9(05)v9999 comp-3.
PROCEDURE DIVISION using ws-tb-data ws-stddev.
compute ws-sum = 0
perform test before varying ws-tbx from 1 by +1 until ws-tbx > ws-tb-size
compute ws-sum = ws-sum + ws-tb-fld (ws-tbx)
end-perform
compute ws-avg rounded = ws-sum / ws-tb-size
compute ws-sumsq = 0
perform test before varying ws-tbx from 1 by +1 until ws-tbx > ws-tb-size
compute ws-sumsq = ws-sumsq
+ (ws-tb-fld (ws-tbx) - ws-avg) ** 2.0
end-perform
compute ws-stddev = ( ws-sumsq / ws-tb-size) ** 0.5
goback.
end program stddev.

View file

@ -0,0 +1,9 @@
sample output:
inp=002 stddev=+00000.0000
inp=004 stddev=+00001.0000
inp=004 stddev=+00000.9427
inp=004 stddev=+00000.8660
inp=005 stddev=+00000.9797
inp=005 stddev=+00001.0000
inp=007 stddev=+00001.3996
inp=009 stddev=+00002.0000

View file

@ -0,0 +1,9 @@
(defn stateful-std-deviation[x]
(letfn [(std-dev[x]
(let [v (deref (find-var (symbol (str *ns* "/v"))))]
(swap! v conj x)
(let [m (/ (reduce + @v) (count @v))]
(Math/sqrt (/ (reduce + (map #(* (- m %) (- m %)) @v)) (count @v))))))]
(when (nil? (resolve 'v))
(intern *ns* 'v (atom [])))
(std-dev x)))

View file

@ -0,0 +1,27 @@
class StandardDeviation
constructor: ->
@sum = 0
@sumOfSquares = 0
@values = 0
@deviation = 0
include: ( n ) ->
@values += 1
@sum += n
@sumOfSquares += n * n
mean = @sum / @values
mean *= mean
@deviation = Math.sqrt @sumOfSquares / @values - mean
dev = new StandardDeviation
values = [ 2, 4, 4, 4, 5, 5, 7, 9 ]
tmp = []
for value in values
tmp.push value
dev.include value
console.log """
Values: #{ tmp }
Standard deviation: #{ dev.deviation }
"""

View file

@ -0,0 +1,17 @@
(defun running-stddev ()
(let ((sum 0) (sq 0) (n 0))
(lambda (x)
(incf sum x) (incf sq (* x x)) (incf n)
(/ (sqrt (- (* n sq) (* sum sum))) n))))
CL-USER> (loop with f = (running-stddev) for i in '(2 4 4 4 5 5 7 9) do
(format t "~a ~a~%" i (funcall f i)))
NIL
2 0.0
4 1.0
4 0.94280905
4 0.8660254
5 0.97979593
5 1.0
7 1.3997085
9 2.0

View file

@ -0,0 +1,18 @@
CL-USER> (setf fn (running-stddev))
#<Interpreted Closure (:INTERNAL RUNNING-STDDEV) @ #x21b9a492>
CL-USER> (funcall fn 2)
0.0
CL-USER> (funcall fn 4)
1.0
CL-USER> (funcall fn 4)
0.94280905
CL-USER> (funcall fn 4)
0.8660254
CL-USER> (funcall fn 5)
0.97979593
CL-USER> (funcall fn 5)
1.0
CL-USER> (funcall fn 7)
1.3997085
CL-USER> (funcall fn 9)
2.0

View file

@ -0,0 +1,43 @@
MODULE StandardDeviation;
IMPORT StdLog, Args,Strings,Math;
PROCEDURE Mean(x: ARRAY OF REAL; n: INTEGER; OUT mean: REAL);
VAR
i: INTEGER;
total: REAL;
BEGIN
total := 0.0;
FOR i := 0 TO n - 1 DO total := total + x[i] END;
mean := total /n
END Mean;
PROCEDURE SDeviation(x : ARRAY OF REAL;n: INTEGER): REAL;
VAR
i: INTEGER;
mean,sum: REAL;
BEGIN
Mean(x,n,mean);
sum := 0.0;
FOR i := 0 TO n - 1 DO
sum:= sum + ((x[i] - mean) * (x[i] - mean));
END;
RETURN Math.Sqrt(sum/n);
END SDeviation;
PROCEDURE Do*;
VAR
p: Args.Params;
x: POINTER TO ARRAY OF REAL;
i,done: INTEGER;
BEGIN
Args.Get(p);
IF p.argc > 0 THEN
NEW(x,p.argc);
FOR i := 0 TO p.argc - 1 DO x[i] := 0.0 END;
FOR i := 0 TO p.argc - 1 DO
Strings.StringToReal(p.args[i],x[i],done);
StdLog.Int(i + 1);StdLog.String(" :> ");StdLog.Real(SDeviation(x,i + 1));StdLog.Ln
END
END
END Do;
END StandardDeviation.

View file

@ -0,0 +1,16 @@
class StdDevAccumulator
def initialize
@n, @sum, @sum2 = 0, 0.0, 0.0
end
def <<(num)
@n += 1
@sum += num
@sum2 += num**2
Math.sqrt (@sum2 * @n - @sum**2) / @n**2
end
end
sd = StdDevAccumulator.new
i = 0
[2,4,4,4,5,5,7,9].each { |n| puts "adding #{n}: stddev of #{i+=1} samples is #{sd << n}" }

View file

@ -0,0 +1,12 @@
def sdaccum
n, sum, sum2 = 0, 0.0, 0.0
->(num : Int32) do
n += 1
sum += num
sum2 += num**2
Math.sqrt( (sum2 * n - sum**2) / n**2 )
end
end
sd = sdaccum
[2,4,4,4,5,5,7,9].each {|n| print sd.call(n), ", "}

View file

@ -0,0 +1,28 @@
import std.stdio, std.math;
struct StdDev {
real sum = 0.0, sqSum = 0.0;
long nvalues;
void addNumber(in real input) pure nothrow {
nvalues++;
sum += input;
sqSum += input ^^ 2;
}
real getStdDev() const pure nothrow {
if (nvalues == 0)
return 0.0;
immutable real mean = sum / nvalues;
return sqrt(sqSum / nvalues - mean ^^ 2);
}
}
void main() {
StdDev stdev;
foreach (el; [2.0, 4, 4, 4, 5, 5, 7, 9]) {
stdev.addNumber(el);
writefln("%e", stdev.getStdDev());
}
}

View file

@ -0,0 +1,31 @@
program prj_CalcStdDerv;
{$APPTYPE CONSOLE}
uses
Math;
var Series:Array of Extended;
UserString:String;
function AppendAndCalc(NewVal:Extended):Extended;
begin
setlength(Series,high(Series)+2);
Series[high(Series)] := NewVal;
result := PopnStdDev(Series);
end;
const data:array[0..7] of Extended =
(2,4,4,4,5,5,7,9);
var rr: Extended;
begin
setlength(Series,0);
for rr in data do
begin
writeln(rr,' -> ',AppendAndCalc(rr));
end;
Readln;
end.

View file

@ -0,0 +1,24 @@
def makeRunningStdDev() {
var sum := 0.0
var sumSquares := 0.0
var count := 0.0
def insert(v) {
sum += v
sumSquares += v ** 2
count += 1
}
/** Returns the standard deviation of the inputs so far, or null if there
have been no inputs. */
def stddev() {
if (count > 0) {
def meanSquares := sumSquares/count
def mean := sum/count
def variance := meanSquares - mean**2
return variance.sqrt()
}
}
return [insert, stddev]
}

View file

@ -0,0 +1,18 @@
? def [insert, stddev] := makeRunningStdDev()
# value: <insert>, <stddev>
? [stddev()]
# value: [null]
? for value in [2,4,4,4,5,5,7,9] {
> insert(value)
> println(stddev())
> }
0.0
1.0
0.9428090415820626
0.8660254037844386
0.9797958971132716
1.0
1.3997084244475297
2.0

View file

@ -0,0 +1,12 @@
global sum sum2 n .
proc sd x . r .
sum += x
sum2 += x * x
n += 1
r = sqrt (sum2 / n - sum * sum / n / n)
.
v[] = [ 2 4 4 4 5 5 7 9 ]
for v in v[]
call sd v r
print v & " " & r
.

View file

@ -0,0 +1,43 @@
defmodule Standard_deviation do
def add_sample( pid, n ), do: send( pid, {:add, n} )
def create, do: spawn_link( fn -> loop( [] ) end )
def destroy( pid ), do: send( pid, :stop )
def get( pid ) do
send( pid, {:get, self()} )
receive do
{ :get, value, _pid } -> value
end
end
def task do
pid = create()
for x <- [2,4,4,4,5,5,7,9], do: add_print( pid, x, add_sample(pid, x) )
destroy( pid )
end
defp add_print( pid, n, _add ) do
IO.puts "Standard deviation #{ get(pid) } when adding #{ n }"
end
defp loop( ns ) do
receive do
{:add, n} -> loop( [n | ns] )
{:get, pid} ->
send( pid, {:get, loop_calculate( ns ), self()} )
loop( ns )
:stop -> :ok
end
end
defp loop_calculate( ns ) do
average = loop_calculate_average( ns )
:math.sqrt( loop_calculate_average( for x <- ns, do: :math.pow(x - average, 2) ) )
end
defp loop_calculate_average( ns ), do: Enum.sum( ns ) / length( ns )
end
Standard_deviation.task

View file

@ -0,0 +1,16 @@
(defun running-std (items)
(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))
(running-std '(2 4 4 4 5 5 7 9))

View file

@ -0,0 +1,2 @@
(let ((x '(2 4 4 4 5 5 7 9)))
(string-to-number (calc-eval "sqrt(vpvar($1))" nil (append '(vec) x))))

View file

@ -0,0 +1,24 @@
;; lexical-binding: t
(require 'generator)
(iter-defun std-dev-gen (lst)
(let ((sum 0)
(avg 0)
(tmp '())
(std 0))
(dolist (i lst)
(setq i (float i))
(push i tmp)
(setq sum (+ sum i))
(setq avg (/ sum (length tmp)))
(setq std 0)
(dolist (j tmp)
(setq std (+ std (expt (- j avg) 2))))
(setq std (/ std (length tmp)))
(setq std (sqrt std))
(iter-yield std))))
(let* ((test-data '(2 4 4 4 5 5 7 9))
(generator (std-dev-gen test-data)))
(dolist (i test-data)
(message "with %d: %f" i (iter-next generator))))

View file

@ -0,0 +1,39 @@
-module( standard_deviation ).
-export( [add_sample/2, create/0, destroy/1, get/1, task/0] ).
-compile({no_auto_import,[get/1]}).
add_sample( Pid, N ) -> Pid ! {add, N}.
create() -> erlang:spawn_link( fun() -> loop( [] ) end ).
destroy( Pid ) -> Pid ! stop.
get( Pid ) ->
Pid ! {get, erlang:self()},
receive
{get, Value, Pid} -> Value
end.
task() ->
Pid = create(),
[add_print(Pid, X, add_sample(Pid, X)) || X <- [2,4,4,4,5,5,7,9]],
destroy( Pid ).
add_print( Pid, N, _Add ) -> io:fwrite( "Standard deviation ~p when adding ~p~n", [get(Pid), N] ).
loop( Ns ) ->
receive
{add, N} -> loop( [N | Ns] );
{get, Pid} ->
Pid ! {get, loop_calculate( Ns ), erlang:self()},
loop( Ns );
stop -> ok
end.
loop_calculate( Ns ) ->
Average = loop_calculate_average( Ns ),
math:sqrt( loop_calculate_average([math:pow(X - Average, 2) || X <- Ns]) ).
loop_calculate_average( Ns ) -> lists:sum( Ns ) / erlang:length( Ns ).

View file

@ -0,0 +1,15 @@
01.01 C-- TEST SET
01.10 S T(1)=2;S T(2)=4;S T(3)=4;S T(4)=4
01.20 S T(5)=5;S T(6)=5;S T(7)=7;S T(8)=9
01.30 D 2.1
01.35 T %6.40
01.40 F I=1,8;S A=T(I);D 2.2;T "VAL",A;D 2.3;T " SD",A,!
01.50 Q
02.01 C-- RUNNING STDDEV
02.02 C-- 2.1: INITIALIZE
02.03 C-- 2.2: INSERT VALUE A
02.04 C-- 2.3: A = CURRENT STDDEV
02.10 S XN=0;S XS=0;S XQ=0
02.20 S XN=XN+1;S XS=XS+A;S XQ=XQ+A*A
02.30 S A=FSQT(XQ/XN - (XS/XN)^2)

View file

@ -0,0 +1,22 @@
USING: accessors io kernel math math.functions math.parser
sequences ;
IN: standard-deviator
TUPLE: standard-deviator sum sum^2 n ;
: <standard-deviator> ( -- standard-deviator )
0.0 0.0 0 standard-deviator boa ;
: current-std ( standard-deviator -- std )
[ [ sum^2>> ] [ n>> ] bi / ]
[ [ sum>> ] [ n>> ] bi / sq ] bi - sqrt ;
: add-value ( value standard-deviator -- )
[ nip [ 1 + ] change-n drop ]
[ [ + ] change-sum drop ]
[ [ [ sq ] dip + ] change-sum^2 drop ] 2tri ;
: main ( -- )
{ 2 4 4 4 5 5 7 9 }
<standard-deviator> [ [ add-value ] curry each ] keep
current-std number>string print ;

View file

@ -0,0 +1,23 @@
: f+! ( x addr -- ) dup f@ f+ f! ;
: st-count ( stats -- n ) f@ ;
: st-sum ( stats -- sum ) float+ f@ ;
: st-sumsq ( stats -- sum*sum ) 2 floats + f@ ;
: st-mean ( stats -- mean )
dup st-sum st-count f/ ;
: st-variance ( stats -- var )
dup st-sumsq
dup st-mean fdup f* dup st-count f* f-
st-count f/ ;
: st-stddev ( stats -- stddev )
st-variance fsqrt ;
: st-add ( fnum stats -- )
dup
1e dup f+! float+
fdup dup f+! float+
fdup f* f+!
std-stddev ;

View file

@ -0,0 +1,18 @@
: st-count ( stats -- n ) f@ ;
: st-mean ( stats -- mean ) float+ f@ ;
: st-nvar ( stats -- n*var ) 2 floats + f@ ;
: st-variance ( stats -- var ) dup st-nvar st-count f/ ;
: st-stddev ( stats -- stddev ) st-variance fsqrt ;
: st-add ( x stats -- )
dup
1e dup f+! \ update count
fdup dup st-mean f- fswap
( delta x )
fover dup st-count f/
( delta x delta/n )
float+ dup f+! \ update mean
( delta x )
dup f@ f- f* float+ f+! \ update nvar
st-stddev ;

View file

@ -0,0 +1,10 @@
create stats 0e f, 0e f, 0e f,
2e stats st-add f. \ 0.
4e stats st-add f. \ 1.
4e stats st-add f. \ 0.942809041582063
4e stats st-add f. \ 0.866025403784439
5e stats st-add f. \ 0.979795897113271
5e stats st-add f. \ 1.
7e stats st-add f. \ 1.39970842444753
9e stats st-add f. \ 2.

View file

@ -0,0 +1,49 @@
program standard_deviation
implicit none
integer(kind=4), parameter :: dp = kind(0.0d0)
real(kind=dp), dimension(:), allocatable :: vals
integer(kind=4) :: i
real(kind=dp), dimension(8) :: sample_data = (/ 2, 4, 4, 4, 5, 5, 7, 9 /)
do i = lbound(sample_data, 1), ubound(sample_data, 1)
call sample_add(vals, sample_data(i))
write(*, fmt='(''#'',I1,1X,''value = '',F3.1,1X,''stddev ='',1X,F10.8)') &
i, sample_data(i), stddev(vals)
end do
if (allocated(vals)) deallocate(vals)
contains
! Adds value :val: to array :population: dynamically resizing array
subroutine sample_add(population, val)
real(kind=dp), dimension(:), allocatable, intent (inout) :: population
real(kind=dp), intent (in) :: val
real(kind=dp), dimension(:), allocatable :: tmp
integer(kind=4) :: n
if (.not. allocated(population)) then
allocate(population(1))
population(1) = val
else
n = size(population)
call move_alloc(population, tmp)
allocate(population(n + 1))
population(1:n) = tmp
population(n + 1) = val
endif
end subroutine sample_add
! Calculates standard deviation for given set of values
real(kind=dp) function stddev(vals)
real(kind=dp), dimension(:), intent(in) :: vals
real(kind=dp) :: mean
integer(kind=4) :: n
n = size(vals)
mean = sum(vals)/n
stddev = sqrt(sum((vals - mean)**2)/n)
end function stddev
end program standard_deviation

View file

@ -0,0 +1,74 @@
REAL FUNCTION STDDEV(X) !Standard deviation for successive values.
REAL X !The latest value.
REAL V !Scratchpad.
INTEGER N !Ongoing: count of the values.
REAL EX,EX2 !Ongoing: sum of X and X**2.
SAVE N,EX,EX2 !Retain values from one invocation to the next.
DATA N,EX,EX2/0,0.0,0.0/ !Initial values.
N = N + 1 !Another value arrives.
EX = X + EX !Augment the total.
EX2 = X**2 + EX2 !Augment the sum of squares.
V = EX2/N - (EX/N)**2 !The variance, but, it might come out negative!
STDDEV = SIGN(SQRT(ABS(V)),V) !Protect the SQRT, but produce a negative result if so.
END FUNCTION STDDEV !For the sequence of received X values.
REAL FUNCTION STDDEVP(X) !Standard deviation for successive values.
REAL X !The latest value.
INTEGER N !Ongoing: count of the values.
REAL A,V !Ongoing: average, and sum of squared deviations.
SAVE N,A,V !Retain values from one invocation to the next.
DATA N,A,V/0,0.0,0.0/ !Initial values.
N = N + 1 !Another value arrives.
V = (N - 1)*(X - A)**2 /N + V !First, as it requires the existing average.
A = (X - A)/N + A != [x + (n - 1).A)]/n: recover the total from the average.
STDDEVP = SQRT(V/N) !V can never be negative, even with limited precision.
END FUNCTION STDDEVP !For the sequence of received X values.
REAL FUNCTION STDDEVW(X) !Standard deviation for successive values.
REAL X !The latest value.
REAL V,D !Scratchpads.
INTEGER N !Ongoing: count of the values.
REAL EX,EX2 !Ongoing: sum of X and X**2.
REAL W !Ongoing: working mean.
SAVE N,EX,EX2,W !Retain values from one invocation to the next.
DATA N,EX,EX2/0,0.0,0.0/ !Initial values.
IF (N.LE.0) W = X !Take the first value as the working mean.
N = N + 1 !Another value arrives.
D = X - W !Its deviation from the working mean.
EX = D + EX !Augment the total.
EX2 = D**2 + EX2 !Augment the sum of squares.
V = EX2/N - (EX/N)**2 !The variance, but, it might come out negative!
STDDEVW = SIGN(SQRT(ABS(V)),V) !Protect the SQRT, but produce a negative result if so.
END FUNCTION STDDEVW !For the sequence of received X values.
REAL FUNCTION STDDEVPW(X) !Standard deviation for successive values.
REAL X !The latest value.
INTEGER N !Ongoing: count of the values.
REAL A,V !Ongoing: average, and sum of squared deviations.
REAL W !Ongoing: working mean.
SAVE N,A,V,W !Retain values from one invocation to the next.
DATA N,A,V/0,0.0,0.0/ !Initial values.
IF (N.LE.0) W = X !Oh for self-modifying code!
N = N + 1 !Another value arrives.
D = X - W !Its deviation from the working mean.
V = (N - 1)*(D - A)**2 /N + V !First, as it requires the existing average.
A = (D - A)/N + A != [x + (n - 1).A)]/n: recover the total from the average.
STDDEVPW = SQRT(V/N) !V can never be negative, even with limited precision.
END FUNCTION STDDEVPW !For the sequence of received X values.
PROGRAM TEST
INTEGER I !A stepper.
REAL A(8) !The example data.
DATA A/2.0,3*4.0,2*5.0,7.0,9.0/ !Alas, another opportunity to use @ passed over.
REAL B !An offsetting base.
WRITE (6,1)
1 FORMAT ("Progressive calculation of the standard deviation."/
1 " I",7X,"A(I) EX EX2 Av V*N Ed Ed2 wAv V*N")
B = 1000000 !Provoke truncation error.
DO I = 1,8 !Step along the data series,
WRITE (6,2) I,INT(A(I) + B), !No fractional part, so I don't want F11.0.
1 STDDEV(A(I) + B),STDDEVP(A(I) + B), !Showing progressive values.
2 STDDEVW(A(I) + B),STDDEVPW(A(I) + B) !These with a working mean.
2 FORMAT (I2,I11,1X,4F12.6) !Should do for the example.
END DO !On to the next value.
END

View file

@ -0,0 +1,30 @@
' FB 1.05.0 Win64
Function calcStandardDeviation(number As Double) As Double
Static a() As Double
Redim Preserve a(0 To UBound(a) + 1)
Dim ub As UInteger = UBound(a)
a(ub) = number
Dim sum As Double = 0.0
For i As UInteger = 0 To ub
sum += a(i)
Next
Dim mean As Double = sum / (ub + 1)
Dim diff As Double
sum = 0.0
For i As UInteger = 0 To ub
diff = a(i) - mean
sum += diff * diff
Next
Return Sqr(sum/ (ub + 1))
End Function
Dim a(0 To 7) As Double = {2, 4, 4, 4, 5, 5, 7, 9}
For i As UInteger = 0 To 7
Print "Added"; a(i); " SD now : "; calcStandardDeviation(a(i))
Next
Print
Print "Press any key to quit"
Sleep

View file

@ -0,0 +1,23 @@
package main
import (
"fmt"
"math"
)
func newRsdv() func(float64) float64 {
var n, a, q float64
return func(x float64) float64 {
n++
a1 := a+(x-a)/n
q, a = q+(x-a)*(x-a1), a1
return math.Sqrt(q/n)
}
}
func main() {
r := newRsdv()
for _, x := range []float64{2,4,4,4,5,5,7,9} {
fmt.Println(r(x))
}
}

View file

@ -0,0 +1,13 @@
List samples = []
def stdDev = { def sample ->
samples << sample
def sum = samples.sum()
def sumSq = samples.sum { it * it }
def count = samples.size()
(sumSq/count - (sum/count)**2)**0.5
}
[2,4,4,4,5,5,7,9].each {
println "${stdDev(it)}"
}

View file

@ -0,0 +1,28 @@
{-# LANGUAGE BangPatterns #-}
import Data.List (foldl') -- '
import Data.STRef
import Control.Monad.ST
data Pair a b = Pair !a !b
sumLen :: [Double] -> Pair Double Double
sumLen = fiof2 . foldl' (\(Pair s l) x -> Pair (s+x) (l+1)) (Pair 0.0 0) --'
where fiof2 (Pair s l) = Pair s (fromIntegral l)
divl :: Pair Double Double -> Double
divl (Pair _ 0.0) = 0.0
divl (Pair s l) = s / l
sd :: [Double] -> Double
sd xs = sqrt $ foldl' (\a x -> a+(x-m)^2) 0 xs / l --'
where p@(Pair s l) = sumLen xs
m = divl p
mkSD :: ST s (Double -> ST s Double)
mkSD = go <$> newSTRef []
where go acc x =
modifySTRef acc (x:) >> (sd <$> readSTRef acc)
main = mapM_ print $ runST $
mkSD >>= forM [2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0]

View file

@ -0,0 +1,18 @@
import Data.List (mapAccumL)
-------------- CUMULATIVE STANDARD DEVIATION -------------
cumulativeStdDevns :: [Float] -> [Float]
cumulativeStdDevns = snd . mapAccumL go (0, 0) . zip [1.0..]
where
go (s, q) (i, x) =
let _s = s + x
_q = q + (x ^ 2)
in ((_s, _q), sqrt ((_q / i) - ((_s / i) ^ 2)))
--------------------------- TEST -------------------------
main :: IO ()
main = mapM_ print $ cumulativeStdDevns [2, 4, 4, 4, 5, 5, 7, 9]

View file

@ -0,0 +1,23 @@
using Lambda;
class Main {
static function main():Void {
var nums = [2, 4, 4, 4, 5, 5, 7, 9];
for (i in 1...nums.length+1)
Sys.println(sdev(nums.slice(0, i)));
}
static function average<T:Float>(nums:Array<T>):Float {
return nums.fold(function(n, t) return n + t, 0) / nums.length;
}
static function sdev<T:Float>(nums:Array<T>):Float {
var store = [];
var avg = average(nums);
for (n in nums) {
store.push((n - avg) * (n - avg));
}
return Math.sqrt(average(store));
}
}

View file

@ -0,0 +1,16 @@
REAL :: n=8, set(n), sum=0, sum2=0
set = (2,4,4,4,5,5,7,9)
DO k = 1, n
WRITE() 'Adding ' // set(k) // 'stdev = ' // stdev(set(k))
ENDDO
END ! end of "main"
FUNCTION stdev(x)
USE : sum, sum2, k
sum = sum + x
sum2 = sum2 + x*x
stdev = ( sum2/k - (sum/k)^2) ^ 0.5
END

View file

@ -0,0 +1,17 @@
100 PROGRAM "StDev.bas"
110 LET N=8
120 NUMERIC ARR(1 TO N)
130 FOR I=1 TO N
140 READ ARR(I)
150 NEXT
160 DEF STDEV(N)
170 LET S1,S2=0
180 FOR I=1 TO N
190 LET S1=S1+ARR(I)^2:LET S2=S2+ARR(I)
200 NEXT
210 LET STDEV=SQR((N*S1-S2^2)/N^2)
220 END DEF
230 FOR J=1 TO N
240 PRINT J;"item =";ARR(J),"standard dev =";STDEV(J)
250 NEXT
260 DATA 2,4,4,4,5,5,7,9

View file

@ -0,0 +1,22 @@
procedure main()
stddev() # reset state / empty
every s := stddev(![2,4,4,4,5,5,7,9]) do
write("stddev (so far) := ",s)
end
procedure stddev(x) # running standard deviation
static X,sumX,sum2X
if /x then { # reset state
X := []
sumX := sum2X := 0.
}
else { # accumulate
put(X,x)
sumX +:= x
sum2X +:= x^2
return sqrt( (sum2X / *X) - (sumX / *X)^2 )
}
end

View file

@ -0,0 +1,9 @@
mean=: +/ % #
dev=: - mean
stddevP=: [: %:@mean *:@dev NB. A) 3 equivalent defs for stddevP
stddevP=: [: mean&.:*: dev NB. B) uses Under (&.:) to apply inverse of *: after mean
stddevP=: %:@(mean@:*: - *:@mean) NB. C) sqrt of ((mean of squares) - (square of mean))
stddevP\ 2 4 4 4 5 5 7 9
0 1 0.942809 0.866025 0.979796 1 1.39971 2

View file

@ -0,0 +1,11 @@
of =: @:
sqrt =: %:
sum =: +/
squares=: *:
data =: ]
mean =: sum % #
stddevP=: sqrt of mean of squares of (data-mean)
stddevP\ 2 4 4 4 5 5 7 9
0 1 0.942809 0.866025 0.979796 1 1.39971 2

View file

@ -0,0 +1,3 @@
require'stats'
(%:@:(%~<:)@:# * stddev)\ 2 4 4 4 5 5 7 9
0 1 0.942809 0.866025 0.979796 1 1.39971 2

View file

@ -0,0 +1,22 @@
public class StdDev {
int n = 0;
double sum = 0;
double sum2 = 0;
public double sd(double x) {
n++;
sum += x;
sum2 += x*x;
return Math.sqrt(sum2/n - sum*sum/n/n);
}
public static void main(String[] args) {
double[] testData = {2,4,4,4,5,5,7,9};
StdDev sd = new StdDev();
for (double x : testData) {
System.out.println(sd.sd(x));
}
}
}

View file

@ -0,0 +1,20 @@
function running_stddev() {
var n = 0;
var sum = 0.0;
var sum_sq = 0.0;
return function(num) {
n++;
sum += num;
sum_sq += num*num;
return Math.sqrt( (sum_sq / n) - Math.pow(sum / n, 2) );
}
}
var sd = running_stddev();
var nums = [2,4,4,4,5,5,7,9];
var stddev = [];
for (var i in nums)
stddev.push( sd(nums[i]) );
// using WSH
WScript.Echo(stddev.join(', ');

View file

@ -0,0 +1,22 @@
(function (xs) {
return xs.reduce(function (a, x, i) {
var n = i + 1,
sum_ = a.sum + x,
squaresSum_ = a.squaresSum + (x * x);
return {
sum: sum_,
squaresSum: squaresSum_,
stages: a.stages.concat(
Math.sqrt((squaresSum_ / n) - Math.pow((sum_ / n), 2))
)
};
}, {
sum: 0,
squaresSum: 0,
stages: []
}).stages
})([2, 4, 4, 4, 5, 5, 7, 9]);

View file

@ -0,0 +1,2 @@
[0, 1, 0.9428090415820626, 0.8660254037844386,
0.9797958971132716, 1, 1.3997084244475297, 2]

View file

@ -0,0 +1,55 @@
(() => {
'use strict';
// ---------- CUMULATIVE STANDARD DEVIATION ----------
// cumulativeStdDevns :: [Float] -> [Float]
const cumulativeStdDevns = ns => {
const go = ([s, q]) =>
([i, x]) => {
const
_s = s + x,
_q = q + (x * x),
j = 1 + i;
return [
[_s, _q],
Math.sqrt(
(_q / j) - Math.pow(_s / j, 2)
)
];
};
return mapAccumL(go)([0, 0])(ns)[1];
};
// ---------------------- TEST -----------------------
const main = () =>
showLog(
cumulativeStdDevns([
2, 4, 4, 4, 5, 5, 7, 9
])
);
// --------------------- GENERIC ---------------------
// mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
const mapAccumL = f =>
// A tuple of an accumulation and a list
// obtained by a combined map and fold,
// with accumulation from left to right.
acc => xs => [...xs].reduce((a, x, i) => {
const pair = f(a[0])([i, x]);
return [pair[0], a[1].concat(pair[1])];
}, [acc, []]);
// showLog :: a -> IO ()
const showLog = (...args) =>
console.log(
args
.map(x => JSON.stringify(x, null, 2))
.join(' -> ')
);
// MAIN ---
return main();
})();

View file

@ -0,0 +1,26 @@
# Compute the standard deviation of the observations
# seen so far, given the current state as input:
def standard_deviation: .ssd / .n | sqrt;
def update_state(observation):
def sq: .*.;
((.mean * .n + observation) / (.n + 1)) as $newmean
| (.ssd + .n * ((.mean - $newmean) | sq)) as $ssd
| { "n": (.n + 1),
"ssd": ($ssd + ((observation - $newmean) | sq)),
"mean": $newmean }
;
def initial_state: { "n": 0, "ssd": 0, "mean": 0 };
# Given an array of observations presented as input:
def simulate:
def _simulate(i; observations):
if (observations|length) <= i then empty
else update_state(observations[i])
| standard_deviation, _simulate(i+1; observations)
end ;
. as $in | initial_state | _simulate(0; $in);
# Begin:
simulate

View file

@ -0,0 +1,9 @@
$ jq -s -f Dynamic_standard_deviation.jq observations.txt
0
1
0.9428090415820634
0.8660254037844386
0.9797958971132711
0.9999999999999999
1.3997084244475302
1.9999999999999998

View file

@ -0,0 +1,6 @@
# requires jq version > 1.4
def simulate(stream):
foreach stream as $observation
(initial_state;
update_state($observation);
standard_deviation);

View file

@ -0,0 +1,38 @@
#!/bin/bash
# jq is assumed to be on PATH
PROGRAM='
def standard_deviation: .ssd / .n | sqrt;
def update_state(observation):
def sq: .*.;
((.mean * .n + observation) / (.n + 1)) as $newmean
| (.ssd + .n * ((.mean - $newmean) | sq)) as $ssd
| { "n": (.n + 1),
"ssd": ($ssd + ((observation - $newmean) | sq)),
"mean": $newmean }
;
def initial_state: { "n": 0, "ssd": 0, "mean": 0 };
# Input should be [observation, null] or [observation, state]
def standard_deviations:
. as $in
| if type == "array" then
(if .[1] == null then initial_state else .[1] end) as $state
| $state | update_state($in[0])
| standard_deviation, .
else empty
end
;
standard_deviations
'
state=null
while read -p "Next observation: " observation
do
result=$(echo "[ $observation, $state ]" | jq -c "$PROGRAM")
sed -n 1p <<< "$result"
state=$(sed -n 2p <<< "$result")
done

View file

@ -0,0 +1,7 @@
$ ./standard_deviation_server.sh
Next observation: 10
0
Next observation: 20
5
Next observation: 0
8.16496580927726

View file

@ -0,0 +1,20 @@
function makerunningstd(::Type{T} = Float64) where T
∑x = ∑x² = zero(T)
n = 0
function runningstd(x)
∑x += x
∑x² += x ^ 2
n += 1
s = ∑x² / n - (∑x / n) ^ 2
return s
end
return runningstd
end
test = Float64[2, 4, 4, 4, 5, 5, 7, 9]
rstd = makerunningstd()
println("Perform a running standard deviation of ", test)
for i in test
println(" - add $i → ", rstd(i))
end

View file

@ -0,0 +1,20 @@
// version 1.0.5-2
class CumStdDev {
private var n = 0
private var sum = 0.0
private var sum2 = 0.0
fun sd(x: Double): Double {
n++
sum += x
sum2 += x * x
return Math.sqrt(sum2 / n - sum * sum / n / n)
}
}
fun main(args: Array<String>) {
val testData = doubleArrayOf(2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0)
val csd = CumStdDev()
for (d in testData) println("Add $d => ${csd.sd(d)}")
}

View file

@ -0,0 +1,26 @@
dim SD.storage$( 100) ' can call up to 100 versions, using ID to identify.. arrays are global.
' holds (space-separated) number of data items so far, current sum.of.values and current sum.of.squares
for i =1 to 8
read x
print "New data "; x; " so S.D. now = "; using( "###.######", standard.deviation( 1, x))
next i
end
function standard.deviation( ID, in)
if SD.storage$( ID) ="" then SD.storage$( ID) ="0 0 0"
num.so.far =val( word$( SD.storage$( ID), 1))
sum.vals =val( word$( SD.storage$( ID), 2))
sum.sqs =val( word$( SD.storage$( ID), 3))
num.so.far =num.so.far +1
sum.vals =sum.vals +in
sum.sqs =sum.sqs +in^2
' standard deviation = square root of (the average of the squares less the square of the average)
standard.deviation =( ( sum.sqs /num.so.far) - ( sum.vals /num.so.far)^2)^0.5
SD.storage$( ID) =str$( num.so.far) +" " +str$( sum.vals) +" " +str$( sum.sqs)
end function
Data 2, 4, 4, 4, 5, 5, 7, 9

View file

@ -0,0 +1,28 @@
// Stats computes a running mean and variance
// See Knuth TAOCP vol 2, 3rd edition, page 232
class Stats:
M = 0.0
S = 0.0
n = 0
def incl(x):
n += 1
if n == 1:
M = x
else:
let mm = (x - M)
M += mm / n
S += mm * (x - M)
def mean(): return M
//def variance(): return (if n > 1.0: S / (n - 1.0) else: 0.0) // Bessel's correction
def variance(): return (if n > 0.0: S / n else: 0.0)
def stddev(): return sqrt(variance())
def count(): return n
def test_stdv() -> float:
let v = [2,4,4,4,5,5,7,9]
let s = Stats {}
for(v) x: s.incl(x+0.0)
print concat_string(["Mean: ", string(s.mean()), ", Std.Deviation: ", string(s.stddev())], "")
test_stdv()

View file

@ -0,0 +1,12 @@
function stdev()
local sum, sumsq, k = 0,0,0
return function(n)
sum, sumsq, k = sum + n, sumsq + n^2, k+1
return math.sqrt((sumsq / k) - (sum/k)^2)
end
end
ldev = stdev()
for i, v in ipairs{2,4,4,4,5,5,7,9} do
print(ldev(v))
end

View file

@ -0,0 +1,7 @@
x = [2,4,4,4,5,5,7,9];
n = length (x);
m = mean (x);
x2 = mean (x .* x);
dev= sqrt (x2 - m * m)
dev = 2

View file

@ -0,0 +1,6 @@
m = cumsum(x) ./ [1:n]; % running mean
x2= cumsum(x.^2) ./ [1:n]; % running squares
dev = sqrt(x2 - m .* m)
dev =
0.00000 1.00000 0.94281 0.86603 0.97980 1.00000 1.39971 2.00000

View file

@ -0,0 +1,3 @@
function stdDevEval(n)
disp(sqrt(sum((n-sum(n)/length(n)).^2)/length(n)));
end

View file

@ -0,0 +1 @@
runningSTDDev[n_] := (If[Not[ValueQ[$Data]], $Data = {}];StandardDeviation[AppendTo[$Data, n]])

View file

@ -0,0 +1,21 @@
StdDeviator = {}
StdDeviator.count = 0
StdDeviator.sum = 0
StdDeviator.sumOfSquares = 0
StdDeviator.add = function(x)
self.count = self.count + 1
self.sum = self.sum + x
self.sumOfSquares = self.sumOfSquares + x*x
end function
StdDeviator.stddev = function()
m = self.sum / self.count
return sqrt(self.sumOfSquares / self.count - m*m)
end function
sd = new StdDeviator
for x in [2, 4, 4, 4, 5, 5, 7, 9]
sd.add x
end for
print sd.stddev

View file

@ -0,0 +1,26 @@
class StdDev
declare n
declare sum
declare sum2
def StdDev()
n = 0
sum = 0
sum2 = 0
end
def sd(x)
this.n += 1
this.sum += x
this.sum2 += x*x
return sqrt(sum2/n - sum*sum/n/n)
end
end
testData = {2,4,4,4,5,5,7,9}
sd = new(StdDev)
for x in testData
println sd.sd(x)
end

View file

@ -0,0 +1,12 @@
import math, strutils
var sdSum, sdSum2, sdN = 0.0
proc sd(x: float): float =
sdN += 1
sdSum += x
sdSum2 += x * x
sqrt(sdSum2 / sdN - sdSum * sdSum / (sdN * sdN))
for value in [float 2,4,4,4,5,5,7,9]:
echo value, " ", formatFloat(sd(value), precision = -1)

View file

@ -0,0 +1,16 @@
import math, strutils
type SDAccum = object
sdN, sdSum, sdSum2: float
var accum: SDAccum
proc add(accum: var SDAccum; value: float): float =
# Add a value to the accumulator. Return the standard deviation.
accum.sdN += 1
accum.sdSum += value
accum.sdSum2 += value * value
result = sqrt(accum.sdSum2 / accum.sdN - accum.sdSum * accum.sdSum / (accum.sdN * accum.sdN))
for value in [float 2, 4, 4, 4, 5, 5, 7, 9]:
echo value, " ", formatFloat(accum.add(value), precision = -1)

View file

@ -0,0 +1,15 @@
import math, strutils
func accumBuilder(): auto =
var sdSum, sdSum2, sdN = 0.0
result = func(value: float): float =
sdN += 1
sdSum += value
sdSum2 += value * value
result = sqrt(sdSum2 / sdN - sdSum * sdSum / (sdN * sdN))
let std = accumBuilder()
for value in [float 2, 4, 4, 4, 5, 5, 7, 9]:
echo value, " ", formatFloat(std(value), precision = -1)

View file

@ -0,0 +1,15 @@
let sqr x = x *. x
let stddev l =
let n, sx, sx2 =
List.fold_left
(fun (n, sx, sx2) x -> succ n, sx +. x, sx2 +. sqr x)
(0, 0., 0.) l
in
sqrt ((sx2 -. sqr sx /. float n) /. float n)
let _ =
let l = [ 2.;4.;4.;4.;5.;5.;7.;9. ] in
Printf.printf "List: ";
List.iter (Printf.printf "%g ") l;
Printf.printf "\nStandard deviation: %g\n" (stddev l)

View file

@ -0,0 +1,35 @@
use Structure;
bundle Default {
class StdDev {
nums : FloatVector;
New() {
nums := FloatVector->New();
}
function : Main(args : String[]) ~ Nil {
sd := StdDev->New();
test_data := [2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0];
each(i : test_data) {
sd->AddNum(test_data[i]);
sd->GetSD()->PrintLine();
};
}
method : public : AddNum(num : Float) ~ Nil {
nums->AddBack(num);
}
method : public : native : GetSD() ~ Float {
sq_diffs := 0.0;
avg := nums->Average();
each(i : nums) {
num := nums->Get(i);
sq_diffs += (num - avg) * (num - avg);
};
return (sq_diffs / nums->Size())->SquareRoot();
}
}
}

View file

@ -0,0 +1,55 @@
#import <Foundation/Foundation.h>
@interface SDAccum : NSObject
{
double sum, sum2;
unsigned int num;
}
-(double)value: (double)v;
-(unsigned int)count;
-(double)mean;
-(double)variance;
-(double)stddev;
@end
@implementation SDAccum
-(double)value: (double)v
{
sum += v;
sum2 += v*v;
num++;
return [self stddev];
}
-(unsigned int)count
{
return num;
}
-(double)mean
{
return (num>0) ? sum/(double)num : 0.0;
}
-(double)variance
{
double m = [self mean];
return (num>0) ? (sum2/(double)num - m*m) : 0.0;
}
-(double)stddev
{
return sqrt([self variance]);
}
@end
int main()
{
@autoreleasepool {
double v[] = { 2,4,4,4,5,5,7,9 };
SDAccum *sdacc = [[SDAccum alloc] init];
for(int i=0; i < sizeof(v)/sizeof(*v) ; i++)
printf("adding %f\tstddev = %f\n", v[i], [sdacc value: v[i]]);
}
return 0;
}

View file

@ -0,0 +1,30 @@
#import <Foundation/Foundation.h>
typedef double (^Func)(double); // a block that takes a double and returns a double
Func sdCreator() {
__block int n = 0;
__block double sum = 0;
__block double sum2 = 0;
return ^(double x) {
sum += x;
sum2 += x*x;
n++;
return sqrt(sum2/n - sum*sum/n/n);
};
}
int main()
{
@autoreleasepool {
double v[] = { 2,4,4,4,5,5,7,9 };
Func sdacc = sdCreator();
for(int i=0; i < sizeof(v)/sizeof(*v) ; i++)
printf("adding %f\tstddev = %f\n", v[i], sdacc(v[i]));
}
return 0;
}

View file

@ -0,0 +1,6 @@
Channel new [ ] over send drop const: StdValues
: stddev(x)
| l |
StdValues receive x + dup ->l StdValues send drop
#qs l map sum l size asFloat / l avg sq - sqrt ;

View file

@ -0,0 +1,42 @@
sdacc = .SDAccum~new
x = .array~of(2,4,4,4,5,5,7,9)
sd = 0
do i = 1 to x~size
sd = sdacc~value(x[i])
Say '#'i 'value =' x[i] 'stdev =' sd
end
::class SDAccum
::method sum attribute
::method sum2 attribute
::method count attribute
::method init
self~sum = 0.0
self~sum2 = 0.0
self~count = 0
::method value
expose sum sum2 count
parse arg x
sum = sum + x
sum2 = sum2 + x*x
count = count + 1
return self~stddev
::method mean
expose sum count
return sum/count
::method variance
expose sum2 count
m = self~mean
return sum2/count - m*m
::method stddev
return self~sqrt(self~variance)
::method sqrt
arg n
if n = 0 then return 0
ans = n / 2
prev = n
do until prev = ans
prev = ans
ans = ( prev + ( n / prev ) ) / 2
end
return ans

View file

@ -0,0 +1,19 @@
newpoint(x)={
myT=x;
myS=0;
myN=1;
[myT,myS]/myN
};
addpoint(x)={
myT+=x;
myN++;
myS+=(myN*x-myT)^2/myN/(myN-1);
[myT,myS]/myN
};
addpoints(v)={
print(newpoint(v[1]));
for(i=2,#v,print(addpoint(v[i])));
print("Mean: ",myT/myN);
print("Standard deviation: ",sqrt(myS/myN))
};
addpoints([2,4,4,4,5,5,7,9])

View file

@ -0,0 +1,31 @@
<?php
class sdcalc {
private $cnt, $sumup, $square;
function __construct() {
$this->reset();
}
# callable on an instance
function reset() {
$this->cnt=0; $this->sumup=0; $this->square=0;
}
function add($f) {
$this->cnt++;
$this->sumup += $f;
$this->square += pow($f, 2);
return $this->calc();
}
function calc() {
if ($this->cnt==0 || $this->sumup==0) {
return 0;
} else {
return sqrt($this->square / $this->cnt - pow(($this->sumup / $this->cnt),2));
}
}
}
# start test, adding test data one by one
$c = new sdcalc();
foreach ([2,4,4,4,5,5,7,9] as $v) {
printf('Adding %g: result %g%s', $v, $c->add($v), PHP_EOL);
}

View file

@ -0,0 +1,25 @@
*process source attributes xref;
stddev: proc options(main);
declare a(10) float init(1,2,3,4,5,6,7,8,9,10);
declare stdev float;
declare i fixed binary;
stdev=std_dev(a);
put skip list('Standard deviation', stdev);
std_dev: procedure(a) returns(float);
declare a(*) float, n fixed binary;
n=hbound(a,1);
begin;
declare b(n) float, average float;
declare i fixed binary;
do i=1 to n;
b(i)=a(i);
end;
average=sum(a)/n;
put skip data(average);
return( sqrt(sum(b**2)/n - average**2) );
end;
end std_dev;
end;

View file

@ -0,0 +1,28 @@
program stddev;
uses math;
const
n=8;
var
arr: array[1..n] of real =(2,4,4,4,5,5,7,9);
function stddev(n: integer): real;
var
i: integer;
s1,s2,variance,x: real;
begin
for i:=1 to n do
begin
x:=arr[i];
s1:=s1+power(x,2);
s2:=s2+x
end;
variance:=((n*s1)-(power(s2,2)))/(power(n,2));
stddev:=sqrt(variance)
end;
var
i: integer;
begin
for i:=1 to n do
begin
writeln(i,' item=',arr[i]:2:0,' stddev=',stddev(i):18:15)
end
end.

View file

@ -0,0 +1,37 @@
{
package SDAccum;
sub new {
my $class = shift;
my $self = {};
$self->{sum} = 0.0;
$self->{sum2} = 0.0;
$self->{num} = 0;
bless $self, $class;
return $self;
}
sub count {
my $self = shift;
return $self->{num};
}
sub mean {
my $self = shift;
return ($self->{num}>0) ? $self->{sum}/$self->{num} : 0.0;
}
sub variance {
my $self = shift;
my $m = $self->mean;
return ($self->{num}>0) ? $self->{sum2}/$self->{num} - $m * $m : 0.0;
}
sub stddev {
my $self = shift;
return sqrt($self->variance);
}
sub value {
my $self = shift;
my $v = shift;
$self->{sum} += $v;
$self->{sum2} += $v * $v;
$self->{num}++;
return $self->stddev;
}
}

View file

@ -0,0 +1,7 @@
my $sdacc = SDAccum->new;
my $sd;
foreach my $v ( 2,4,4,4,5,5,7,9 ) {
$sd = $sdacc->value($v);
}
print "std dev = $sd\n";

View file

@ -0,0 +1,14 @@
# <(x - <x>)²> = <x²> - <x>²
{
my $num, $sum, $sum2;
sub stddev {
my $x = shift;
$num++;
return sqrt(
($sum2 += $x**2) / $num -
(($sum += $x) / $num)**2
);
}
}
print stddev($_), "\n" for qw(2 4 4 4 5 5 7 9);

View file

@ -0,0 +1 @@
perl -MMath::StdDev -e '$d=new Math::StdDev;foreach my $v ( 2,4,4,4,5,5,7,9 ) {$d->Update($v); print $d->variance(),"\n"}'

View file

@ -0,0 +1,6 @@
use Math::StdDev;
$d=new Math::StdDev;
foreach my $v ( 2,4,4,4,5,5,7,9 ) {
$d->Update($v);
print $d->variance(),"\n"
}

Some files were not shown because too many files have changed in this diff Show more