Calculer l'écart type


19

Défi

À partir d'une liste de nombres, calculez l'écart type de population de la liste.

Utilisez l'équation suivante pour calculer l'écart type de la population:

Contribution

L'entrée sera une liste d'entiers dans n'importe quel format (liste, chaîne, etc.). Quelques exemples:

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

Les nombres seront toujours des entiers.

L'entrée se fera en STDIN ou en arguments de fonction.

Production

La sortie doit être un nombre à virgule flottante.

Règles

Vous pouvez utiliser des fonctions intégrées pour trouver l'écart type.

Votre réponse peut être soit un programme complet soit une fonction.

Exemples

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Gagnant

Le programme ou la fonction la plus courte l'emporte.

Classement


1
Vous voulez dire que la sortie doit être une virgule flottante OU un entier?
Mutador

3
Je pense que la plupart des fonctions d'écart type intégrées calculent l'écart type d'échantillon.
Mutador

? Qu'en est- il si la liste d'entrée est vide 175656,78441352615 résultat me 175656,78441352614
RosLuP

@RosLuP Vous n'avez pas à vous en soucier
Beta Decay

1
@ a13a22 Conformément aux règles standard de PPCG, vous pouvez très bien saisir des informations via des arguments de fonction
Beta Decay

Réponses:


18

Clip , 3

.sk

.s est l'écart type, k analyse l'entrée dans le formulaire {1,2,3}.


Quelle formule est utilisée pour l'écart type? Je ne l'ai pas trouvé dans la référence.
flawr

@flawr C'est ce graphique , vers le bas.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ J'ai vu ça, mais aucune formule n'est donnée.
flawr

@flawr Oh, je vois. C'est peut-être à l'interprète, si une telle chose existe.
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Je l'ai trouvé ici sur la ligne 493, ça semble bien!
flawr

11

Mathematica, 24 22 octets

Nice, Mathematica a une fonction intégrée StandardDevi... oh ... qui calcule l'écart type de l'échantillon, pas l'écart type de la population.

Mais si nous utilisons Variance ... oh ... même accord.

Mais il existe encore une autre fonction intégrée:

CentralMoment[#,2]^.5&

Yay. :)

Cela fonctionne également pour 22 octets:

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

Et cela pour 27:

N@RootMeanSquare[#-Mean@#]&

10

Octave, 14 octets

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

Essayez-le sur ideone .


2
Vous pouvez enregistrer deux octets en les supprimant, g=car le descripteur de fonction n'a pas besoin d'un nom pour être une soumission valide.
Alex A.

10

kdb + , 3 octets

dev

L'un des derviats APL devait avoir ceci comme intégré.

Essai

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 octets

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

Ceci définit un train de fonctions monadique sans nom, qui est équivalent à la fonction suivante.

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

Essayez-les en ligne sur TryAPL .

Comment ça fonctionne

Le code se compose de plusieurs trains.

M←+/÷≢

Ceci définit un 3-train monadique (fourche) Mqui exécute +/(somme de tous les éléments) et (longueur) pour l'argument de droite, puis applique ÷(division) aux résultats, renvoyant la moyenne arithmétique de l'entrée.

M×M

C'est un autre fork qui s'applique Mau bon argument, le répète une deuxième fois et applique ×(produit) aux résultats, renvoyant μ 2 .

×⍨-(M×M)

C'est encore une autre fourchette qui calcule le carré de la moyenne arithmétique comme expliqué précédemment, applique ×⍨(produit avec lui-même) au bon argument, et enfin applique -(différence) aux résultats.

Pour l'entrée (x 1 ,…, x N ) , cette fonction renvoie (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Cette fonction composée s'applique Mà son argument de droite, puis*∘.5 . Ce dernier utilise le currying d'argument droit pour appliquer l'entrée de carte aà a*0.5(racine carrée de a).

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

Enfin, nous avons ce train monadique à 2 trains (au sommet), qui applique la fonction droite d'abord, puis la gauche à son résultat, calculant l'écart type comme suit.

formula


5

R, 41 40 39 36 30 28 octets

code

Merci au bécher , Alex A. et MickyT pour beaucoup d'octets.

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

anciens codes

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) 

Cela devrait donner l'écart type de la population.


1
Je ne connais pas R, mais serait-il possible d'augmenter le tableau d'entrée avec la moyenne du tableau? Il semble que cela pourrait être plus court.
bécher

1
Sur ce site, nous ne pouvons généralement pas assumer un environnement REPL, sauf autorisation explicite de la question. Ainsi, dans ce cas, vous devrez utiliser catpour imprimer sur la console.
Alex A.

1
En outre, R utilise ^pour l'exponentiation, qui est un octet plus court que **.
Alex A.

1
Vous n'avez pas besoin de additionner la moyenne car meanrenvoie un scalaire; sumn'a aucun effet. 36 octets:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.

1
@ Excuses AndréMuta, quand je l'ai testé, j'avais un X qui traînait.
MickyT

5

Pyth, 20 19 17 13 octets

@.O^R2-R.OQQ2

Merci à @FryAmTheEggman pour avoir joué au golf sur 4 octets!

Essayez-le en ligne.

Comment ça fonctionne

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

J'aime à quoi ressemble la décomposition d'un programme Pyth comme une parabole asymétrique.
Conor O'Brien

5

CJam, 24 22 21 octets

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

Merci à @aditsu pour avoir joué au golf sur 1 octet!

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

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.

Je pense que vous pouvez convertir simplement la longueur en double
aditsu

@aditsu Bien sûr. Merci!
Dennis

5
:mhis genius btw :)
aditsu

2
Reduce by hypotenuse.ce n'est pas quelque chose que vous voyez tous les jours.
lirtosiast

4

APL, 24 octets

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

Une approche légèrement différente de la solution Dyalog APL de Dennis . Cela devrait fonctionner avec n'importe quelle implémentation APL.

Cela crée une fonction monadique sans nom qui calcule le vecteur ( x - µ ) 2 as 2*⍨⍵-+/⍵÷≢⍵, le divise par N ( ÷≢⍵), prend la somme de ce vecteur en utilisant +/, puis prend la racine carrée (.5*⍨ ).

Essayez-le en ligne


Non chaque implémentation APL soutient {DFNS }, ou . Cependant, chaque version prend en chargeR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám

4

Julia, 26 ans 19 octets

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

Cela crée une fonction sans nom qui accepte un tableau et renvoie un flottant.

Non golfé, je suppose:

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 octets

stdDev(augment(Ans,{mean(Ans

J'ai emprunté l'algorithme pour obtenir l'écart type de la population à partir de l'écart type de l'échantillon d' ici .

La solution la plus courte sans laquelle j'ai pu trouver augment(est de 9 octets:

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

Je suis d'accord avec AndréMuta, cela ne produit pas le résultat souhaité, voir ici.
flawr

1
@ AndréMuta @flawr Le module intégré de TI stdDev(calcule l'échantillon SD; stdDev(augment(Ans,{mean(Anscalcule la population SD. C'est sur la page à laquelle vous avez lié.
lirtosiast

3

Haskell, 61 octets

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

Simple, sauf peut-être ma fonction de longueur personnalisée sum(n>>[1])pour tromper le système de type strict de Haskell.


Vous pouvez utiliser sum(1<$n)et <$>pour map.
Laikoni

Il m'est venu à l'esprit que ces fonctions pourraient ne pas être présentes en raison d'une ancienne version de GHC au moment de cette réponse, mais selon cette astuce, elles ont été introduites en prélude en mars 2015, et la politique du site a changé de toute façon pour autoriser une langue plus récente Caractéristiques.
Laikoni

3

Python 3.4+, 30 octets

from statistics import*;pstdev

Importe la fonction intégrée pstdev, par exemple

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

Je pense que juste pstdevaprès la première ligne, ça va? Je crois que xnor a fait ça il y a quelque temps avec sum. Cela a du sens par rapport à la façon dont les lambdas anonymes seraient utilisés, c'est p=pstdev-à- diremap(pstdev, [...])
FryAmTheEggman

J'allais dire la même chose. Les messages Meta semblent prendre en charge le simple fait de mettre une fonction littérale.
xnor

Je pense que vous devez quand même écrire le littéral pstdev, comme from statistics import*;pstdev. Sinon, cela pourrait être n'importe quelle fonction de cette bibliothèque.
xnor

@xnor Edited. tbh Je ne suis pas vraiment sûr de la décision sur ces situations ...
Sp3000

Peut-être qu'une méta-question serait utile? :)
Beta Decay

2

JavaScript (ES6), 73 octets

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

@BetaDecay Concernant la précision de la sortie? Mon original n'avait pas vraiment ce correct, et je l'ai corrigé juste après, seulement pour découvrir que la virgule flottante était ok hehe ... Alors, est-ce bien maintenant tel quel?
Mwr247

Ouais c'est bien :)
Beta Decay

7
Psst ... vous pouvez raser 5 octets en utilisant cette méthode de sommation eval(a.join`+`)au lieu de a.reduce((e,f)=>e+f)
George Reith

@GeorgeReith Nice trick! Je vais devoir m'en souvenir pour plus tard ...
Mwr247

2

Gelée , non compétitive

11 octets Cette réponse n'est pas concurrente, car elle utilise un langage postdaté.

S÷L
Dz_²ÇN½

Ceci est une traduction directe de ma réponse APL à Jelly. Essayez-le en ligne!

Comment ça fonctionne

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 octets

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

Ceci est une traduction directe de ma réponse APL à J.

Essayez-le en ligne!


Je ne savais pas que Mc'était un prédéfini intégré.
Conor O'Brien

Ce n'est pas le cas. M=:+/%#est une définition de fonction en ligne.
Dennis

Mais c'est prédéfini, non? Peut-être que le terme intégré est le mauvais terme
Conor O'Brien

Non, ce n'est pas prédéfini. M=:+/%#enregistre le verbe +/%#dans M, il appelle.
Dennis

Je suis désolé XD je n'ai pas vu la dernière partie
Conor O'Brien

1

Simplex v.0.5 , 43 octets

Juste parce que. J'ai vraiment besoin de jouer à cet octet de plus.

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 octets

Code:

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

Explication:

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

Exemple:

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

Essayez-le en ligne ici


1

Perl5, 39 38


 16 pour le script
+22 pour le Mcommutateur
+ 1 pour le Ecommutateur
= 39

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

Testé dans Strawberry 5.20.2.


Oh, mais j'ai réalisé que vous aviez dit que nos réponses pouvaient être des fonctions plutôt que des programmes. Dans ce cas,

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

a juste 38. Testé dans Strawberry 5.20.2 comme

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

0

Python, 57 octets

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

Takes input as a list

Thanks @xnor


I think you can do .5 in place of 0.5 to save a byte. Also do you mean len(x) instead of len(l)?
Alex A.

@AlexA. Uhh, no I don't think so...
Beta Decay

1
Sorry, got confused. Disregard the x and l nonsense. But you can still do .5 to save a byte.
Alex A.

1
@BetaDecay It's shorter to use a list-comp than to map a lambda: sum((x-sum(l)/len(l))**2for x in l).
xnor

1
A different formulation gave the same length: 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)

explanation

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

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 bytes

Just a straightforward implementation of the equation 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 bytes (as a function)

Je viens de remarquer que c'est autorisé d'être une fonction. Oups, cela réduit considérablement ma réponse. Cela définit une fonction Squi prend un tableau et renvoie l'écart type de la population. Allez lire l'autre pour une explication, mais sautez la partie d'analyse. Je ne veux pas recommencer.

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

En tant que programme, 212 octets

Malheureusement, je dois prendre la liste d'entrée comme une chaîne et l'analyser moi-même. Cela ajoute plus de 100 octets à la réponse, donc si un format d'entrée autre qu'une liste séparée par des virgules est autorisé, je serais heureux de l'entendre. Notez également que parce que VALc'est bogué, le fait d'avoir un espace avant la virgule ou de suivre la chaîne interrompt le programme. Après la virgule ou au début de la chaîne, c'est bien.

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)

Non golfé et expliqué:

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

Axiome, 137 octets

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 fonction m () retournerait la moyenne de la liste en entrée. Les deux fonctions en cas d'erreur renvoient% i la constante imaginaire sqrt (-1). Code pour le test et les résultats. [mais le résultat si c'est ok, c'est la partie réelle d'un nombre complexe]

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

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

Implements the formula for standard deviation

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.