使用bc或其他标准实用程序的任意数量的标准偏差

d3p*_*3pd 9 variables bash standard-deviation

是否有一些技巧可以让人们使用bc(或其他一些标准实用程序)来返回任意数量的数字的标准偏差?为方便起见,假设数字以下列方式存储在Bash变量中:

myNumbers="0.556
1.456
45.111
7.812
5.001"
Run Code Online (Sandbox Code Playgroud)

所以,我正在寻找的答案将采用如下形式:

standardDeviation="$(echo "${myNumbers}" | <insert magic here>)"
Run Code Online (Sandbox Code Playgroud)

Gil*_*not 12

使用:

standardDeviation=$(
    echo "$myNumbers" |
        awk '{sum+=$1; sumsq+=$1*$1}END{print sqrt(sumsq/NR - (sum/NR)**2)}'
)
echo $standardDeviation
Run Code Online (Sandbox Code Playgroud)

使用:

#!/usr/bin/env perl

use strict; use warnings;
use Math::NumberCruncher;

my @data = qw/
    0.556
    1.456
    45.111
    7.812
    5.001
/;

print Math::NumberCruncher::StandardDeviation(\@data);
Run Code Online (Sandbox Code Playgroud)

产量

16.7631
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 5

或者使用 GNU Octave(它比简单的 std 更强大):

standardDeviation="$(echo "${myNumbers}" | octave --eval 'disp(std(scanf("%f")))')"
echo $standardDeviation
Run Code Online (Sandbox Code Playgroud)

输出

18.742
Run Code Online (Sandbox Code Playgroud)


nis*_*ama 5

总体标准差:

jq -s '(add/length)as$a|map(pow(.-$a;2))|add/length|sqrt'
ruby -e'a=readlines.map(&:to_f);puts (a.map{|x|(x-a.reduce(:+)/a.length)**2}.reduce(:+)/a.length)**0.5'
jq -s '(map(.*.)|add/length)-pow(add/length;2)|sqrt'
awk '{x+=$0;y+=$0^2}END{print sqrt(y/NR-(x/NR)^2)}'
Run Code Online (Sandbox Code Playgroud)

在中awk^在POSIX中,但**不是。**gawknawk但不受的支持mawk

样本标准差(前两个命令与上面的前两个命令相同,但length已替换为length-1):

jq -s '(add/length)as$a|map(pow(.-$a;2))|add/(length-1)|sqrt'
ruby -e'a=readlines.map(&:to_f);puts (a.map{|x|(x-a.reduce(:+)/a.length)**2}.reduce(:+)/(a.length-1))**0.5'
R -q -e 'sd(scan("stdin"))'
Run Code Online (Sandbox Code Playgroud)