Standardisieren Sie die Proben (Berechnen Sie den z-Score)


14

Eine Liste von Gleitkommazahlen gegeben, Standardisieren Sie.

Einzelheiten

  • Eine Liste x1,x2,,xn ist standardisiert, wenn der Mittelwert aller Werte 0 und die Standardabweichung 1 ist. Eine Möglichkeit, dies zu berechnen, besteht darin, zuerst den Mittelwert μ und die Standardabweichung σ als μ = zu berechnen 1
    μ=1ni=1nxiσ=1ni=1n(xiμ)2,
    und dann die StandardisierungBerechnung von jedem Ersetzenximitxiμσ .
  • Sie können davon ausgehen, dass die Eingabe mindestens zwei unterschiedliche Einträge enthält (was σ0 impliziert ).
  • Beachten Sie, dass einige Implementierungen die Standardabweichung der Stichprobe verwenden, die nicht der hier verwendeten Populationsstandardabweichung σ .
  • Für alle trivialen Lösungen gibt es eine CW-Antwort .

Beispiele

[1,2,3] -> [-1.224744871391589,0.0,1.224744871391589]
[1,2] -> [-1,1]
[-3,1,4,1,5] -> [-1.6428571428571428,-0.21428571428571433,0.8571428571428572,-0.21428571428571433,1.2142857142857144]

(Diese Beispiele wurden mit diesem Skript generiert .)

Antworten:





4

MATL , 10 Bytes

tYm-t&1Zs/

Probieren Sie es online!

Erläuterung

t       % Implicit input
        % Duplicate
Ym      % Mean
-       % Subtract, element-wise
t       % Duplicate
&1Zs    % Standard deviation using normalization by n
/       % Divide, element-wise
        % Implicit display

4

APL + WIN, 41,32 30 Bytes

9 Bytes gespart dank Erik + 2 dank ngn

x←v-(+/v)÷⍴v←⎕⋄x÷(+/x×x÷⍴v)*.5

Fordert zur Eingabe eines Zahlenvektors auf und berechnet die mittlere Standardabweichung und standardisierte Elemente des Eingabevektors


Kannst du nicht zuweisen x←v-(+/v)÷⍴v←⎕und dann tun x÷((+/x*2)÷⍴v)*.5?
Erik der Outgolfer

Das kann ich ja. Vielen Dank.
Graham

funktioniert die Singleton-Erweiterung von apl + win ( 1 2 3+,4← → 1 2 3+4)? Wenn ja, könnte man umschreiben (+/x*2)÷⍴vals+/x×x÷⍴v
ngn

@ngn Das funktioniert für weitere 2 Bytes. Vielen Dank.
Graham

3

R + Pryr, 53 52 Bytes

-1 Byte unter Verwendung von sum(x|1)anstelle von length(x)@Robert S.'s Lösung

pryr::f((x-(y<-mean(x)))/(sum((x-y)^2)/sum(x|1))^.5)

Ich bin erstaunt, dass diese Sprache für Statistiker keine eingebaute Funktion hat. Zumindest nicht eines, das ich finden konnte. Sogar die Funktionmosaic::zscore liefert nicht die erwarteten Ergebnisse. Dies ist wahrscheinlich auf die Verwendung der Populationsstandardabweichung anstelle der Stichprobenstandardabweichung zurückzuführen.

Probieren Sie es online!


2
Sie können das <-in ein ändern =, um 1 Byte zu sparen.
Robert S.

@ J. Nein, ich habe die Methode verwendet, mit der ich die Lösung von Robert S. kommentiert habe. scaleist ordentlich!
Giuseppe

2
@ J.Doe da du nur neinmal verwendest kannst du es direkt für 38 Bytes verwenden
Giuseppe

2
@RobertS. Hier bei PPCG tendieren wir dazu, flexible Ein- und Ausgaben zuzulassen, einschließlich der Ausgabe von mehr als erforderlich, mit Ausnahme von Herausforderungen, bei denen das genaue Layout der Ausgabe der springende Punkt der Herausforderung ist.
ngm

6
Natürlich würden R-Built-Ins keine "Populationsvarianz" verwenden. Nur verwirrte Ingenieure würden so etwas benutzen (die Antworten von Python und Matlab;))
ngm


2

Gelee , 10 Bytes

_ÆmµL½÷ÆḊ×

Probieren Sie es online!

Es ist nicht kürzer, aber Jellys Determinantenfunktion ÆḊberechnet auch die Vektornorm.

_Æm             x - mean(x)
   µ            then:
    L½          Square root of the Length
      ÷ÆḊ       divided by the norm
         ×      Multiply by that value

Hey, schöne Alternative! Leider sehe ich keinen Weg, um es zu verkürzen.
Erik der Outgolfer

2

Mathematica, 25 Bytes

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

Funktion pur. Nimmt eine Liste von Zahlen als Eingabe und gibt eine Liste von Zahlen mit Maschinengenauigkeit als Ausgabe zurück. Beachten Sie, dass die integrierte StandardizeFunktion standardmäßig die Stichprobenvarianz verwendet.


2

J , 22 Bytes

-1 Byte dank Kühe quaken!

(-%[:%:1#.-*-%#@[)+/%#

Probieren Sie es online!

J , 31-23 Bytes

(-%[:%:#@[%~1#.-*-)+/%#

Probieren Sie es online!

                   +/%# - mean (sum (+/) divided (%) by the number of samples (#)) 
(                 )     - the list is a left argument here (we have a hook)
                 -      - the difference between each sample and the mean
                *       - multiplied by 
               -        - the difference between each sample and the mean
            1#.         - sum by base-1 conversion
          %~            - divided by
       #@[              - the length of the samples list
     %:                 - square root
   [:                   - convert to a fork (function composition) 
 -                      - subtract the mean from each sample
  %                     - and divide it by sigma

1
Umstellen es 22 gibt [:(%[:%:1#.*:%#)]-+/%# tio.run/##y/qfVmyrp2CgYKVg8D/... , ich denke , eine dieser Kappen entfernt werden konnte, aber hatten kein Glück so weit, EDIT: ein direkterer byteshaving ist (-%[:%:1#.-*-%#@[)+/%#auch bei 22
Kritixi Lithos

@ Kühe quaken Danke!
Galen Ivanov


2

Haskell, 80 75 68 Bytes

t x=k(/sqrt(f$sum$k(^2)))where k g=g.(-f(sum x)+)<$>x;f=(/sum(1<$x))

Danke an @flawr für die Vorschläge sum(1<$x) anstelle von sum[1|_<-x]und als Mittelwert verwendet werden sollen, @xnor für das Inlinieren der Standardabweichung und anderer Verringerungen.

Erweitert:

-- Standardize a list of values of any floating-point type.
standardize :: Floating a => [a] -> [a]
standardize input = eachLessMean (/ sqrt (overLength (sum (eachLessMean (^2)))))
  where

    -- Map a function over each element of the input, less the mean.
    eachLessMean f = map (f . subtract (overLength (sum input))) input

    -- Divide a value by the length of the input.
    overLength n = n / sum (map (const 1) input)

1
Sie können ersetzen [1|_<-x]mit (1<$x)ein paar Bytes zu speichern. Das ist ein toller Trick, um das zu vermeiden fromIntegral, was ich bisher noch nicht gesehen habe!
Fehler

Übrigens: Ich benutze gerne tryitonline , Sie können dort Ihren Code ausführen und dann die vorformatierte E-Mail zum Posten hier kopieren!
Fehler


Sie können schreiben , (-x+)für (+(-x))zu vermeiden Pars. Auch sieht es aus wie fpointfree sein kann: f=(/sum(1<$x))und skann mit seiner Definition ersetzt werden.
16.

@xnor Ooh, (-x+)ist praktisch, ich bin sicher, dass ich das in Zukunft verwenden werde
Jon Purdy

2

MathGolf , 7 Bytes

▓-_²▓√/

Probieren Sie es online!

Erläuterung

Dies ist buchstäblich eine byteweise Neuerstellung der 05AB1E-Antwort von Kevin Cruijssen, aber ich spare mir ein paar Bytes von MathGolf mit 1 Byte für alles, was für diese Herausforderung benötigt wird. Auch die Antwort sieht meiner Meinung nach ganz gut aus!

▓         get average of list
 -        pop a, b : push(a-b)
  _       duplicate TOS
   ²      pop a : push(a*a)
    ▓     get average of list
     √    pop a : push(sqrt(a)), split string to list
      /   pop a, b : push(a/b), split strings

1

JavaScript (ES7),  80 bis  79 Byte

a=>a.map(x=>(x-g(a))/g(a.map(x=>(x-m)**2))**.5,g=a=>m=eval(a.join`+`)/a.length)

Probieren Sie es online!

Kommentiert

a =>                      // given the input array a[]
  a.map(x =>              // for each value x in a[]:
    (x - g(a)) /          //   compute (x - mean(a)) divided by
    g(                    //   the standard deviation:
      a.map(x =>          //     for each value x in a[]:
        (x - m) ** 2      //       compute (x - mean(a))²
      )                   //     compute the mean of this array
    ) ** .5,              //   and take the square root
    g = a =>              //   g = helper function taking an array a[],
      m = eval(a.join`+`) //     computing the mean
          / a.length      //     and storing the result in m
  )                       // end of outer map()


1

Haskell , 59 Bytes

(%)i=sum.map(^i)
f l=[(0%l*y-1%l)/sqrt(2%l*0%l-1%l^2)|y<-l]

Probieren Sie es online!

Benutzt keine Bibliotheken.

Die Hilfsfunktion %berechnet die Summe der iPotenzen einer Liste, wodurch wir drei nützliche Werte erhalten.

  • 0%list die Länge l(dies nennt n)
  • 1%ldie Summe wird l(nennen wir dieses )
  • 2%list die Summe der Quadrate von l(dies nennt m)

Wir können den Z-Score eines Elements yals ausdrücken

(n*y-s)/sqrt(n*v-s^2)

(Dies ist der Ausdruck, der (y-s/n)/sqrt(v/n-(s/n)^2)durch Multiplizieren von oben und unten mit etwas vereinfacht wirdn .)

Wir können die Ausdrücke einfügen 0%l, 1%l, 2%lohne parens , weil die% ich haben eine höhere Priorität als die arithmetischen Operatoren definieren.

(%)i=sum.map(^i)ist die gleiche Länge wie i%l=sum.map(^i)l. Es hilft nicht, es sinnloser zu machen. Das Definieren wie g i=...verliert Bytes, wenn wir es aufrufen. Funktioniert zwar %für jede Liste, wird jedoch nur mit der Problemeingabeliste aufgerufen. Es geht jedoch kein Byte-Verlust ein, lwenn Sie sie jedes Mal mit Argument aufrufen, da ein Aufruf mit zwei Argumenten i%lnicht länger als ein Argument ist g i.


Wir haben LEINTEXhier :)
Fehler

Ich mag die %Idee wirklich ! Es sieht genauso aus wie die diskrete Version der statistischen Momente .
Fehler

1

K (oK) , 33 23 Bytes

-10 bytes dank ngn!

{t%%(+/t*t:x-/x%#x)%#x}

Probieren Sie es online!

Erster Codierungsversuch (ich wage es nicht, es "Golf" zu nennen) in K. Ich bin mir ziemlich sicher, dass es viel besser gemacht werden kann (zu viele Variablennamen hier ...)


1
nett! Sie können die Initiale (x-m)durch t( tio )
ngn

1
das Innere { }ist unnötig - sein impliziter Parametername ist xund es wurde ein xas-Argument ( tio ) übergeben
ngn

1
ein weiteres -1 Byte durch Ersetzen x-+/xdurch x-/x. Das linke Argument -/dient als Anfangswert für die Reduktion ( tio )
ngn

@ngn Danke! Jetzt sehe ich, dass die ersten 2 Golfplätze offensichtlich sind; der letzte ist jenseits meines derzeitigen Niveaus :)
Galen Ivanov


1

TI-Basic (Serie 83), 14 11 Bytes

Ans-mean(Ans
Ans/√(mean(Ans²

Nimmt Eingaben auf Ans. Wenn Sie zum Beispiel das Obige eingeben prgmSTANDARD, {1,2,3}:prgmSTANDARDwird zurückgegeben {-1.224744871,0.0,1.224744871}.

Früher habe ich versucht, den 1-Var StatsBefehl zu verwenden, in dem die Populationsstandardabweichung gespeichert ist σx, aber es ist einfacher, ihn manuell zu berechnen.


1

05AB1E , 9 Bytes

ÅA-DnÅAt/

Port of @Arnauld 's JavaScript-Antwort , also stelle sicher, dass du ihn positiv bewertest!

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ÅA          # Calculate the mean of the (implicit) input
            #  i.e. [-3,1,4,1,5] → 1.6
  -         # Subtract it from each value in the (implicit) input
            #  i.e. [-3,1,4,1,5] and 1.6 → [-4.6,-0.6,2.4,-0.6,3.4]
   D        # Duplicate that list
    n       # Take the square of each
            #  i.e. [-4.6,-0.6,2.4,-0.6,3.4] → [21.16,0.36,5.76,0.36,11.56]
     ÅA     # Pop and calculate the mean of that list
            #  i.e. [21.16,0.36,5.76,0.36,11.56] → 7.84
       t    # Take the square-root of that
            #  i.e. 7.84 → 2.8
        /   # And divide each value in the duplicated list with it (and output implicitly)
            #  i.e. [-4.6,-0.6,2.4,-0.6,3.4] and 2.8 → [-1.6428571428571428,
            #   -0.21428571428571433,0.8571428571428572,-0.21428571428571433,1.2142857142857144]


0

Pyth, 21 bis 19 Bytes

mc-dJ.OQ@.Om^-Jk2Q2

Probieren Sie es hier online aus .

mc-dJ.OQ@.Om^-Jk2Q2Q   Implicit: Q=eval(input())
                       Trailing Q inferred
    J.OQ               Take the average of Q, store the result in J
           m     Q     Map the elements of Q, as k, using:
             -Jk         Difference between J and k
            ^   2        Square it
         .O            Find the average of the result of the map
        @         2    Square root it
                       - this is the standard deviation of Q
m                  Q   Map elements of Q, as d, using:
  -dJ                    d - J
 c                       Float division by the standard deviation
                       Implicit print result of map

Bearbeiten: Nachdem Kevins Antwort angezeigt wurde, wurde geändert, um den integrierten Durchschnitt für die inneren Ergebnisse zu verwenden. Vorherige Antwort:mc-dJ.OQ@csm^-Jk2QlQ2


0

SNOBOL4 (CSNOBOL4) , 229 Bytes

	DEFINE('Z(A)')
Z	X =X + 1
	M =M + A<X>	:S(Z)
	N =X - 1.
	M =M / N
D	X =GT(X) X - 1	:F(S)
	A<X> =A<X> - M	:(D)
S	X =LT(X,N) X + 1	:F(Y)
	S =S + A<X> ^ 2 / N	:(S)
Y	S =S ^ 0.5
N	A<X> =A<X> / S
	X =GT(X) X - 1	:S(N)
	Z =A	:(RETURN)

Probieren Sie es online!

Link ist eine funktionale Version des Codes, der aus STDIN und seinen Elementen ein Array erstellt, darauf die Funktion Zausführt und schließlich die Werte ausgibt .

Definiert eine Funktion, Zdie ein Array zurückgibt.

Die 1.Online-4 ist notwendig, um die Gleitkomma-Arithmetik korrekt durchzuführen.



0

Holzkohle , 25 bis 19 Bytes

≧⁻∕ΣθLθθI∕θ₂∕ΣXθ²Lθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

       θ    Input array
≧           Update each element
 ⁻          Subtract
   Σ        Sum of
    θ       Input array
  ∕         Divided by
     L      Length of
      θ     Input array

Berechnung μ und vektorisiert subtrahieren sie von jedem xich.

  θ         Updated array
 ∕          Vectorised divided by
   ₂        Square root of
     Σ      Sum of
       θ    Updated array
      X     Vectorised to power
        ²   Literal 2
    ∕       Divided by
         L  Length of
          θ Array
I           Cast to string
            Implicitly print each element on its own line.

Berechnung σ, vektorisierte dividieren jeweils xich von ihm, und das Ergebnis ausgeben.

Bearbeiten: 6 Bytes dank @ ASCII-only für a) Verwenden von SquareRoot()anstelle von Power(0.5)b) Vektorisieren Divide()(es wurde IntDivide()stattdessen getan ) c) Power()Vektorisieren gespeichert.


durchgestrichen 25 = keine Bytes? : P (Außerdem haben Sie den TIO-Link noch nicht aktualisiert)
Nur ASCII

@ Nur ASCII Ups, danke!
Neil
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.