Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
3
Task/Cumulative-standard-deviation/00-META.yaml
Normal file
3
Task/Cumulative-standard-deviation/00-META.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/Cumulative_standard_deviation
|
||||
note: Probability and statistics
|
||||
21
Task/Cumulative-standard-deviation/00-TASK.txt
Normal file
21
Task/Cumulative-standard-deviation/00-TASK.txt
Normal 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>
|
||||
|
||||
|
|
@ -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))
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
)
|
||||
|
|
@ -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)))
|
||||
#
|
||||
|
||||
)
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -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))
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
{0.0, 1.0, 0.942809041582, 0.866025403784,
|
||||
0.979795897113, 1.0, 1.399708424448, 2.0}
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
arr: new []
|
||||
loop [2 4 4 4 5 5 7 9] 'value [
|
||||
'arr ++ value
|
||||
print [value "->" deviation arr]
|
||||
]
|
||||
|
|
@ -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))
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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)))
|
||||
|
|
@ -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 }
|
||||
|
||||
"""
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -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}" }
|
||||
|
|
@ -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), ", "}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
@ -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]
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
.
|
||||
|
|
@ -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
|
||||
|
|
@ -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))
|
||||
|
|
@ -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))))
|
||||
|
|
@ -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))))
|
||||
|
|
@ -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 ).
|
||||
|
|
@ -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)
|
||||
|
|
@ -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 ;
|
||||
|
|
@ -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 ;
|
||||
|
|
@ -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 ;
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
@ -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)}"
|
||||
}
|
||||
|
|
@ -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]
|
||||
|
|
@ -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]
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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(', ');
|
||||
|
|
@ -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]);
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[0, 1, 0.9428090415820626, 0.8660254037844386,
|
||||
0.9797958971132716, 1, 1.3997084244475297, 2]
|
||||
|
|
@ -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();
|
||||
})();
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# requires jq version > 1.4
|
||||
def simulate(stream):
|
||||
foreach stream as $observation
|
||||
(initial_state;
|
||||
update_state($observation);
|
||||
standard_deviation);
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
$ ./standard_deviation_server.sh
|
||||
Next observation: 10
|
||||
0
|
||||
Next observation: 20
|
||||
5
|
||||
Next observation: 0
|
||||
8.16496580927726
|
||||
|
|
@ -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
|
||||
|
|
@ -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)}")
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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()
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
function stdDevEval(n)
|
||||
disp(sqrt(sum((n-sum(n)/length(n)).^2)/length(n)));
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
runningSTDDev[n_] := (If[Not[ValueQ[$Data]], $Data = {}];StandardDeviation[AppendTo[$Data, n]])
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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 ;
|
||||
|
|
@ -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
|
||||
|
|
@ -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])
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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.
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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";
|
||||
|
|
@ -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);
|
||||
|
|
@ -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"}'
|
||||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue