Standarisasi Sampel (Hitung Skor-z)


14

Diberikan daftar angka floating point, distandarisasi .

Detail

  • Daftar x1,x2,...,xn adalah standar jika rata-rata dari semua nilai adalah 0, dan standar deviasi adalah 1. Salah satu cara untuk menghitung ini dengan terlebih dahulu menghitung mean μ dan standar deviasi sebagai dan kemudian menghitung standarisasi dengan mengganti setiap dengan .σ
    μ=1nsaya=1nxsayaσ=1nsaya=1n(xsaya-μ)2,
    xsayaxsaya-μσ
  • Anda dapat mengasumsikan bahwa input berisi setidaknya dua entri berbeda (yang menyiratkan ).σ0
  • Perhatikan bahwa beberapa implementasi menggunakan standar deviasi sampel, yang tidak sama dengan deviasi standar populasi kita gunakan di sini.σ
  • Ada jawaban CW untuk semua solusi sepele .

Contohnya

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

(Contoh-contoh ini telah dihasilkan dengan skrip ini .)

Jawaban:





4

MATL , 10 byte

tYm-t&1Zs/

Cobalah online!

Penjelasan

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 byte

9 byte disimpan berkat Erik + 2 lebih banyak berkat ngn

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

Meminta vektor angka dan menghitung standar deviasi dan elemen standar dari vektor input


Tidak bisakah Anda menetapkan x←v-(+/v)÷⍴v←⎕dan kemudian melakukannya x÷((+/x*2)÷⍴v)*.5?
Erik the Outgolfer

Aku memang bisa. Terima kasih.
Graham

apakah apl + win do singleton extension ( 1 2 3+,4← → 1 2 3+4)? jika ya, Anda dapat menulis ulang (+/x*2)÷⍴vsebagai+/x×x÷⍴v
ngn

@ Ngn Itu bekerja untuk 2 byte lagi. Terima kasih.
Graham

3

R + pryr, 53 52 byte

-1 byte menggunakan sum(x|1)bukan length(x)seperti yang terlihat dalam solusi @Robert S.

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

Untuk menjadi bahasa yang dibangun untuk ahli statistik, saya kagum bahwa ini tidak memiliki fungsi bawaan. Setidaknya tidak ada yang bisa kutemukan. Bahkan fungsi mosaic::zscoretidak menghasilkan hasil yang diharapkan. Ini kemungkinan karena menggunakan standar deviasi populasi daripada standar deviasi sampel.

Cobalah online!


2
Anda dapat mengubah <-menjadi a =untuk menghemat 1 byte.
Robert S.

@ J. Tidak, saya menggunakan metode yang saya komentari pada solusi Robert S. scalerapi!
Giuseppe

2
@ J.Apakah karena Anda hanya menggunakan nsekali Anda dapat menggunakannya secara langsung untuk 38 byte
Giuseppe

2
@RobertS. di sini di PPCG kami cenderung mendorong memungkinkan input dan output yang fleksibel, termasuk menghasilkan lebih dari yang diperlukan, dengan pengecualian tantangan di mana tata letak output yang tepat adalah inti dari tantangan.
ngm

6
Tentu saja R built-in tidak akan menggunakan "varians populasi". Hanya insinyur yang bingung akan menggunakan hal seperti itu (hencethe Python dan Matlab jawaban;))
ngm

3

Tcl , 126 byte

proc S L {lmap c $L {expr ($c-[set m ([join $L +])/[set n [llength $L]].])/sqrt(([join [lmap c $L {expr ($c-$m)**2}] +])/$n)}}

Cobalah online!


2

Jelly , 10 byte

_ÆmµL½÷ÆḊ×

Cobalah online!

Ini tidak lebih pendek, tetapi fungsi penentu Jelly ÆḊjuga menghitung norma vektor.

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

Hei, alternatif yang bagus! Sayangnya, saya tidak bisa melihat cara untuk mempersingkatnya.
Erik the Outgolfer

2

Mathematica, 25 byte

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

Fungsi murni. Mengambil daftar angka sebagai input dan mengembalikan daftar angka presisi mesin sebagai output. Perhatikan bahwa Standardizefungsi bawaan menggunakan varians sampel secara default.


2

J , 22 byte

-1 byte berkat Sapi dukun!

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

Cobalah online!

J , 31 23 byte

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

Cobalah 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
Penyusunan ulang memberikan 22 [:(%[:%:1#.*:%#)]-+/%# tio.run/##y/qfVmyrp2CgYKVg8D/… , saya pikir salah satu topi itu bisa dilepas, tetapi sejauh ini belum beruntung, EDIT: byteshaving yang lebih langsung (-%[:%:1#.-*-%#@[)+/%#juga ada di 22
Kritixi Lithos

@Cambuk sapi Terima kasih!
Galen Ivanov

2

APL (Dyalog Unicode) , 33 29 byte

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

-4 byte terima kasih kepada @ngn

Cobalah online!


Anda bisa menetapkan ⍵-mke variabel dan menghapus m←seperti ini:{d÷.5*⍨l÷⍨+/×⍨d←⍵-(+/⍵)÷l←≢⍵}
ngn

@ ngn Ah, bagus, terima kasih, saya tidak melihat duplikasi itu entah bagaimana
Quintec

2

Haskell, 80 75 68 byte

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

Terima kasih kepada @ flawr untuk saran untuk digunakan sum(1<$x)sebagai ganti sum[1|_<-x]dan untuk menyejajarkan maksud, @xnor untuk inlining standar deviasi dan pengurangan lainnya.

Diperluas:

-- 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
Anda dapat mengganti [1|_<-x]dengan (1<$x)untuk menyimpan beberapa byte. Itu adalah trik yang bagus untuk menghindari fromIntegral, yang belum saya lihat sejauh ini!
flawr

Ngomong-ngomong: Saya suka menggunakan tryitonline , Anda dapat menjalankan kode di sana dan kemudian menyalin aswer yang telah diformat untuk diposkan di sini!
flawr


Anda dapat menulis (-x+)untuk (+(-x))menghindari orangtua. Sepertinya fjuga bisa pointfree:, f=(/sum(1<$x))dan sdapat diganti dengan definisinya.
xnor

@xnor Ooh, (-x+)berguna, saya yakin saya akan menggunakannya di masa depan
Jon Purdy

2

MathGolf , 7 byte

▓-_²▓√/

Cobalah online!

Penjelasan

Ini secara harfiah adalah byte demi byte dari jawaban Kevin Cruijssen 05AB1E, tetapi saya menyimpan beberapa byte dari MathGolf yang memiliki 1-byters untuk semua yang diperlukan untuk tantangan ini. Juga jawabannya terlihat cukup bagus menurut saya!

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

Cobalah online!

Berkomentar

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 byte

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

Cobalah online!

Tidak menggunakan perpustakaan.

Fungsi helper %menghitung jumlah ikekuatan daftar, yang memungkinkan kita mendapatkan tiga nilai berguna.

  • 0%ladalah panjangnya l(sebut ini n)
  • 1%ladalah jumlah dari l(sebut ini s)
  • 2%ladalah jumlah kuadrat dari l(sebut ini m)

Kita dapat menyatakan skor-z suatu elemen ysebagai

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

(Ini adalah ungkapan yang (y-s/n)/sqrt(v/n-(s/n)^2)disederhanakan sedikit dengan mengalikan bagian atas dan bawah dengan n.)

Kita bisa memasukkan ekspresi 0%l, 1%l, 2%ltanpa parens karena %kita mendefinisikan memiliki hak lebih tinggi dari operator aritmatika.

(%)i=sum.map(^i)panjangnya sama dengan i%l=sum.map(^i)l. Menjadikannya lebih bebas poin tidak membantu. Mendefinisikannya seperti g i=...kehilangan byte saat kita menyebutnya. Meskipun %bekerja untuk daftar mana pun tetapi kami hanya menyebutnya dengan daftar input masalah, tidak ada kerugian byte dalam memanggilnya dengan argumen lsetiap kali karena panggilan dua argumen i%ltidak lebih dari satu argumen satu g i.


Kami punya L.SEBUAHTEX sini:)
flawr

Saya sangat suka %ide itu! Itu terlihat seperti versi diskrit dari momen statistik .
flawr

1

K (oK) , 33 23 byte

-10 byte berkat ngn!

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

Cobalah online!

Upaya pertama pada coding (saya tidak berani menyebutnya "golf") di K. Saya cukup yakin itu bisa dilakukan jauh lebih baik (terlalu banyak nama variabel di sini ...)


1
bagus! Anda dapat mengganti inisial (x-m)dengan t( tio )
ngn

1
bagian dalam { }tidak perlu - nama parameter implisitnya adalah xdan telah dilewatkan xsebagai argumen ( tio )
ngn

1
-1 byte lainnya dengan mengganti x-+/xdengan x-/x. argumen kiri untuk -/berfungsi sebagai nilai awal untuk reduksi ( tio )
ngn

@ ngn Terima kasih! Sekarang saya melihat bahwa 2 golf pertama sudah jelas; yang terakhir adalah di luar level saya sekarang :)
Galen Ivanov


1

TI-Basic (83 series), 14 11 byte

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

Membawa input Ans. Misalnya, jika Anda mengetikkan di atas prgmSTANDARD, maka {1,2,3}:prgmSTANDARDakan kembali {-1.224744871,0.0,1.224744871}.

Sebelumnya, saya mencoba menggunakan 1-Var Statsperintah, yang menyimpan standar deviasi populasi σx, tetapi lebih sedikit kesulitan untuk menghitungnya secara manual.


1

05AB1E , 9 byte

ÅA-DnÅAt/

Port dari jawaban JavaScript @Arnauld , jadi pastikan untuk menghapusnya!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Å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 19 bytes

mc-dJ.OQ@.Om^-Jk2Q2

Cobalah online di sini .

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

Sunting: setelah melihat jawaban Kevin , ubah menggunakan rata-rata bawaan untuk hasil dalam. Jawaban sebelumnya:mc-dJ.OQ@csm^-Jk2QlQ2


0

SNOBOL4 (CSNOBOL4) , 229 byte

	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)

Cobalah online!

Link adalah versi fungsional dari kode yang membangun array dari STDIN dengan panjangnya dan elemen-elemennya, kemudian menjalankan fungsinya Z, dan akhirnya mencetak nilainya.

Menentukan fungsi Zyang mengembalikan array.

The 1.on line 4 perlu dilakukan titik aritmatika floating benar.



0

Arang , 25 19 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Menghitung μ dan vektorised kurangi dari masing-masing xsaya.

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

Menghitung σ, masing-masing vektor dibagi xsaya olehnya, dan output hasilnya.

Sunting: Disimpan 6 byte berkat hanya @ ASCII untuk a) menggunakan SquareRoot()bukannya Power(0.5)b) memperbaiki vectorised Divide()(itu melakukan IntDivide()sebaliknya) c) membuat Power()vectorise.


dicoret 25 = tidak ada byte? : P (Juga, Anda belum memperbarui tautan TIO)
ASCII

@ Ups khusus ASCII, terima kasih!
Neil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.