Calcola deviazione standard


19

Sfida

Dato un elenco di numeri, calcolare la deviazione standard della popolazione dell'elenco.

Utilizzare la seguente equazione per calcolare la deviazione standard della popolazione:

Ingresso

L'input sarà un elenco di numeri interi in qualsiasi formato (elenco, stringa, ecc.). Qualche esempio:

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

I numeri saranno sempre numeri interi.

L'input sarà su STDIN o argomenti di funzione.

Produzione

L'output deve essere un numero in virgola mobile.

Regole

È possibile utilizzare le funzioni integrate per trovare la deviazione standard.

La tua risposta può essere un programma completo o una funzione.

Esempi

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

vincente

Vince il programma o la funzione più breve.

Classifica


1
Vuoi dire che l'output deve essere in virgola mobile o intero?
Mutador,

3
Penso che la maggior parte delle funzioni di deviazione standard integrate calcoli la deviazione standard del campione.
Mutador,

Che dire se l'elenco di input è nullo? 175656.78441352615 mi risulta 175656.78441352614
RosLuP

@RosLuP Non devi preoccuparti di questo
Decadimento beta

1
@ a13a22 Secondo le regole standard di PPCG, puoi accettare input tramite argomenti di funzione
Decadimento beta

Risposte:


18

Clip , 3

.sk

.sè la deviazione standard, kanalizza l'input nel modulo {1,2,3}.


Quale formula viene utilizzata per la deviazione standard? Non riuscivo a trovarlo nel suo riferimento.
Flawr,

@flawr È questa tabella , verso il fondo.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ L'ho visto, ma non esiste una formula.
Flawr

@flawr Oh, capisco. Forse allora spetta all'interprete, se esiste una cosa del genere.
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ L'ho trovato qui sulla linea 493, sembra essere ok!
Flawr

11

Mathematica, 24 22 byte

Bene, Mathematica ha un StandardDevi...oh ... incorporato che calcola la deviazione standard del campione, non la deviazione standard della popolazione.

E se Varianceusassimo ... oh ... stesso affare.

Ma c'è ancora un altro built-in correlato:

CentralMoment[#,2]^.5&

Sìì. :)

Questo funziona anche per 22 byte:

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

E questo per 27:

N@RootMeanSquare[#-Mean@#]&

10

Ottava, 14 byte

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

Provalo su ideone .


2
È possibile salvare due byte rimuovendoli g=poiché l'handle della funzione non ha bisogno di un nome per essere un invio valido.
Alex A.

10

kdb + , 3 byte

dev

Uno dei derviati APL doveva avere questo come incorporato.

Prova

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 byte

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

Questo definisce un treno di funzioni monadico senza nome, che equivale alla seguente funzione.

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

Provali online su TryAPL .

Come funziona

Il codice è composto da diversi treni.

M←+/÷≢

Questo definisce un monadico 3-train (fork) Mche esegue +/(somma di tutti gli elementi) e (lunghezza) per l'argomento giusto, quindi applica ÷(divisione) ai risultati, restituendo la media aritmetica dell'input.

M×M

Questo è un altro fork che si applica Mall'argomento giusto, lo ripete una seconda volta e applica ×(prodotto) ai risultati, restituendo μ 2 .

×⍨-(M×M)

Questo è un altro fork che calcola il quadrato della media aritmetica come spiegato prima, applica ×⍨(prodotto con se stesso) all'argomento giusto e infine applica -(differenza) ai risultati.

Per l'ingresso (x 1 ,…, x N ) , questa funzione restituisce (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Questa funzione composta si applica quindi Mal suo argomento giusto *∘.5. Quest'ultimo utilizza il giusto argomento curry per applicare l'input della mappa aa a*0.5(radice quadrata di a).

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

Infine, abbiamo questo monadico 2-treno (in cima), che applica prima la funzione destra, quindi la sinistra al suo risultato, calcolando la deviazione standard come segue.

formula


5

R, 41 40 39 36 30 28 byte

codice

Grazie a Becher , Alex A. e MickyT per molti byte.

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

vecchi codici

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) 

Ciò dovrebbe produrre la deviazione standard della popolazione.


1
Non conosco R, ma sarebbe possibile aumentare l'array di input con la media dell'array? Sembra che potrebbe essere più breve.
bicchiere

1
In questo sito in genere non possiamo assumere un ambiente REPL se non esplicitamente consentito dalla domanda. Quindi in questo caso dovrai usare catper stampare sulla console.
Alex A.

1
Inoltre, R usa ^per esponenziazione, che è un byte più corto di **.
Alex A.

1
Non è necessario sommare la media poiché meanrestituisce uno scalare; sumnon ha alcun effetto. 36 byte:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.

1
@AndréMuta si scusa, quando l'ho provato avevo una X in giro.
MickyT,

5

Pyth, 20 19 17 13 byte

@.O^R2-R.OQQ2

Grazie a @FryAmTheEggman per il golf off 4 byte!

Provalo online.

Come funziona

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

Mi piace come la decomposizione di un programma Pyth assomigli a una parabola inclinata.
Conor O'Brien,

5

CJam, 24 22 21 byte

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

Grazie a @aditsu per giocare a golf a 1 byte!

Provalo online nell'interprete CJam .

Come funziona

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.

Penso che puoi convertire solo la lunghezza in double
aditsu,

@aditsu Certo. Grazie!
Dennis,

5
:mhis genius btw :)
aditsu,

2
Reduce by hypotenuse.non è qualcosa che vedi tutti i giorni.
lirtosiast

4

APL, 24 byte

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

Un approccio leggermente diverso rispetto alla soluzione Dyalog APL di Dennis . Questo dovrebbe funzionare con qualsiasi implementazione APL.

Questo crea una funzione monadica senza nome che calcola il vettore ( x - µ ) 2 come 2*⍨⍵-+/⍵÷≢⍵, lo divide per N ( ÷≢⍵), prende la somma di questo vettore usando +/e quindi prende la radice quadrata ( .5*⍨).

Provalo online


Non tutte le implementazioni APL supporta {dfns }, o . Tuttavia, ogni versione supportaR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám

4

Julia, 26 19 byte

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

Questo crea una funzione senza nome che accetta un array e restituisce un float.

Ungolfed, immagino:

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 byte

stdDev(augment(Ans,{mean(Ans

Ho preso in prestito l'algoritmo per ottenere la deviazione standard della popolazione dalla deviazione standard del campione qui .

La soluzione più breve che potrei trovare senza augment(è di 9 byte:

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

Sono d'accordo con AndréMuta, questo non produce il risultato richiesto, vedi qui.
Flawr,

1
@ AndréMuta @flawr L'integrato di TI stdDev(calcola la SD di esempio; stdDev(augment(Ans,{mean(Anscalcola la popolazione SD. È sulla pagina a cui ti sei collegato.
Lirtosiast

3

Haskell, 61 byte

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

Semplice, tranne forse la mia funzione di lunghezza personalizzata sum(n>>[1])per ingannare il rigido sistema di tipi di Haskell.


Puoi usare sum(1<$n)e <$>per map.
Laikoni,

Mi è appena venuto in mente che quelle funzioni potrebbero non essere presenti a causa di una versione GHC precedente al momento della risposta, ma secondo questo suggerimento sono state introdotte per preludio a marzo 2015 e la politica del sito è cambiata comunque per consentire una lingua più recente Caratteristiche.
Laikoni,

3

Python 3.4+, 30 byte

from statistics import*;pstdev

Importa la funzione integrata pstdev, ad es

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

Penso che pstdevdopo la prima riga sia ok? Credo che xnor lo abbia fatto qualche tempo fa con sum. In un certo senso ha senso scrivere come verranno utilizzati lambda anonimi, ovvero p=pstdevomap(pstdev, [...])
FryAmTheEggman,

Stavo per dire la stessa cosa. I meta post sembrano supportare il fatto di mettere letteralmente una funzione.
xnor

Penso che devi ancora scrivere il letterale pstdev, come from statistics import*;pstdev. Altrimenti, questa potrebbe essere una qualsiasi funzione di quella libreria.
xnor

@xnor Edited. tbh non sono davvero sicuro della sentenza su queste situazioni ...
Sp3000,

Forse una meta domanda sarebbe utile? :)
Decadimento beta

2

JavaScript (ES6), 73 byte

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

@BetaDecay Per quanto riguarda la precisione dell'output? Il mio originale in realtà non aveva quello corretto, e l'ho corretto subito dopo, solo per scoprire che il virgola mobile era ok hehe ... Quindi va bene adesso come è?
Mwr247,

Sì, va bene :)
Decadimento beta

7
Psst ... puoi radere 5 byte usando questo metodo di somma eval(a.join`+`)invece di a.reduce((e,f)=>e+f)
George Reith,

@GeorgeReith Bel trucco! Devo ricordarmelo per dopo ...
Mwr247,

2

Gelatina , non competitiva

11 byte Questa risposta non è competitiva, poiché utilizza un linguaggio che postdatizza la sfida.

S÷L
Dz_²ÇN½

Questa è una traduzione diretta della mia risposta APL a Jelly. Provalo online!

Come funziona

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 byte

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

Questa è una traduzione diretta della mia risposta APL a J.

Provalo online!


Non avevo idea che Mfosse un predefinito predefinito.
Conor O'Brien,

Non lo è. M=:+/%#è una definizione di funzione inline.
Dennis,

Ma è predefinito, giusto? Forse incorporare è il termine sbagliato
Conor O'Brien,

No, non è predefinito. M=:+/%#salva il verbo +/%#in M, poi chiama.
Dennis,

Mi dispiace XD Non ho visto l'ultima parte
Conor O'Brien il

1

Simplex v.0.5 , 43 byte

Solo perche '. Ho davvero bisogno di giocare a golf con questo byte in più.

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

Prolog (SWI), 119 byte

Codice:

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

Spiegazione:

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

Esempio:

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

Provalo online qui


1

Perl5, 39 38


 16 per lo script
+22 per lo Mswitch
+ 1 per lo Eswitch
= 39

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

Testato su Fragola 5.20.2.


Oh, ma poi ho capito che hai detto che le nostre risposte possono essere funzioni anziché programmi. In quel caso,

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

ha solo 38. Testato in Strawberry 5.20.2 come

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

0

Python, 57 byte

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

Accetta input come elenco

Grazie @xnor


Penso che tu possa fare .5al posto di 0.5salvare un byte. Intendi anche len(x)invece di len(l)?
Alex A.

@AlexA. No, non credo proprio ...
Decadimento beta

1
Scusa, mi sono confuso. Ignorare l' xe lnonsense. Ma puoi ancora fare .5per salvare un byte.
Alex A.

1
@BetaDecay E 'più breve per utilizzare un elenco-comp di mappare un lambda: sum((x-sum(l)/len(l))**2for x in l).
xnor

1
Una formulazione diversa dato la stessa lunghezza: 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)

spiegazione

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

risultato

:\>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 byte

Solo un'implementazione diretta dell'equazione in 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 byte (come funzione)

Ho appena notato che può essere una funzione. Whoops, questo riduce drasticamente la mia risposta. Questo definisce una funzione Sche accetta un array e restituisce la deviazione standard della popolazione. Vai a leggere l'altro per una spiegazione, ma salta la parte di analisi. Non voglio farlo di nuovo.

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

Come programma, 212 byte

Sfortunatamente, devo prendere l'elenco di input come stringa e analizzarlo da solo. Ciò aggiunge oltre 100 byte alla risposta, quindi se è consentito un formato di input diverso da un elenco separato da virgole, sarei felice di ascoltarlo. Si noti inoltre che poiché VALè errato, avere uno spazio prima della virgola o trascinare la stringa interrompe il programma. Dopo la virgola o all'inizio della stringa va bene.

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)

Ungolfed e spiegato:

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

Assioma, 137 byte

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

La funzione m () restituisce la media dell'elenco in input. Entrambe le funzioni sull'errore restituiscono% i la costante immaginaria sqrt (-1). Codice per test e risultati. [ma il risultato se è ok, è la parte reale di un numero complesso]

(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 byte

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

Implements the formula for standard deviation

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.