Oblicz odchylenie standardowe

19

Wyzwanie

Biorąc pod uwagę listę liczb, oblicz odchylenie standardowe populacji na liście.

Użyj następującego równania, aby obliczyć odchylenie standardowe populacji:

Wejście

Na wejściu pojawi się lista liczb całkowitych w dowolnym formacie (lista, łańcuch itp.). Kilka przykładów:

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

Liczby zawsze będą liczbami całkowitymi.

Dane wejściowe będą do argumentów STDIN lub funkcji.

Wynik

Dane wyjściowe muszą być liczbą zmiennoprzecinkową.

Zasady

Możesz użyć wbudowanych funkcji, aby znaleźć odchylenie standardowe.

Twoja odpowiedź może być pełnym programem lub funkcją.

Przykłady

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Zwycięski

Najkrótszy program lub funkcja wygrywa.

Tabela liderów

Rozpad beta
źródło
1
Masz na myśli, że wyjście musi być liczbą zmiennoprzecinkową LUB liczbą całkowitą?
Mutador
3
Myślę, że większość wbudowanych funkcji odchylenia standardowego oblicza przykładowe odchylenie standardowe.
Mutador
A co, jeśli lista wejściowa jest nieważna? 175656.78441352615 wynik dla mnie 175656.78441352614
RosLuP
@RosLuP Nie musisz się o to martwić
Beta Decay
1
@ a13a22 Zgodnie ze standardowymi zasadami PPCG, możesz przyjmować dane wejściowe za pomocą argumentów funkcyjnych
Rozpad Beta

Odpowiedzi:

18

Klip , 3

.sk

.sjest odchyleniem standardowym, kanalizuje dane wejściowe w formularzu {1,2,3}.

Ypnypn
źródło
Jakiej formuły używa się do odchylenia standardowego? Nie mogłem tego znaleźć w referencjach.
flawr
@flawr To ten wykres , na dole.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Widziałem to, ale nie podano żadnej formuły.
flawr
@flawr Oh, rozumiem. Być może to zależy od tłumacza, jeśli coś takiego istnieje.
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Znalazłem go tutaj w linii 493, wydaje się być w porządku!
flawr
11

Mathematica, 24 22 bajtów

Fajnie, Mathematica ma wbudowane StandardDevi...... och, które oblicza odchylenie standardowe próbki, a nie odchylenie standardowe populacji.

Ale co, jeśli użyjemy Variance... och ... tej samej umowy.

Ale jest jeszcze jedno powiązane wbudowane:

CentralMoment[#,2]^.5&

Tak :)

Działa to również dla 22 bajtów:

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

A to dla 27:

N@RootMeanSquare[#-Mean@#]&
Martin Ender
źródło
10

Oktawa, 14 bajtów

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

Wypróbuj na ideone .

zlewka
źródło
2
Możesz zapisać dwa bajty, usuwając, g=ponieważ uchwyt funkcji nie potrzebuje nazwy, aby być poprawnym przesyłaniem.
Alex A.,
10

kdb + , 3 bajty

dev

Jeden z derwiatów APL musiał mieć to jako wbudowane.

Testowe uruchomienie

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
Dennis
źródło
8

Dyalog APL, 24 23 21 20 19 17 bajtów

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

Definiuje nienazwany, monadyczny ciąg funkcji, który jest równoważny z następującą funkcją.

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

Wypróbuj je online na TryAPL .

Jak to działa

Kod składa się z kilku pociągów.

M←+/÷≢

Definiuje monadyczny 3-pociąg (rozwidlenie), Mktóry wykonuje +/(sumę wszystkich elementów) i (długość) dla właściwego argumentu, a następnie stosuje ÷(dzielenie) do wyników, zwracając średnią arytmetyczną danych wejściowych.

M×M

Jest to kolejny rozwidlenie, które stosuje Msię do właściwego argumentu, powtarza to po raz drugi i stosuje ×(produkt) do wyników, zwracając μ 2 .

×⍨-(M×M)

Jest to kolejny rozwidlenie, które oblicza kwadrat średniej arytmetycznej, jak wyjaśniono wcześniej, stosuje ×⍨(produkt sam w sobie) do właściwego argumentu i ostatecznie stosuje -(różnicę) do wyników.

Dla danych wejściowych (x 1 ,…, x N ) funkcja zwraca (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Ta skomponowana funkcja ma Mzatem zastosowanie do jej właściwego argumentu *∘.5. Ten drugi używa poprawnego argumentu curry do zastosowania danych wejściowych ana mapie a*0.5(pierwiastek kwadratowy z a).

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

Wreszcie mamy ten monadyczny 2-ciąg (na szczycie), który najpierw stosuje prawą funkcję, a następnie lewą do wyniku, obliczając odchylenie standardowe w następujący sposób.

formuła

Dennis
źródło
5

R, 41 40 39 36 30 28 bajtów

kod

Dzięki zlewce , Alexowi A. i MickyT za wiele bajtów.

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

stare kody

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) 

Powinno to dać odchylenie standardowe populacji.

Mutador
źródło
1
Nie znam R, ale czy byłoby możliwe zwiększenie tablicy wejściowej za pomocą średniej tablicy? Wydaje się, że może być krótszy.
zlewka
1
Na tej stronie zazwyczaj nie możemy założyć środowiska REPL, chyba że pytanie wyraźnie na to zezwala. Dlatego w tym przypadku będziesz musiał użyć catdo drukowania na konsoli.
Alex A.
1
Również R używa ^do potęgowania, który jest bajtem krótszym niż **.
Alex A.
1
Nie musisz sumować średniej, ponieważ meanzwraca skalar; sumnie ma wpływu. 36 bajtów:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.,
1
@ AndréMuta przeprasza, kiedy go testowałem, miałem X w pobliżu.
MickyT,
5

Pyth, 20 19 17 13 bajtów

@.O^R2-R.OQQ2

Dzięki @FryAmTheEggman za grę w golfa na 4 bajtach!

Wypróbuj online.

Jak to działa

        .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.
Dennis
źródło
Podoba mi się, jak rozkład programu Pyth wygląda jak wypaczona parabola.
Conor O'Brien
5

CJam, 24 22 21 bajtów

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

Dzięki @aditsu za grę w golfa z 1 bajtu!

Wypróbuj online w interpretatorze CJam .

Jak to działa

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.
Dennis
źródło
Myślę, że można przeliczyć tylko długość na podwójne
aditsu
@aditsu Oczywiście. Dzięki!
Dennis
5
:mhjest geniuszem btw :)
aditsu
2
Reduce by hypotenuse.nie jest czymś, co widzisz każdego dnia.
lirtosiast
4

APL, 24 bajty

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

Trochę inne podejście niż rozwiązanie Dennis Dyalog APL . Powinno to działać z dowolną implementacją APL.

To tworzy nienazwaną funkcję monadyczną, która oblicza wektor ( x - µ ) 2, ponieważ 2*⍨⍵-+/⍵÷≢⍵dzieli go przez N ( ÷≢⍵), pobiera sumę tego wektora za pomocą +/, a następnie przyjmuje pierwiastek kwadratowy ( .5*⍨).

Wypróbuj online

Alex A.
źródło
Nie każda realizacja APL obsługuje {dfns }, lub . Jednak każda wersja obsługujeR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám
4

Julia, 26 19 bajtów

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

Tworzy to nienazwaną funkcję, która akceptuje tablicę i zwraca liczbę zmiennoprzecinkową.

Przypuszczam, że:

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
Alex A.
źródło
4

TI-BASIC, 7 bajtów

stdDev(augment(Ans,{mean(Ans

Pożyczyłem algorytm, aby uzyskać odchylenie standardowe populacji z próbki odchylenia standardowego od tutaj .

Najkrótsze rozwiązanie bez którego mogę znaleźć augment(to 9 bajtów:

stdDev(Ans√(1-1/dim(Ans
Thomas Kwa
źródło
Zgadzam się z AndréMutą, to nie daje wymaganego rezultatu, patrz tutaj.
flawr
1
@ AndréMuta @flawr Wbudowane oprogramowanie TI stdDev(oblicza próbkę SD; stdDev(augment(Ans,{mean(Ansoblicza SD populacji. To jest strona, do której linkujesz.
lirtosiast
3

Haskell, 61 bajtów

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

Prosto, z wyjątkiem mojej funkcji niestandardowej długości, sum(n>>[1])która może oszukać system ścisłego pisania Haskella.

nimi
źródło
Możesz używać sum(1<$n)i <$>dla map.
Laikoni
Właśnie przyszło mi do głowy, że funkcje te mogą nie być obecne ze względu na starszą wersję GHC w chwili udzielenia odpowiedzi, ale zgodnie z tą wskazówką zostały wprowadzone w celu wykluczenia w marcu 2015 r., A zasady witryny i tak uległy zmianie, aby umożliwić nowszy język cechy.
Laikoni
3

Python 3.4+, 30 bajtów

from statistics import*;pstdev

Importuje wbudowaną funkcję pstdev, np

>>> pstdev([56,54,89,87])
16.53027525481654
Sp3000
źródło
Myślę, że zaraz pstdevpo pierwszej linii jest w porządku? Myślę, że Xnor zrobił to jakiś czas temu sum. W pewnym sensie ma to sens, jak anonimowe lambd byłyby używane, tj. p=pstdevLubmap(pstdev, [...])
FryAmTheEggman
Chciałem powiedzieć to samo. Posty w Meta wydają się wspierać po prostu wstawienie funkcji dosłownie.
xnor
Myślę, że trzeba jeszcze napisać dosłowne pstdevchociaż, jak from statistics import*;pstdev. W przeciwnym razie może to być dowolna funkcja z tej biblioteki.
xnor
@xnor Edytowane. tbh Nie jestem do końca pewien co do orzeczenia w tych sytuacjach ...
Sp3000,
Może pomocne byłoby meta pytanie? :)
Beta Decay
2

JavaScript (ES6), 73 bajty

a=>Math.sqrt(a.reduce((b,c)=>b+(d=c-eval(a.join`+`)/(l=a.length))*d,0)/l)
Mwr247
źródło
@BetaDecay Odnośnie precyzji wyjścia? Mój oryginał właściwie nie miał tego poprawnego i naprawiłem go zaraz potem, tylko odkryłem, że zmiennoprzecinkowe było w porządku hehe ... Więc czy teraz jest dobrze?
Mwr247,
Tak, w porządku :)
Beta Decay
7
Psst ... możesz ogolić 5 bajtów przy użyciu tej metody sumowania eval(a.join`+`)zamiast a.reduce((e,f)=>e+f)
George Reith
@GeorgeReith Dobra sztuczka! Będę musiał pamiętać o tym na później ...
Mwr247,
2

Galareta , niekonkurująca

11 bajtów Ta odpowiedź jest niekonkurencyjna, ponieważ używa języka, który stanowi datę późniejszą wyzwania.

S÷L
Dz_²ÇN½

To jest bezpośrednie tłumaczenie mojej odpowiedzi APL na galaretkę. Wypróbuj online!

Jak to działa

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.
Dennis
źródło
2

J, 18 bajtów

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

To jest bezpośrednie tłumaczenie mojej odpowiedzi APL na J.

Wypróbuj online!

Dennis
źródło
Nie miałem pojęcia, że Mjest to predefiniowany wbudowany.
Conor O'Brien
To nie jest M=:+/%#jest definicją funkcji wbudowanej.
Dennis,
Ale to jest predefiniowane, prawda? Być może wbudowany jest niewłaściwy termin
Conor O'Brien
Nie, to nie jest predefiniowane. M=:+/%#oszczędza czasownika +/%#w M, a następnie wywołuje go.
Dennis,
Przepraszam XD Nie widziałem ostatniej części
Conor O'Brien
1

Simplex v.0.5 , 43 bajty

Po prostu. Naprawdę muszę zagrać w ten jeszcze jeden bajt.

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
Conor O'Brien
źródło
1

Prolog (SWI), 119 bajtów

Kod:

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).

Wyjaśnienie:

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

Przykład:

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

Wypróbuj online tutaj

Emigna
źródło
1

Perl5, 39 38


 16 dla skryptu
+22 dla Mprzełącznika
+ 1 dla Eprzełącznika
= 39

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

Testowane w Strawberry 5.20.2.


Och, ale potem zdałem sobie sprawę, że powiedziałeś, że nasze odpowiedzi mogą być funkcjami zamiast programami. W tym wypadku,

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

ma tylko 38. Testowano w Strawberry 5.20.2 as

print sub{use Statistics::Lite":all";stddevp@_}->( .1, .2, 300)
msh210
źródło
0

Python, 57 bajtów

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

Pobiera dane wejściowe jako listę

Dzięki @xnor

Rozpad beta
źródło
Myślę, że możesz zrobić .5zamiast 0.5zaoszczędzić bajt. Czy masz na myśli len(x)zamiast len(l)?
Alex A.,
@AlexA. Uhh, nie, nie sądzę ...
Rozpad Beta
1
Przepraszam, pomyliłem się. Zignoruj xi lbzdury. Ale nadal możesz zrobić, .5aby zapisać bajt.
Alex A.,
1
@BetaDecay Jest krótszy użyć listy-Comp niż mapować lambda: sum((x-sum(l)/len(l))**2for x in l).
xnor
1
Inny preparat otrzymano taką samą długość: 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)

wyjaśnienie

<#
$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
#>

wynik

:\>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
blabb
źródło
0

Fortran, 138 bajtów

Prosta implementacja równania w Fortranie:

double precision function std(x)
integer,dimension(:),intent(in) :: x
std = norm2(dble(x-sum(x)/size(x)))/sqrt(dble(size(x)))
end function
Time Laird
źródło
0

SmileBASIC, 105 bajtów (jako funkcja)

Właśnie zauważyłem, że może to być funkcja. Ups, to dramatycznie ogranicza moją odpowiedź. Definiuje funkcję, Sktóra pobiera tablicę i zwraca odchylenie standardowe populacji. Przeczytaj wyjaśnienie drugiego, ale pomiń część dotyczącą analizy. Nie chcę tego więcej robić.

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

Jako program 212 bajtów

Niestety muszę wziąć listę wejściową jako ciąg i sam ją przeanalizować. Dodaje to do odpowiedzi ponad 100 bajtów, więc jeśli dozwolony jest jakiś format wejściowy inny niż lista oddzielona przecinkami, chętnie go usłyszę. Zauważ też, że ponieważ VALjest błędny, spacja przed przecinkiem lub przeciąganie łańcucha przerywa program. Po przecinku lub na początku łańcucha jest w porządku.

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)

Nie golfił i wyjaśnił:

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)
ślimak_
źródło
0

Aksjomat, 137 bajtów

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])))

Funkcja m () zwróciłaby średnią z listy na wejściu. Obie funkcje po błędzie zwracają% i urojoną stałą sqrt (-1). Kod testu i wyników. [ale wynik, jeśli jest w porządku, jest to prawdziwa część jednej liczby zespolonej]

(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
RosLuP
źródło
0

Python 3 , 49 bajtów

lambda l,N:(sum((i-sum(l)/N)**2for i in l)/N)**.5

Wypróbuj online!

Pobiera llistę liczb całkowitych i Nliczbę obecnych liczb całkowitych.

musicman523
źródło
0

Pyt , 13 bajtów

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

Implementuje formułę odchylenia standardowego

mudkip201
źródło