Calcular desvio padrão

19

Desafio

Dada uma lista de números, calcule o desvio padrão da população da lista.

Use a seguinte equação para calcular o desvio padrão da população:

Entrada

A entrada exibirá uma lista de números inteiros em qualquer formato (lista, sequência, etc.). Alguns exemplos:

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

Os números sempre serão inteiros.

A entrada será para STDIN ou argumentos de função.

Resultado

A saída deve ser um número de ponto flutuante.

Regras

Você pode usar funções incorporadas para encontrar o desvio padrão.

Sua resposta pode ser um programa completo ou uma função.

Exemplos

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Ganhando

O programa ou função mais curto vence.

Entre os melhores

Beta Decay
fonte
11
Você quer dizer que a saída deve ser um ponto flutuante OU inteiro?
Mutador 15/10
3
Acho que a maioria das funções de desvio padrão embutidas calcula o desvio padrão da amostra.
Mutador 15/10
? Que tal se lista de entrada é nula 175656,78441352615 resultado para mim 175.656,78441352614
RosLuP
@RosLuP Você não precisa se preocupar com isso
Decay Beta 24/04
11
@ a13a22 De acordo com as regras padrão do PPCG, você pode receber informações por meio de argumentos de função
Decay Beta

Respostas:

18

Clipe , 3

.sk

.sé o desvio padrão, kanalisa a entrada no formulário {1,2,3}.

Ypnypn
fonte
Qual fórmula é usada para o desvio padrão? Não consegui encontrá-lo na referência.
flawr
@ flawr É este gráfico , na parte inferior.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Eu vi isso, mas não há fórmula dada.
flawr
@ flawr Oh, entendo. Talvez então seja do intérprete, se isso existe.
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Encontrei aqui na linha 493, parece estar bem!
flawr
11

Mathematica, 24 22 bytes

Bom, o Mathematica possui um StandardDevi...oh embutido ... que calcula o desvio padrão da amostra, não o desvio padrão da população.

Mas e se usarmos Variance... oh ... o mesmo acordo.

Mas há ainda outro recurso relacionado:

CentralMoment[#,2]^.5&

Yay. :)

Isso também funciona para 22 bytes:

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

E isso por 27:

N@RootMeanSquare[#-Mean@#]&
Martin Ender
fonte
10

Oitava, 14 bytes

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

Experimente em ideone .

taça
fonte
2
Você pode salvar dois bytes removendo, g=pois o identificador da função não precisa de um nome para ser um envio válido.
Alex A.
10

kdb + , 3 bytes

dev

Um dos derviados da APL precisava ter isso como incorporado.

Execução de teste

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
fonte
8

Dyalog APL, 24 23 21 20 19 17 bytes

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

Isso define um trem de função monádico sem nome, que é equivalente à seguinte função.

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

Experimente online no TryAPL .

Como funciona

O código consiste em vários trens.

M←+/÷≢

Isso define um trem monádico (bifurcação) Mque executa +/(soma de todos os elementos) e (comprimento) para o argumento correto, depois aplica ÷(divisão) aos resultados, retornando a média aritmética da entrada.

M×M

Essa é outra bifurcação que se aplica Mao argumento correto, repete isso uma segunda vez e aplica ×(produto) aos resultados, retornando µ 2 .

×⍨-(M×M)

Este é mais um garfo que calcula o quadrado da média aritmética conforme explicado anteriormente, aplica-se ×⍨(produto próprio) ao argumento correto e, finalmente, aplica-se -(diferença) aos resultados.

Para entrada (x 1 ,…, x N ) , esta função retorna (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Essa função composta é aplicada Mao seu argumento correto, então *∘.5. O último usa o argumento correto para aplicar a entrada do mapa aem a*0.5(raiz quadrada de a).

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

Por fim, temos esse trem monádico de dois trens (em cima), que aplica primeiro a função correta e depois a esquerda ao resultado, calculando o desvio padrão da seguinte maneira.

Fórmula

Dennis
fonte
5

R, 41 40 39 36 30 28 bytes

código

Obrigado ao beaker , Alex A. e MickyT, por muitos bytes.

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

códigos antigos

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) 

Isso deve gerar o desvio padrão da população.

Mutador
fonte
11
Eu não sei R, mas seria possível aumentar a matriz de entrada com a média da matriz? Parece que pode ser mais curto.
copo
11
Neste site, normalmente não podemos assumir um ambiente REPL, a menos que explicitamente permitido pela pergunta. Portanto, nesse caso, você precisará usar catpara imprimir no console.
Alex A.
11
Além disso, R usa ^para exponenciação, que é um byte menor que **.
Alex A.
11
Você não precisa somar a média, pois meanretorna um escalar; sumnão tem efeito. 36 bytes:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.
11
@ Desculpas AndréMuta, quando eu testei, eu tinha um X por aí.
MickyT
5

Pitão, 20 19 17 13 bytes

@.O^R2-R.OQQ2

Graças a @FryAmTheEggman por jogar fora 4 bytes!

Experimente online.

Como funciona

        .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
fonte
Eu gosto de como a decomposição de um programa Pyth se parece com uma parábola distorcida.
Conor O'Brien
5

CJam, 24 22 21 bytes

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

Obrigado ao @aditsu por jogar fora 1 byte!

Experimente on-line no intérprete CJam .

Como funciona

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
fonte
Eu acho que você pode converter apenas o comprimento para o dobro
aditsu 15/10/2015
@aditsu Claro. Obrigado!
Dennis
5
:mhé genial btw :)
aditsu 15/10
2
Reduce by hypotenuse.não é algo que você vê todos os dias.
lirtosiast
4

APL, 24 bytes

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

Uma abordagem um pouco diferente da solução Dennis Dyalog APL . Isso deve funcionar com qualquer implementação de APL.

Isso cria uma função monádica sem nome que calcula o vetor ( x - µ ) 2 como 2*⍨⍵-+/⍵÷≢⍵, divide isso por N ( ÷≢⍵), pega a soma desse vetor usando +/e pega a raiz quadrada ( .5*⍨).

Experimente online

Alex A.
fonte
Nem toda aplicação APL suporta {NDR }, ou . No entanto, todas as versões suportamR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám
4

Julia, 26 19 bytes

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

Isso cria uma função sem nome que aceita uma matriz e retorna um valor flutuante.

Ungolfed, eu acho:

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

TI-BASIC, 7 bytes

stdDev(augment(Ans,{mean(Ans

Peguei emprestado o algoritmo para obter o desvio padrão da população a partir do desvio padrão da amostra daqui .

A solução mais curta que eu poderia encontrar sem augment(é de 9 bytes:

stdDev(Ans√(1-1/dim(Ans
Thomas Kwa
fonte
Eu concordo com AndréMuta, isso não produz o resultado necessário, veja aqui.
flawr
11
@ AndréMuta O @flawr da TI stdDev(calcula o SD da amostra; stdDev(augment(Ans,{mean(Anscalcula a população SD. Está na página à qual você vinculou.
lirtosiast
3

Haskell, 61 bytes

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

Simples, exceto talvez a minha função de comprimento personalizado sum(n>>[1])para enganar o sistema de tipos estritos de Haskell.

nimi
fonte
Você pode usar sum(1<$n)e <$>para map.
Laikoni 30/10
Ocorreu-me que essas funções talvez não estivessem presentes por causa de uma versão mais antiga do GHC no momento desta resposta, mas de acordo com essa dica, elas foram introduzidas para prelúdio em março de 2015, e a política do site mudou de qualquer maneira para permitir novos idiomas características.
Laikoni 30/10
3

Python 3.4 ou superior, 30 bytes

from statistics import*;pstdev

Importa a função incorporada pstdev, por exemplo

>>> pstdev([56,54,89,87])
16.53027525481654
Sp3000
fonte
Eu acho que logo pstdevapós a primeira linha está ok? Acredito que o xnor fez isso há um tempo atrás sum. É uma espécie de wrt faz sentido como lambdas anônimo seria usado ie p=pstdevoumap(pstdev, [...])
FryAmTheEggman
Eu ia dizer a mesma coisa. Meta posts parecem apoiar apenas colocar uma função literal.
Xnor
Eu acho que você ainda precisa escrever o literal pstdev, tipo from statistics import*;pstdev. Caso contrário, isso poderia ser qualquer função dessa biblioteca.
Xnor
@xnor Editado. tbh Não tenho muita certeza sobre a decisão sobre essas situações ...
Sp3000
Talvez uma meta pergunta seja útil? :)
Decay Beta
2

JavaScript (ES6), 73 bytes

a=>Math.sqrt(a.reduce((b,c)=>b+(d=c-eval(a.join`+`)/(l=a.length))*d,0)/l)
Mwr247
fonte
@BetaDecay Em relação à precisão da saída? Na verdade, meu original não estava correto, e eu o consertei logo depois, apenas para descobrir que o ponto flutuante estava ok hehe ... Então está bom agora?
Mwr247
Sim, está tudo bem :)
Decay Beta
7
Psst ... você pode cortar 5 bytes usando este método de soma em eval(a.join`+`)vez de a.reduce((e,f)=>e+f)
George Reith
@GeorgeReith Nice trick! Eu vou ter que lembrar que um para mais tarde ...
Mwr247
2

Geléia , não concorrente

11 bytes Esta resposta não é concorrente, pois usa um idioma que pós-data do desafio.

S÷L
Dz_²ÇN½

Esta é uma tradução direta da minha resposta do APL para Jelly. Experimente online!

Como funciona

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
fonte
2

J, 18 bytes

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

Esta é uma tradução direta da minha resposta do APL para J.

Experimente online!

Dennis
fonte
Eu não tinha idéia Mfoi um pré-definidos construído dentro.
Conor O'Brien
Não é. M=:+/%#é uma definição de função embutida.
Dennis
Mas é predefinido, certo? Talvez builtin é o termo errado
Conor O'Brien
Não, não é predefinido. M=:+/%#salva o verbo +/%#em M, em seguida, chama-lo.
Dennis
Lamento XD Eu não vi a última parte
Conor O'Brien
1

Simplex v.0.5 , 43 bytes

Só porque. Eu realmente preciso jogar este mais um byte.

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
fonte
1

Prolog (SWI), 119 bytes

Código:

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

Explicação:

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

Exemplo:

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

Experimente online aqui

Emigna
fonte
1

Perl5, 39 38


 16 para o script
+22 para o Mcomutador
+ 1 para o Ecomutador
= 39

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

Testado em morango 5.20.2.


Ah, mas entendi que você disse que nossas respostas podem ser funções, e não programas. Nesse caso,

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

tem apenas 38. Testado no Strawberry 5.20.2 como

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

Python, 57 bytes

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

Recebe entrada como uma lista

Obrigado @xnor

Beta Decay
fonte
Eu acho que você pode fazer .5no lugar de 0.5salvar um byte. Você também quer dizer em len(x)vez de len(l)?
Alex A.
@AlexA. Uhh, não, acho que não ...
Decay Beta
11
Desculpe, fiquei confuso. Desconsiderar o xe labsurdo. Mas você ainda pode fazer .5para salvar um byte.
Alex A.
11
@BetaDecay É mais curto para usar uma lista-comp do que para mapear um lambda: sum((x-sum(l)/len(l))**2for x in l).
Xnor
11
Uma formulação diferente deu o mesmo comprimento: 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)

explicação

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

resultado

:\>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
fonte
0

Fortran, 138 bytes

Apenas uma implementação direta da equação no 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
Time Laird
fonte
0

SmileBASIC, 105 bytes (em função)

Acabei de notar que é permitido que seja uma função. Opa, isso reduz drasticamente a minha resposta. Isso define uma função Sque pega uma matriz e retorna o desvio padrão da população. Leia a outra para obter uma explicação, mas pule a parte da análise. Eu não quero fazer isso de novo.

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

Como programa, 212 bytes

Infelizmente, tenho que pegar a lista de entrada como uma string e analisá-la eu mesma. Isso adiciona mais de 100 bytes à resposta, portanto, se algum formato de entrada diferente de uma lista separada por vírgulas for permitido, ficarei feliz em ouvi-lo. Observe também que, por VALser um buggy, ter um espaço antes da vírgula ou seguir a sequência interrompe o programa. Após a vírgula ou no início da string, tudo bem.

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 explicou:

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)
Caracol_
fonte
0

Axioma, 137 bytes

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

A função m () retornaria a média da lista na entrada. Ambas as funções em erro retornam% i a constante imaginária sqrt (-1). Código para teste e resultados. [mas o resultado, se estiver ok, é a parte real de um número complexo]

(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
fonte
0

Python 3 , 49 bytes

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

Experimente online!

Recebe luma lista de números inteiros e No número de inteiros presentes.

musicman523
fonte
0

Pyt , 13 bytes

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

Implementa a fórmula para o desvio padrão

mudkip201
fonte