Berechnen Sie die Standardabweichung


19

Herausforderung

Berechnen Sie anhand einer Zahlenliste die Populationsstandardabweichung der Liste.

Verwenden Sie die folgende Gleichung, um die Populationsstandardabweichung zu berechnen:

Eingang

Die Eingabe wird eine Liste von ganzen Zahlen in jedem Format (Liste, Zeichenfolge usw.). Einige Beispiele:

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

Die Zahlen sind immer ganze Zahlen.

Die Eingabe erfolgt in STDIN- oder Funktionsargumente.

Ausgabe

Die Ausgabe muss eine Gleitkommazahl sein.

Regeln

Sie können integrierte Funktionen verwenden, um die Standardabweichung zu ermitteln.

Ihre Antwort kann entweder ein vollständiges Programm oder eine Funktion sein.

Beispiele

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Gewinnen

Das kürzeste Programm oder die kürzeste Funktion gewinnt.

Bestenliste


1
Sie meinen, die Ausgabe muss ein Gleitkomma ODER eine Ganzzahl sein?
Mutador

3
Ich denke, die meisten eingebauten Standardabweichungsfunktionen berechnen die Standardabweichung der Stichprobe.
Mutador

Was ist, wenn die Eingabeliste ungültig ist? 175656.78441352615 Ergebnis für mich 175656.78441352614
RosLuP

@RosLuP Darüber müssen Sie sich keine Sorgen machen
Beta Decay

1
@ a13a22 Gemäß den Standardregeln von PPCG können Sie Eingaben über Funktionsargumente vornehmen
Beta-Zerfall

Antworten:


18

Clip , 3

.sk

.skIst die Standardabweichung, analysiert die Eingabe im Formular {1,2,3}.


Welche Formel wird für die Standardabweichung verwendet? Ich konnte es in der Referenz nicht finden.
Fehler

@flawr Es ist dieses Diagramm nach unten.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ich habe das gesehen, aber es ist keine Formel angegeben.
Fehler

@flawr Oh, ich verstehe. Vielleicht liegt es dann am Dolmetscher, ob es so etwas gibt.
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ich habe es hier in Zeile 493 gefunden, es scheint in Ordnung zu sein!
Fehler

11

Mathematica, 24 22 Bytes

Schön, Mathematica hat eine eingebaute StandardDevi... oh ..., das die Standardabweichung der Stichprobe berechnet, nicht die Standardabweichung der Grundgesamtheit.

Aber was ist, wenn wir verwenden Variance ... oh ... den gleichen Deal machen.

Aber es gibt noch ein anderes eingebautes:

CentralMoment[#,2]^.5&

Yay. :)

Dies funktioniert auch für 22 Bytes:

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

Und das für 27:

N@RootMeanSquare[#-Mean@#]&

10

Oktave, 14 Bytes

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

Probiere es auf ideone aus .


2
Sie können zwei Bytes sparen, indem Sie entfernen, g=da das Funktionshandle keinen Namen benötigt, um eine gültige Übermittlung zu sein.
Alex A.

10

kdb + , 3 bytes

dev

Einer der APL-Derviates musste dies als eingebaut haben.

Testlauf

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 Bytes

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

Dies definiert einen unbenannten, monadischen Funktionszug, der der folgenden Funktion entspricht.

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

Probieren Sie sie online auf TryAPL aus .

Wie es funktioniert

Der Code besteht aus mehreren Zügen.

M←+/÷≢

Dies definiert einen monadischen 3-Zug (Fork) M, der +/(Summe aller Elemente) und (Länge) für das richtige Argument ausführt und dann ÷auf die Ergebnisse (Division) angewendet wird, wobei das arithmetische Mittel der Eingabe zurückgegeben wird.

M×M

Dies ist eine weitere Verzweigung, die Mauf das richtige Argument zutrifft , dies ein zweites Mal wiederholt und ×auf die Ergebnisse (Produkt) zutrifft und μ 2 zurückgibt .

×⍨-(M×M)

Dies ist eine weitere Abzweigung, die das Quadrat des arithmetischen Mittels wie oben erläutert berechnet ×⍨, das richtige Argument (Produkt mit sich selbst) und schließlich -das Ergebnis (Differenz) anwendet .

Für die Eingabe (x 1 ,…, x N ) gibt diese Funktion (x 1 - μ 2 ,…, x N - μ 2 ) zurück .

*∘.5∘M

Diese zusammengesetzte Funktion gilt dann Mfür ihr rechtes Argument *∘.5. Letzterer verwendet das richtige Argument currying, um eine Map-Eingabe aauf a*0.5(Quadratwurzel von a) anzuwenden .

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

Schließlich haben wir diesen monadischen 2-Zug (oben), der zuerst die rechte und dann die linke Funktion auf das Ergebnis anwendet und die Standardabweichung wie folgt berechnet.

Formel


5

R 41 40 39 36 30 28 Bytes

Code

Vielen Dank an Becher , Alex A. und MickyT für viel Bytes.

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

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

Dies sollte die Populationsstandardabweichung ergeben.


1
Ich weiß nicht, R, aber wäre es möglich, das Eingabearray mit dem Mittelwert des Arrays zu erweitern? Das scheint kürzer zu sein.
Becher

1
Auf dieser Site können wir normalerweise keine REPL-Umgebung annehmen, es sei denn, die Frage erlaubt dies ausdrücklich. In diesem Fall müssen Sie also verwenden cat, um auf der Konsole zu drucken.
Alex A.

1
Außerdem wird R ^für die Exponentiation verwendet, die ein Byte kürzer als ist **.
Alex A.

1
Sie müssen den Mittelwert nicht summieren, da meanein Skalar zurückgegeben wird. sumhat keine Wirkung. 36 Bytes:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.

1
@ AndréMuta Entschuldigung, als ich es getestet habe, hatte ich ein X rumhängen.
MickyT

5

Pyth, 20 19 17 13 Bytes

@.O^R2-R.OQQ2

Vielen Dank an @FryAmTheEggman für das Abschlagen von 4 Bytes!

Probieren Sie es online aus.

Wie es funktioniert

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

Mir gefällt, wie die Zerlegung eines Pyth-Programms wie eine verzerrte Parabel aussieht.
Conor O'Brien

5

CJam, 24 22 21 Bytes

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

Vielen Dank an @aditsu für das Golfen ab 1 Byte!

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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.

Ich denke, Sie können nur die Länge in doppelt umwandeln
Aditsu

Natürlich. Vielen Dank!
Dennis

5
:mhis genius btw :)
aditsu

2
Reduce by hypotenuse.ist nicht etwas, was man jeden Tag sieht.
Lirtosiast

4

APL, 24 Bytes

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

Ein etwas anderer Ansatz als die Dyalog APL-Lösung von Dennis . Dies sollte mit jeder APL-Implementierung funktionieren.

Dies erzeugt eine unbenannte monadische Funktion, die den Vektor ( x - µ ) 2 als berechnet 2*⍨⍵-+/⍵÷≢⍵, diesen durch N ( ÷≢⍵) dividiert , die Summe dieses Vektors mit +/und dann die Quadratwurzel ( .5*⍨) nimmt.

Probieren Sie es online aus


Nicht jede APL - Implementierung unterstützt {DFNS }, oder . Allerdings unterstützt jede VersionR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám

4

Julia, 26 19 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die ein Array akzeptiert und einen Gleitkommawert zurückgibt.

Ungolfed, denke ich:

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 Bytes

stdDev(augment(Ans,{mean(Ans

Ich lieh den Algorithmus Standardabweichung von Proben - Standardabweichung Suche von hier .

Die kürzeste Lösung, die ich ohne finden könnte, augment(ist 9 Bytes:

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

Ich stimme AndréMuta zu, dies führt nicht zum gewünschten Ergebnis, siehe hier.
Fehler

1
@ AndréMuta @flawr TIs eingebautes stdDev(berechnet die Sample-SD; stdDev(augment(Ans,{mean(Ansberechnet die Population SD. Das ist auf der Seite, die Sie verlinkt haben.
Lirtosiast

3

Haskell, 61 Bytes

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

Ganz einfach, außer vielleicht meine benutzerdefinierte Längenfunktion sum(n>>[1]), um Haskells strenges Typensystem zu überlisten.


Sie können sum(1<$n)und <$>für verwenden map.
Laikoni

Mir ist gerade eingefallen, dass diese Funktionen möglicherweise aufgrund einer älteren GHC-Version zum Zeitpunkt der Beantwortung dieser Frage nicht vorhanden waren. Laut diesem Tipp wurden sie jedoch zum Auftakt im März 2015 eingeführt, und die Site-Richtlinie wurde ohnehin geändert, um eine neuere Sprache zuzulassen Eigenschaften.
Laikoni

3

Python 3.4+, 30 Bytes

from statistics import*;pstdev

Importiert die eingebaute Funktion pstdev, z

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

Ich denke, kurz pstdevnachdem die erste Zeile in Ordnung ist? Ich glaube, xnor hat das vor einiger Zeit mit gemacht sum. Es macht irgendwie Sinn, wie anonyme Lambdas verwendet werden, dh p=pstdevodermap(pstdev, [...])
FryAmTheEggman

Ich wollte dasselbe sagen. Meta-Posts unterstützen anscheinend nur das Einfügen eines Funktionsliteral.
15.

Ich denke, Sie müssen das Wort pstdevdoch noch schreiben , wie from statistics import*;pstdev. Andernfalls kann dies eine beliebige Funktion aus dieser Bibliothek sein.
16.

@xnor bearbeitet. tbh Ich bin nicht wirklich sicher über das Urteil in diesen Situationen ...
Sp3000

Vielleicht wäre eine Meta-Frage hilfreich? :)
Beta Decay

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 Bezüglich der Ausgabegenauigkeit? Mein Original hatte das eigentlich nicht richtig und ich habe es gleich danach repariert, nur um festzustellen, dass Fließkommazahlen in Ordnung waren, hehe ... Also ist es jetzt so, wie es ist?
Mwr247

Ja, das ist in Ordnung :)
Beta Decay

7
Psst ... Sie können 5 Bytes mit dieser Summierungsmethode abschneiden, eval(a.join`+`)anstatt a.reduce((e,f)=>e+f)
George Reith

@GeorgeReith Netter Trick! Ich werde mich für später daran erinnern müssen ...
Mwr247

2

Gelee , nicht konkurrierend

11 Bytes Diese Antwort ist nicht konkurrierend, da sie eine Sprache verwendet, die die Herausforderung datiert.

S÷L
Dz_²ÇN½

Dies ist eine direkte Übersetzung meiner APL-Antwort auf Jelly. Probieren Sie es online!

Wie es funktioniert

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 Bytes

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

Dies ist eine direkte Übersetzung meiner APL-Antwort an J.

Probieren Sie es online!


Ich hatte keine Ahnung, Mob ein vordefinierter eingebaut war.
Conor O'Brien

Ist es nicht. M=:+/%#ist eine Inline-Funktionsdefinition.
Dennis

Aber es ist vordefiniert, oder? Vielleicht ist builtin der falsche Begriff
Conor O'Brien

Nein, es ist nicht vordefiniert. M=:+/%#speichert das Verb +/%#in Mund ruft es dann auf.
Dennis

Es tut mir leid XD Ich habe den letzten Teil nicht gesehen
Conor O'Brien

1

Simplex v.0.5 , 43 Bytes

Einfach weil. Ich muss wirklich noch ein Byte Golf spielen.

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 Bytes

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

Erläuterung:

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

Beispiel:

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

Probieren Sie es hier online aus


1

Perl5, 39 38


 16 für das Skript
+22 für den MSchalter
+ 1 für den ESchalter
= 39

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

Getestet in Strawberry 5.20.2.


Oh, aber dann wurde mir klar, dass Sie sagten, unsere Antworten könnten Funktionen anstelle von Programmen sein. In diesem Fall,

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

hat gerade 38. Getestet in Strawberry 5.20.2 als

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

0

Python, 57 Bytes

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

Übernimmt die Eingabe als Liste

Vielen Dank an @xnor


Ich glaube , Sie können tun , .5der an Ort und Stelle 0.5ein Byte zu speichern. Meinst du auch len(x)statt len(l)?
Alex A.

@AlexA. Nein, das glaube ich nicht ...
Beta-Zerfall

1
Entschuldigung, bin verwirrt. Ignorieren Sie den xund lUnsinn. Aber Sie können immer noch tun .5, um ein Byte zu speichern.
Alex A.

1
@BetaDecay Es kürzer ist eine Liste-comp zu verwenden , als eine Lambda zur Karte: sum((x-sum(l)/len(l))**2for x in l).
16.

1
Eine andere Formulierung ergab die gleiche Länge lambda l:(sum(x*x*len(l)for x in l)-sum(l)**2)**.5/len(l).
16.

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)

Erläuterung

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

Ergebnis

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

Nur eine einfache Implementierung der Gleichung 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 (als Funktion)

Mir ist gerade aufgefallen, dass es eine Funktion sein darf. Hoppla, das reduziert meine Antwort dramatisch. Dies definiert eine Funktion, Sdie ein Array annimmt und die Populationsstandardabweichung zurückgibt. Lesen Sie den anderen Abschnitt, um eine Erklärung zu erhalten, überspringen Sie jedoch den Analyseteil. Ich will es nicht noch einmal machen.

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

Als Programm 212 Bytes

Leider muss ich die Eingabeliste als String nehmen und selbst analysieren. Dies fügt der Antwort mehr als 100 Bytes hinzu. Wenn also ein anderes Eingabeformat als eine durch Kommas getrennte Liste zulässig ist, würde ich mich freuen, es zu hören. Beachten Sie auch VAL, dass ein Fehler, ein Leerzeichen vor dem Komma oder ein nachgestelltes Zeichen das Programm unterbricht. Nach dem Komma oder am Anfang der Zeichenfolge ist in Ordnung.

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 und erklärte:

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

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

Die Funktion m () würde den Mittelwert der Liste in der Eingabe zurückgeben. Beide Fehlerfunktionen geben% i die imaginäre Konstante sqrt (-1) zurück. Code für Test und Ergebnisse. [aber das Ergebnis, wenn es in Ordnung ist, ist es der Realteil einer komplexen Zahl]

(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

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

Implementiert die Formel für die Standardabweichung

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.