標準偏差の計算


19

チャレンジ

数のリストが与えられたら、リストの母標準偏差を計算します。

母標準偏差を計算するには、次の式を使用します。

入力

入力は、任意の形式(リスト、文字列など)の整数のリストになります。いくつかの例:

56,54,89,87
67,54,86,67

数値は常に整数になります。

入力は、STDINまたは関数の引数になります。

出力

出力は浮動小数点数でなければなりません。

ルール

組み込み関数を使用して、標準偏差を見つけることができます。

あなたの答えは、完全なプログラムまたは機能のいずれかです。

10035, 436844, 42463, 44774 => 175656.78441352615

45,67,32,98,11,3 => 32.530327730015607

1,1,1,1,1,1 => 0.0

勝ち

最短のプログラムまたは機能が優先されます。

リーダーボード


1
出力は浮動小数点OR整数でなければなりませんか?
ムタドール

3
ほとんどの組み込み標準偏差関数は、サンプルの標準偏差を計算すると思います。
ムタドール

入力リストが無効の場合はどうですか?175656.78441352615私に結果175656.78441352614
RosLuP

@RosLuPあなたはそれについて心配する必要はありません
ベータ崩壊

1
@ a13a22 PPCGの標準ルールごとに、あなたは関数の引数を介して入力を取るために罰金されているような
ベータ崩壊

回答:


18

クリップ、3

.sk

.sは標準偏差kで、形式の入力を解析します{1,2,3}


標準偏差に使用される式は何ですか?私は彼が参照する中でそれを見つけることができませんでした。
flawr

@flawr 下の方にあるこのチャートです。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ私はそれを見ましたが、式はありません。
-flawr

@flawrああ、なるほど。そのようなものが存在する場合、おそらくそれは通訳者次第です。
コナーオブライエン

2
@CᴏɴᴏʀO'Bʀɪᴇɴ ここで493行目で見つけましたが、大丈夫そうです!
-flawr

11

Mathematica、24 22バイト

素晴らしい、Mathematicaには、StandardDevi...母標準偏差ではなくサンプルの標準偏差を計算する組み込みのoh ...があります。

しかし、我々がVariance...ああ...同じ取引を使用したらどうでしょう。

しかし、さらに別の関連ビルトインがあります:

CentralMoment[#,2]^.5&

わーい。:)

これは22バイトでも機能します。

Mean[(#-Mean@#)^2]^.5&

そしてこれは27のために:

N@RootMeanSquare[#-Mean@#]&

10

オクターブ、14バイト

g=@(a)std(a,1)

ideoneで試してみてください。


2
g=関数ハンドルは有効な送信に名前を必要としないため、削除することで2バイトを節約できます。
アレックスA.

10

kdb +、3バイト

dev

APL derviatesの1つは、これを組み込みとして持っていなければなりませんでし

試運転

q)dev 56, 54, 89, 87
16.53028
q)f:dev
q)f 10035, 436844, 42463, 44774
175656.8
q)f 45,67,32,98,11,3
32.53033

8

Dyalog APL、24 23 21 20 19 17バイト

*∘.5∘M×⍨-M×M←+/÷≢

これは、次の関数に相当する、名前のない単項関数列を定義します。

{.5*⍨M(×⍨⍵)-M⍵×(M←{(+/⍵)÷≢⍵})⍵}

TryAPLでオンラインで試してください。

使い方

コードは複数のトレインで構成されています。

M←+/÷≢

これは、正しい引数に対して(すべての要素の合計)および(長さ)をM実行し、結果に適用(除算)し、入力の算術平均を返すモナド3トレイン(フォーク)を定義します。+/÷

M×M

これは、適用され、別のフォークでありM、右の引数には、この二度目を繰り返し、適用×戻り、結果を(製品)μ 2

×⍨-(M×M)

これは、前述のように算術平均の二乗を計算×⍨し、正しい引数に(それ自体との積)を適用し、最終的-に結果に(差)を適用する別のフォークです。

入力のための(X 1、...、xはNを、この関数が返す(X 1 - μ 2、...、xはN - μ 2

*∘.5∘M

この合成関数はM、その正しい引数に適用され、次にになり*∘.5ます。後者は、正しい引数のカリー化を使用して、マップ入力aa*0.5(の平方根a)に適用します。

(*∘.5∘M)(×⍨-(M×M))

最後に、このモナド2トレイン(上)があります。これは、最初に右の関数を適用し、次にその結果に左を適用し、次のように標準偏差を計算します。

式


5

R、41 40 39 36 30 28バイト

コード

beakerAlex A.およびMickyTに多くのバイトをありがとう。

cat(sd(c(v=scan(),mean(v))))   

古いコード

v=scan();n=length(v);sd(v)/(n/(n-1))**0.5
m=scan();cat(sqrt(sum(mean((m-mean(m))^2))))
m=scan();cat(mean((m-mean(m))^2)^.5) 

これにより、母標準偏差が得られます。


1
私はRを知りませんが、配列の平均で入力配列を増やすことは可能でしょうか?短いかもしれません。
ビーカー

1
このサイトでは、質問で明示的に許可されない限り、通常REPL環境を想定できません。したがって、この場合cat、コンソールへの印刷に使用する必要があります。
アレックスA.

1
また、Rは^累乗に使用し**ます。これは、よりも短いバイトです。
アレックスA.

1
meanスカラーを返すため、平均を合計する必要はありません。sum効果がありません。36バイト:x=scan();cat(mean((x-mean(x))^2)^.5)
アレックスA.

1
@AndréMuta謝罪、私がそれをテストしたとき、Xがぶらぶらしていた。
MickyT

5

Pyth、20 19 17 13バイト

@.O^R2-R.OQQ2

4バイトのゴルフをしてくれた@FryAmTheEggmanに感謝します!

オンラインでお試しください。

使い方

        .OQ    Compute the arithmetic mean of the input (Q).
      -R   Q   Subtract the arithmetic mean of all elements of Q.
   ^R2         Square each resulting difference.
 .O            Compute the arithmetic mean of the squared differences.
@           2  Apply square root.

Pythプログラムの分解が歪んだ放物線のように見えるのが好きです。
コナーオブライエン

5

CJam、24 22 21バイト

q~_,_@_:+d@/f-:mh\mq/

1バイトのゴルフをしてくれた@aditsuに感謝!

CJamインタープリターでオンラインで試してください。

使い方

q~                    e# Read all input and evaluate it.
  _,                  e# Copy the array and push its length.
    _@                e# Copy the length and rotate the array on top.
      _:+d            e# Copy the array and compute its sum. Cast to Double.
          @/          e# Rotate the length on top and divide the sum by it.
            f-        e# Subtract the result (μ) from the array's elements.
              :mh     e# Reduce by hypotenuse.
                      e# a b mh -> sqrt(a^2 + b^2)
                      e# sqrt(a^2 + b^2) c mh -> sqrt(sqrt(a^2 + b^2)^2 + c^2)
                      e#                           = sqrt(a^2 + b^2 + c^2)
                      e# ⋮
                 \mq/ e# Divide the result by the square root of the length.

長さを2倍に変換できると思う
-aditsu

@aditsuもちろん。ありがとう!
デニス

5
:mhは天才です:)
aditsu

2
Reduce by hypotenuse.毎日目にするものではありません。
リトシアスト

4

APL、24バイト

{.5*⍨+/(2*⍨⍵-+/⍵÷≢⍵)÷≢⍵}

DennisのDyalog APLソリューションとは少し異なるアプローチ。これは、APL実装で機能するはずです。

これは、ベクトルを計算する無名単項関数を作成する(X - μ2など2*⍨⍵-+/⍵÷≢⍵、によって除算このN÷≢⍵)、使用して、このベクトルの和をとり+/、その後、平方根をとります(.5*⍨)。

オンラインで試す


必ずしもすべてのAPLの実装ではサポートされてい{DFNS }または。しかし、すべてのバージョンのサポートR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
アダム

4

ジュリア、26 19バイト

x->std([x;mean(x)])

これにより、配列を受け取り、floatを返す名前のない関数が作成されます。

Ungolfed、私は推測する:

function f(x::Array{Int,1})
    # Return the sample standard deviation (denominator N-1) of
    # the input with the mean of the input appended to the end.
    # This corrects the denominator to N without affecting the
    # mean.
    std([x; mean(x)])
end

4

TI-BASIC、7バイト

stdDev(augment(Ans,{mean(Ans

ここからサンプル標準偏差から母標準偏差を取得するためにアルゴリズムを借りました。

私が見つけることaugment(ができる最短の解決策は9バイトです:

stdDev(Ans√(1-1/dim(Ans

AndréMutaに同意しますが、これでは必要な結果が得られません。こちらを
-flawr

1
@AndréMuta@flawr TIの組み込みstdDev(関数がサンプルSDを計算します。stdDev(augment(Ans,{mean(Ans母集団SDを計算します。リンク先のページにあります。
リルトシアスト

3

Haskell、61バイト

d n=1/sum(n>>[1])
f a=sqrt$d a*sum(map((^2).(-)(d a*sum a))a)

sum(n>>[1])Haskellの厳密な型システムをtrickすためのカスタムの長さ関数を除き、簡単です。


あなたは使用することができますsum(1<$n)し、<$>ためmap
ライコニ

この答えの時点で古いGHCバージョンのためにそれらの機能が存在しない可能性があることがちょうど思い浮かびましたが、このヒントによれば、2015年3月にプレリュードに導入され、サイトポリシーは新しい言語を許可するように変更されました特徴。
ライコニ

3

Python 3.4以降、30バイト

from statistics import*;pstdev

組み込み関数をインポートしますpstdev、例えば

>>> pstdev([56,54,89,87])
16.53027525481654

pstdev最初の行が大丈夫だと思う?私はxnorがしばらく前にそれをやったと信じていsumます。それは一種の無意味なラムダがどのように使用されるかについて理にかなっていますすなわちp=pstdevmap(pstdev, [...])
FryAmTheEggman

私は同じことを言うつもりでした。メタ投稿は、関数リテラルを置くだけをサポートしているようです。
xnor

pstdevただし、のようにリテラルを記述する必要があると思いますfrom statistics import*;pstdev。それ以外の場合、これはそのライブラリの任意の関数になります。
xnor

@xnor編集済み。tbhこれらの状況の裁定については本当にわからない...
Sp3000

たぶんメタ質問が役立つでしょうか?:)
ベータ崩壊

2

JavaScript(ES6)、73バイト

a=>Math.sqrt(a.reduce((b,c)=>b+(d=c-eval(a.join`+`)/(l=a.length))*d,0)/l)

@BetaDecay出力の精度に関して?私のオリジナルは実際にはそのような正しいものを持っていなかったので、すぐに修正しました。
Mwr247

うん、大丈夫です:)
ベータ崩壊

7
PSSTは...あなたは、この加算法を用いて、5つのバイトをオフに剃ることができますeval(a.join`+`)代わりに a.reduce((e,f)=>e+f)
ジョージReithの

@GeorgeReithすてきなトリック!それを後で覚えておく必要があります
...-Mwr247

2

ゼリー、非競合

11バイト この回答は、チャレンジより後の言語を使用しているため、競合しません。

S÷L
Dz_²ÇN½

これは、Jelly に対するAPLの回答を直接翻訳したものです。オンラインでお試しください!

使い方

S÷L        Helper link. Argument: z (vector)

S          Compute the sum of z.
  L        Compute the length of z.
 ÷         Divide the former by the latter.
           This computes the mean of z.

Dz_²ÇN½    Main link. Argument: z (vector)

Ç          Apply the previous link, i.e., compute the mean of z.
 ²         Square the mean.
   ²       Square all number in z.
  _        Subtract each squared number from the squared mean.
    Ç      Take the mean of the resulting vector.
     N     Multiply it by -1.
      ½    Take the square root of the result.

2

J、18バイト

[:%:@M*:-M*M=:+/%#

これは、J に対するAPLの回答の直接翻訳です。

オンラインでお試しください!


M定義済みのビルトインだとは思いもしませんでした
コナーオブライエン

そうではありません。M=:+/%#インライン関数定義です。
デニス

しかし、定義済みですよね?おそらくビルトインは間違った用語です
コナーオブライエン

いいえ、事前定義されていません。M=:+/%#に動詞+/%#を保存してMから呼び出します。
デニス

私はXD私は最後の部分を見ていない申し訳ありません
コナー・オブライエン

1

シンプレックスv.0.5、43バイト

ただ 私はこれをもう1バイトゴルフする必要があります。

t[@u@RvR]lR1RD@wA@T@{j@@SR2ERpR}u@vR@TR1UEo   
t[      ]                                     ~~ Applies inner function to entire strip (left-to-right)
  @                                           ~~ Copies current value to register
   u                                          ~~ Goes up a strip level
    @                                         ~~ Dumps the register on the current byte
     R                                        ~~ Proceeds right (s1)
      v                                       ~~ Goes back down
       R                                      ~~ Proceeds right (s0)
                                              ~~ Go right until an empty byte is found
         lR1RD                                ~~ Push length, 1, and divide.
              @                               ~~ Store result in register (1/N)
               wA                             ~~ Applies A (add) to each byte, (right-to-left)
                 @T@                          ~~ Puts 1/N down, multiplies it, and copies it to the register
                    {          }              ~~ Repeats until a zero-byte is met
                     j@@                      ~~ inserts a new byte and places register on it
                        SR                    ~~ Subtract it from the current byte and moves right
                          2E                  ~~ Squares result
                            RpR               ~~ Moves to the recently-created cell, deletes it, and continues
                                u@v           ~~ takes 1/N again into register
                                   R@T        ~~ multiplies it by the new sum
                                      R1UE    ~~ takes the square root of previous
                                          o   ~~ output as number

1

プロローグ(SWI)、119バイト

コード:

q(U,X,A):-A is(X-U)^2.
p(L):-sumlist(L,S),length(L,I),U is S/I,maplist(q(U),L,A),sumlist(A,B),C is sqrt(B/I),write(C).

説明:

q(U,X,A):-A is(X-U)^2.   % calc squared difference of X and U
p(L):-sumlist(L,S),      % sum input list
      length(L,I),       % length of input list
      U is S/I,          % set U to the mean value of input list
      maplist(q(U),L,A), % set A to the list of squared differences of input and mean
      sumlist(A,B),      % sum squared differences list
      C is sqrt(B/I),    % divide sum of squares by length of list
      write(C).          % print answer

例:

p([10035, 436844, 42463, 44774]).
175656.78441352615

こちらからオンラインでお試しください


1

Perl5の、39 38


 スクリプトの16
のために+22 Mスイッチ
用+ 1 Eスイッチ
= 39

perl -MStatistics::Lite=:all -E"say stddevp@ARGV" .1 .2 300

Strawberry 5.20.2でテスト済み。


ああ、しかし、私はあなたが私たちの答えがプログラムの代わりに機能であると言ったことに気づきました。その場合、

{use Statistics::Lite":all";stddevp@_}

わずか38。Strawberry 5.20.2でテスト済み

print sub{use Statistics::Lite":all";stddevp@_}->( .1, .2, 300)

0

Python、57バイト

lambda l:(sum((x-sum(l)/len(l))**2for x in l)/len(l))**.5

入力をリストとして取得します

ありがとう@xnor


バイトを保存する.5代わりにできると思います0.5。またのlen(x)代わりにlen(l)
アレックスA.

@AlexA。うう、いや、私はそうは思いません...
ベータ崩壊

1
申し訳ありませんが、混乱しました。無視xしてlナンセンス。ただし.5、バイトを保存することはできます。
アレックスA.

1
@BetaDecayラムダをマップするよりもlist-compを使用する方が短い:sum((x-sum(l)/len(l))**2for x in l)
xnor

1
異なる製剤は、同じ長さを与えました:lambda l:(sum(x*x*len(l)for x in l)-sum(l)**2)**.5/len(l)
xnor

0

PowerShell、122

:\>type stddev.ps1
$y=0;$z=$args -split",";$a=($z|?{$_});$c=$a.Count;$a|%{$y+=$_};$b=$y/$c;$a|%{$x+
=(($_-$b)*($_-$b))/$c};[math]::pow($x,0.5)

説明

<#
$y=0                            init
$z=$args -split","              split delim ,
$a=($z|? {$_})                  remove empty items
$c=$a.Count                     count items
$a|%{$y+=$_}                    sum
$b=$y/$c                        average
$a|%{$x+=(($_-$b)*($_-$b))/$c}  sum of squares/count
[math]::pow($x,0.5)             result
#>

結果

:\>powershell -nologo -f stddev.ps1 45,67,32,98,11,3
32.5303277300156

:\>powershell -nologo -f stddev.ps1 45,  67,32,98,11,3
32.5303277300156

:\>powershell -nologo -f stddev.ps1 45,  67,32, 98 ,11,3
32.5303277300156

:\>powershell -nologo -f stddev.ps1 10035, 436844, 42463, 44774
175656.784413526

:\>powershell -nologo -f stddev.ps1 1,1,1,1,1,1
0

0

Fortran、138バイト

Fortranでの方程式の単純な実装:

double precision function std(x)
integer,dimension(:),intent(in) :: x
std = norm2(dble(x-sum(x)/size(x)))/sqrt(dble(size(x)))
end function

0

SmileBASIC、105バイト(関数として)

私はちょうどそれが関数であることが許可されていることに気付きました。おっと、それは私の答えを劇的に減らします。これは、S配列を取り、母標準偏差を返す関数を定義します。説明のためにもう一方を読みに行きますが、解析部分をスキップします。二度とやりたくない。

DEF S(L)N=LEN(L)FOR I=0TO N-1U=U+L[I]NEXT
U=1/N*U FOR I=0TO N-1T=T+POW(L[I]-U,2)NEXT RETURN SQR(1/N*T)END

プログラムとして、212バイト

残念ながら、入力リストを文字列として取得し、自分で解析する必要があります。これにより、100バイト以上が回答に追加されるため、コンマ区切りリスト以外の入力形式が許可されていれば、喜んで聞きます。またVAL、バグがあるため、カンマのにスペースがあるか、文字列の末尾にあるとプログラムが中断することに注意してください。コンマの後、または文字列の先頭で問題ありません。

DIM L[0]LINPUT L$@L I=INSTR(O,L$,",")IF I>-1THEN PUSH L,VAL(MID$(L$,O,I-O))O=I+1GOTO@L ELSE PUSH L,VAL(MID$(L$,O,LEN(L$)-O))
N=LEN(L)FOR I=0TO N-1U=U+L[I]NEXT
U=1/N*U FOR I=0TO N-1T=T+POW(L[I]-U,2)NEXT?SQR(1/N*T)

ゴルフをしていないと説明:

DIM L[0]  'define our array
LINPUT L$ 'grab string from input

'parse list
'could've used something cleaner, like a REPEAT, but this was shorter
@L
I=INSTR(O,L$,",")                 'find next comma
IF I>-1 THEN                      'we have a comma
 PUSH L,VAL(MID$(L$,O,I-O))       'get substring of number, parse & store
 O=I+1                            'set next search location
 GOTO @L                          'go again
ELSE                              'we don't have a comma
 PUSH L,VAL(MID$(L$,O,LEN(L$)-O)) 'eat rest of string, parse & store
ENDIF                             'end

N=LEN(L) 'how many numbers we have

'find U
'sum all of the numbers, mult by 1/N
FOR I=0 TO N-1
 U=U+L[I]
NEXT
U=1/N*U

'calculate our popstdev
'sum(pow(x-u,2))
FOR I=0 TO N-1
 T=T+POW(L[I]-U,2)
NEXT
PRINT SQR(1/N*T) 'sqrt(1/n*sum)

0

公理、137バイト

m(a:List Float):Complex Float==(#a=0=>%i;reduce(+,a)/#a)
s(a:List Float):Complex Float==(#a=0=>%i;n:=m(a);sqrt(m([(x-n)^2 for x in a])))

関数m()は、入力のリストの平均を返します。エラー時の両方の関数は、虚数定数sqrt(-1)を返します。テストと結果のコード。[しかし、結果がOKなら、それは1つの複素数の実数部です]

(6) -> s([45,67,32,98,11,3])
   (6)  32.5303277300 15604966

(7) -> s([10035,436844,42463,44774])
   (7)  175656.7844135261 4035

(8) -> s([1,1,1,1,1,1])
   (8)  0.0


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.