Hitung Deviasi Standar


19

Tantangan

Diberikan daftar angka, hitung simpangan baku populasi dari daftar tersebut.

Gunakan persamaan berikut untuk menghitung simpangan baku populasi:

Memasukkan

Input akan daftar bilangan bulat dalam format apa pun (daftar, string, dll.). Beberapa contoh:

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

Angka-angka akan selalu berupa bilangan bulat.

Masukan akan ke STDIN atau argumen fungsi.

Keluaran

Output harus berupa angka floating point.

Aturan

Anda dapat menggunakan fungsi bawaan untuk menemukan standar deviasi.

Jawaban Anda dapat berupa program lengkap atau fungsi.

Contohnya

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Kemenangan

Program atau fungsi terpendek menang.

Papan peringkat


1
Maksud Anda output harus berupa floating point ATAU integer?
Mutador

3
Saya pikir sebagian besar fungsi standar deviasi menghitung sampel standar deviasi.
Mutador

Bagaimana jika daftar input tidak berlaku? 175656.78441352615 hasil bagi saya 175656.78441352614
RosLuP

@RosLuP Anda tidak perlu khawatir tentang hal itu
Pembusukan Beta

1
@ a13a22 Sesuai aturan standar PPCG, Anda boleh menerima input melalui argumen fungsi
Beta Decay

Jawaban:


18

Klip , 3

.sk

.sadalah standar deviasi, kmem-parsing input dalam bentuk {1,2,3}.


Formula apa yang digunakan untuk deviasi standar? Saya tidak dapat menemukannya dalam referensi.
flawr

@ flawr Ini bagan ini , menuju bagian bawah.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya melihat itu, tetapi tidak ada formula yang diberikan.
flawr

@ flawr Oh, begitu. Mungkin kemudian terserah penerjemah, jika hal seperti itu ada.
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya menemukannya di sini di jalur 493, sepertinya baik-baik saja!
flawr

11

Mathematica, 24 22 byte

Bagus, Mathematica memiliki built-in StandardDevi...oh ... yang menghitung standar deviasi sampel, bukan standar deviasi populasi.

Tetapi bagaimana jika kita menggunakan Variance... oh ... kesepakatan yang sama.

Tapi ada built-in lain yang terkait:

CentralMoment[#,2]^.5&

Yay. :)

Ini juga berfungsi untuk 22 byte:

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

Dan ini untuk 27:

N@RootMeanSquare[#-Mean@#]&

10

Oktaf, 14 byte

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

Cobalah di ideone .


2
Anda dapat menyimpan dua byte dengan menghapus g=karena pegangan fungsi tidak perlu nama untuk menjadi kiriman yang valid.
Alex A.

10

kdb + , 3 byte

dev

Salah satu yang diturunkan APL harus memiliki ini sebagai bawaan .

Uji coba

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 byte

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

Ini mendefinisikan kereta fungsi monadik tanpa nama, yang setara dengan fungsi berikut.

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

Cobalah secara online di TryAPL .

Bagaimana itu bekerja

Kode ini terdiri dari beberapa kereta.

M←+/÷≢

Ini mendefinisikan 3-kereta monadik (garpu) Myang mengeksekusi +/(jumlah semua elemen) dan (panjang) untuk argumen yang benar, kemudian menerapkan ÷(pembagian) untuk hasilnya, mengembalikan rata-rata aritmatika dari input.

M×M

Ini adalah garpu lain yang berlaku Muntuk argumen yang tepat, mengulangi ini untuk kedua kalinya, dan berlaku ×(produk) dengan hasil, kembali μ 2 .

×⍨-(M×M)

Ini adalah garpu lain yang menghitung kuadrat dari rata-rata aritmatika seperti yang dijelaskan sebelumnya, berlaku ×⍨(produk dengan dirinya sendiri) untuk argumen yang benar, dan akhirnya berlaku -(perbedaan) untuk hasilnya.

Untuk input (x 1 , ..., x N ) , fungsi ini mengembalikan (x 1 - μ 2 , ..., x N - μ 2 ) .

*∘.5∘M

Fungsi tersusun ini berlaku Muntuk argumen yang benar, lalu *∘.5. Yang terakhir menggunakan currying argumen kanan untuk menerapkan input peta ake a*0.5(akar kuadrat dari a).

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

Akhirnya, kita memiliki kereta 2 monadik (di atas), yang menerapkan fungsi kanan terlebih dahulu, lalu kiri ke hasilnya, menghitung standar deviasi sebagai berikut.

rumus


5

R, 41 40 39 36 30 28 byte

kode

Berkat gelas kimia , Alex A. dan MickyT untuk banyak byte.

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

kode lama

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) 

Ini harus menghasilkan deviasi standar populasi.


1
Saya tidak tahu R, tetapi apakah mungkin untuk menambah array input dengan rata-rata array? Tampaknya mungkin lebih pendek.
gelas kimia

1
Di situs ini kami biasanya tidak dapat mengasumsikan lingkungan REPL kecuali diizinkan secara eksplisit oleh pertanyaan. Jadi dalam hal ini Anda harus menggunakan catuntuk mencetak ke konsol.
Alex A.

1
Juga, R menggunakan ^untuk eksponensial, yang merupakan byte lebih pendek dari **.
Alex A.

1
Anda tidak perlu menjumlahkan mean karena meanmengembalikan skalar; sumtidak berpengaruh. 36 byte:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.

1
@ AndréMuta meminta maaf, ketika saya mengujinya saya punya X berkeliaran.
MickyT

5

Pyth, 20 19 17 13 byte

@.O^R2-R.OQQ2

Terima kasih kepada @FryAmTheEggman untuk bermain golf 4 byte!

Cobalah online.

Bagaimana itu bekerja

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

Saya suka bagaimana dekomposisi program Pyth terlihat seperti parabola miring.
Conor O'Brien

5

CJam, 24 22 21 byte

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

Terima kasih kepada @aditsu karena bermain golf 1 byte!

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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.

Saya pikir Anda dapat mengonversi panjangnya menjadi ganda
aditsu

@aditsu tentu saja. Terima kasih!
Dennis

5
:mhis genius btw :)
aditsu

2
Reduce by hypotenuse.bukan sesuatu yang Anda lihat setiap hari.
lirtosiast

4

APL, 24 byte

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

Pendekatan yang sedikit berbeda dari solusi APL Dennis 'Dyalog . Ini harus bekerja dengan implementasi APL apa pun.

Ini menciptakan fungsi monadik tanpa nama yang menghitung vektor ( x - μ ) 2 sebagai 2*⍨⍵-+/⍵÷≢⍵, membaginya dengan N ( ÷≢⍵), mengambil jumlah vektor ini menggunakan +/, dan kemudian mengambil akar kuadrat ( .5*⍨).

Cobalah online


Tidak setiap pelaksanaan APL mendukung {dfns }, atau . Namun, setiap versi mendukungR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Ad

4

Julia, 26 19 byte

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

Ini menciptakan fungsi tanpa nama yang menerima array dan mengembalikan float.

Tidak disatukan, saya kira:

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 byte

stdDev(augment(Ans,{mean(Ans

Saya meminjam algoritma untuk mendapatkan simpangan baku populasi dari simpangan baku sampel dari sini .

Solusi terpendek yang dapat saya temukan tanpa augment(9 byte:

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

Saya setuju dengan AndréMuta, ini tidak menghasilkan hasil yang diminta, lihat di sini.
flawr

1
@ AndréMuta @flawr TI bawaan stdDev(menghitung sampel SD; stdDev(augment(Ans,{mean(Ansmenghitung populasi SD. Itu ada di halaman yang Anda tautkan.
lirtosiast

3

Haskell, 61 byte

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

Mudah, kecuali mungkin fungsi panjang kustom saya sum(n>>[1])untuk menipu sistem tipe ketat Haskell.


Anda dapat menggunakan sum(1<$n)dan <$>untuk map.
Laikoni

Terpikir oleh saya bahwa fungsi-fungsi itu mungkin tidak ada karena versi GHC yang lebih lama pada saat jawaban ini, tetapi menurut tip ini mereka diperkenalkan pada awal Maret 2015, dan kebijakan situs telah berubah pula untuk memungkinkan bahasa yang lebih baru fitur.
Laikoni

3

Python 3.4+, 30 byte

from statistics import*;pstdev

Mengimpor fungsi bawaan pstdev, misalnya

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

Saya pikir pstdevsetelah baris pertama ok? Saya percaya xnor melakukan itu beberapa waktu yang lalu dengan sum. Ini semacam masuk akal bagaimana lambdas anonim akan digunakan yaitu p=pstdevataumap(pstdev, [...])
FryAmTheEggman

Saya akan mengatakan hal yang sama. Postingan Meta tampaknya mendukung hanya menempatkan fungsi literal.
xnor

Saya pikir Anda masih perlu menulis yang literal pstdev, suka from statistics import*;pstdev. Kalau tidak, ini bisa berupa fungsi apa pun dari perpustakaan itu.
xnor

@xnor Diedit. tbh Saya tidak begitu yakin tentang putusan dalam situasi ini ...
Sp3000

Mungkin pertanyaan meta akan membantu? :)
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 Mengenai ketepatan output? Asli saya sebenarnya tidak memiliki yang benar, dan saya memperbaikinya setelah itu, hanya untuk menemukan titik apung itu ok hehe ... Jadi apakah sekarang baik seperti sekarang?
Mwr247

Ya itu baik-baik saja :)
Beta Decay

7
Psst ... Anda dapat mencukur 5 byte dengan menggunakan metode penjumlahan ini eval(a.join`+`)alih-alih a.reduce((e,f)=>e+f)
George Reith

@ GeorgeReith Trik yang bagus! Aku harus mengingatnya untuk nanti ...
Mwr247

2

Jelly , tidak bersaing

11 byte Jawaban ini tidak bersaing, karena menggunakan bahasa yang mengatasi tantangan.

S÷L
Dz_²ÇN½

Ini adalah terjemahan langsung dari jawaban APL saya ke Jelly. Cobalah online!

Bagaimana itu bekerja

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 byte

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

Ini adalah terjemahan langsung dari jawaban APL saya ke J.

Cobalah online!


Saya tidak tahu Mitu
Conor O'Brien

Bukan itu. M=:+/%#adalah definisi fungsi sebaris.
Dennis

Tapi itu sudah ditentukan sebelumnya, kan? Mungkin builtin adalah istilah yang salah
Conor O'Brien

Tidak, itu tidak ditentukan sebelumnya. M=:+/%#menghemat kata kerja +/%#diM , kemudian menyebutnya.
Dennis

Maaf XD saya tidak melihat bagian terakhir
Conor O'Brien

1

Simplex v.0.5 , 43 byte

Cuz. Saya benar-benar perlu bermain golf satu byte lagi.

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 byte

Kode:

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

Penjelasan:

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

Contoh:

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

Cobalah online di sini


1

Perl5, 39 38


 16 untuk skrip
+22 untuk Msakelar
+ 1 untuk Esakelar
= 39

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

Diuji dalam Strawberry 5.20.2.


Oh, tapi kemudian saya menyadari bahwa Anda mengatakan jawaban kami bisa berfungsi, bukan program. Dalam hal itu,

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

baru saja 38. Diuji dalam Strawberry 5.20.2 sebagai

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

0

Python, 57 byte

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

Mengambil input sebagai daftar

Terima kasih @ xnor


Saya pikir Anda bisa melakukan .5di tempat 0.5untuk menyimpan byte. Maksud Anda, len(x)bukan len(l)?
Alex A.

@AlexA. Uhh, tidak, kurasa tidak ...
Beta Decay

1
Maaf, bingung. Abaikan xdan lomong kosong. Tetapi Anda masih bisa melakukannya .5untuk menghemat satu byte.
Alex A.

1
@BetaDecay Ini lebih pendek untuk menggunakan daftar-comp dari untuk memetakan lambda: sum((x-sum(l)/len(l))**2for x in l).
xnor

1
Formulasi yang berbeda memberikan panjang yang sama: 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)

penjelasan

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

hasil

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

Hanya implementasi langsung dari persamaan di 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 byte (sebagai fungsi)

Saya hanya memperhatikan itu diizinkan menjadi fungsi. Aduh, itu mengurangi jawaban saya secara dramatis. Ini mendefinisikan fungsi Syang mengambil array dan mengembalikan deviasi standar populasi. Bacalah yang lain untuk penjelasan, tetapi lewati bagian parsing. Saya tidak ingin melakukannya lagi.

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

Sebagai sebuah program, 212 byte

Sayangnya, saya harus mengambil daftar input sebagai string dan menguraikannya sendiri. Ini menambahkan lebih dari 100 byte jawaban, jadi jika beberapa format input selain daftar yang dipisahkan koma diizinkan, saya akan senang mendengarnya. Perhatikan juga bahwa karena VALbuggy, memiliki ruang sebelum koma atau mengekstraksi string akan merusak program. Setelah koma atau di awal string baik-baik saja.

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)

Tidak digabungkan dan dijelaskan:

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

Aksioma, 137 byte

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

Fungsi m () akan mengembalikan rata-rata daftar dalam input. Kedua fungsi pada pengembalian kesalahan% i konstanta imajiner konstan (-1). Kode untuk pengujian dan hasil. [Tapi hasilnya jika itu ok, itu adalah bagian nyata dari satu bilangan kompleks]

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

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

Menerapkan rumus untuk deviasi standar

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.