표준 편차 계산


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
출력이 부동 소수점 또는 정수 여야합니까?
Mutador

3
대부분의 내장 표준 편차 함수가 샘플 표준 편차를 계산한다고 생각합니다.
Mutador

? 어떤 입력리스트가 무효 인 경우에 대한 175656.78441352615 결과 나에게 175656.78441352614
RosLuP

@RosLuP 당신은 그것에 대해 걱정할 필요가 없습니다
Beta Decay

1
@ a13a22 PPCG의 표준 규칙에 따라 함수 인수를 통해 입력을받는 것이 좋습니다
Beta Decay

답변:


18

클립 , 3

.sk

.s표준 편차이며 k형식으로 입력을 구문 분석합니다 {1,2,3}.


표준 편차에 어떤 공식이 사용됩니까? 그가 참조한 곳에서 찾을 수 없었습니다.
flawr

@flawr 이 차트 는 아래쪽을 향합니다.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 나는 그것을 보았지만 주어진 공식은 없습니다.
flawr

@flawr 아, 알겠습니다. 아마도 그런 일이 존재한다면 그것은 통역사에게 달려 있습니다.
Conor O'Brien

2
CᴏɴᴏʀO'Bʀɪᴇɴ 내가 그것을 발견 @ 여기 라인 493에, 확인을 것 같다!
flawr

11

수학, 24 22 바이트

Mathematica에는 StandardDevi...모집단 표준 편차가 아닌 표본 표준 편차를 계산 하는 내장 오 ...가 있습니다.

그러나 만약 우리가 Variance... 오 ... 같은 거래를 사용한다면 어떨까요?

그러나 또 다른 관련 내장 기능이 있습니다.

CentralMoment[#,2]^.5&

예 :)

이것은 22 바이트에서도 작동합니다.

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

그리고 이것은 27입니다.

N@RootMeanSquare[#-Mean@#]&


10

kdb + , 3 바이트

dev

APL 편차 중 하나 는 이것을 내장형 으로 가져야했습니다.

시운전

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←+/÷≢

이것은 명명되지 않은 monadic 기능 트레인을 정의하며, 이는 다음 기능과 동일합니다.

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

온라인에서 사용해보십시오 TryAPL에서 .

작동 원리

코드는 여러 열차로 구성됩니다.

M←+/÷≢

이것은 올바른 인수에 대해 ( 모든 요소의 합) 및 (길이)를 M실행 한 다음 결과에 적용 (분할)하여 입력의 산술 평균을 반환 하는 모나 딕 3 트레인 (포크) 을 정의합니다 .+/÷

M×M

이것은 M올바른 인수에 적용 되고 두 번째로 반복 ×되며 결과에 (제품)을 적용 하여 μ 2를 반환 하는 또 다른 포크입니다 .

×⍨-(M×M)

이것은 이전에 설명한 산술 평균의 제곱을 계산 ×⍨하고 올바른 인수에 (자체가있는 제품) 적용하고 마지막으로 적용되는 또 다른 포크입니다.- 하고 결과에 (차이) .

입력 (x 1 ,…, x N ) 의 경우이 함수는 (x 12 ,…, x N2 )를 반환합니다 .

*∘.5∘M

이 작성된 함수는 M올바른 인수에 적용됩니다 *∘.5. 후자는 올바른 인수 카레를 사용하여지도 입력 aa*0.5(square root of a)에 적용합니다.

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

마지막으로,이 모나 딕 2 트레인 (위)은 오른쪽 기능을 먼저 적용한 다음 왼쪽을 결과에 적용하여 다음과 같이 표준 편차를 계산합니다.

formula


5

R, 41 40 39 36 30 28 바이트

암호

덕분에 비커 , 알렉스 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콘솔에 인쇄하는 데 사용해야 합니다.
Alex A.

1
또한 R은 ^지수보다 짧은 바이트를 사용 합니다 **.
Alex A.

1
mean스칼라를 반환 하므로 평균을 합산 할 필요는 없습니다 . sum효과가 없습니다. 36 바이트 :x=scan();cat(mean((x-mean(x))^2)^.5)
Alex 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 프로그램의 분해가 어떻게 왜곡 된 포물선처럼 보이는지 좋아합니다.
Conor O'Brien

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.

길이를 두 배로 변환 할 수 있다고 생각합니다
aditsu

@aditsu 물론입니다. 감사!
Dennis

5
:mh는 천재 btw입니다 :)
aditsu

2
Reduce by hypotenuse.매일 보는 것이 아닙니다.
lirtosiast

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
Adám

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를 계산합니다. 링크 된 페이지에 있습니다.
lirtosiast

3

하스켈, 61 바이트

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

sum(n>>[1])Haskell의 엄격한 유형 시스템을 속이는 내 사용자 정의 길이 함수 를 제외하고는 간단합니다.


sum(1<$n)<$>에 사용할 수 있습니다 map.
Laikoni

단지 그 기능 때문에이 답변시 이전 GHC 버전으로 존재하지 않을 수 있음을 나에게 발생하지만,에 따라 이 팁 들은 월 2015 년 서곡에 도입하고, 사이트 정책 어쨌든 새로운 언어를 할 수 있도록 변경되었습니다 풍모.
Laikoni

3

파이썬 3.4+, 30 바이트

from statistics import*;pstdev

내장 함수를 가져옵니다 pstdev. 예 :

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

pstdev첫 줄 바로 다음에 괜찮다고 생각 합니까? 나는 xnor가 얼마 전에와 함께했다고 생각 sum합니다. 그것은 종류의 차종 감지 WRT의 방법 익명 람다는 즉 사용됩니다 p=pstdev또는map(pstdev, [...])
FryAmTheEggman

나는 같은 말을하려고했다. 메타 게시물은 함수 리터럴을 넣는 것을 지원하는 것 같습니다.
xnor

나는 여전히 그대로 쓸 필요가 있다고 생각 pstdev과 같은 생각을 from statistics import*;pstdev. 그렇지 않으면 해당 라이브러리의 함수일 수 있습니다.
xnor

@xnor 편집했습니다. 이 상황에 대한 판결에 대해 확신이
서지 않습니다

메타 질문이 도움이 될까요? :)
Beta Decay

2

자바 스크립트 (ES6), 73 바이트

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

@BetaDecay 출력의 정밀도와 관련하여? 내 원본에는 실제로 그 정확성이 없었으며 바로 부동 소수점을 발견하는 것만으로도 문제가 해결되었습니다. 그래서 지금처럼 좋습니까?
Mwr247

그래, 괜찮아 :)
Beta Decay

7
Psst ... eval(a.join`+`)대신 이 합산 방법을 사용하여 5 바이트를 줄일 수 있습니다.a.reduce((e,f)=>e+f)
George Reith

@GeorgeReith 멋진 트릭! 나는 나중에 그 것을 기억해야 할 것입니다 ...
Mwr247

2

비경쟁 젤리

11 바이트이 답변은 도전 과제를 게시 한 언어를 사용하므로 경쟁이 아닙니다.

S÷L
Dz_²ÇN½

이것은 내 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=:+/%#

이것은 내 APL 답변 의 직접 번역입니다. 을 J

온라인으로 사용해보십시오!


M사전 정의 된 내장 기능을 몰랐 습니다.
Conor O'Brien

그렇지 않습니다. M=:+/%#인라인 함수 정의입니다.
Dennis

그러나 미리 정의되어 있습니까? 아마도 내장은 잘못된 용어 일 것입니다
Conor O'Brien

아니요, 사전 정의되지 않았습니다. 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

펄 5, 39 38


 스크립트 16
대한 +22 M스위치
위한 + 1 E스위치
(39) =

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

딸기에서 테스트 5.20.2.


아, 그러나 나는 당신이 우리의 대답이 프로그램 대신 기능 일 수 있다고 말했다는 것을 깨달았습니다. 이 경우

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

딸기 5.20.2에서 다음과 같이 테스트되었습니다.

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

0

파이썬, 57 바이트

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

입력을 목록으로 취합니다

감사합니다 @xnor


바이트를 저장하는 .5대신 할 수 있다고 생각합니다 0.5. 또한 len(x)대신에 의미 len(l)합니까?
Alex A.

@AlexA. 어, 아니, 난 그렇게 생각하지 않습니다 ...
Beta Decay

1
죄송합니다. 혼란 스러웠습니다. 무시 x하고 l말도. 그러나 여전히 .5바이트를 저장하기 위해 할 수 있습니다 .
Alex 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

포트란, 138 바이트

포트란에서 방정식의 간단한 구현 :

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)를 % i로 반환합니다. 테스트 및 결과 코드. [그러나 결과가 괜찮다면 하나의 복소수의 실제 부분입니다]

(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


0

Pyt , 13 바이트

←Đ↔Ł↔е-²Ʃ⇹/√

표준 편차에 대한 공식을 구현합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.