Standart Sapmayı Hesapla


19

Meydan okuma

Bir sayı listesi verildiğinde, listenin popülasyon standart sapmasını hesaplayın.

Popülasyon standart sapmasını hesaplamak için aşağıdaki denklemi kullanın:

Giriş

Giriş, herhangi bir formatta (liste, dize vb.) Bir tamsayı listesi olacaktır. Bazı örnekler:

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

Sayılar her zaman tamsayı olur.

Girdi STDIN veya işlev bağımsız değişkenlerine yapılacaktır.

Çıktı

Çıktı bir kayan nokta sayısı olmalıdır.

kurallar

Standart sapmayı bulmak için yerleşik işlevleri kullanabilirsiniz.

Cevabınız tam bir program veya bir fonksiyon olabilir.

Örnekler

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Kazanan

En kısa program veya işlev kazanır.

Liderler Sıralaması


1
Çıktının bir kayan nokta VEYA tamsayı olması mı demek istediniz?
Mutador

3
Çoğu standart sapma fonksiyonlarının örnek standart sapmayı hesapladığını düşünüyorum.
Mutador

Giriş listesi geçersizse ne olur? 175656.78441352615 sonuç bana 175656.78441352614
RosLuP

@RosLuP Bunun için endişelenmenize gerek yok
Beta

1
@ a13a22 PPCG'nin standart kurallarına göre, işlev bağımsız değişkenleri aracılığıyla girdi almakta fayda var
Beta Decay

Yanıtlar:


18

Klip , 3

.sk

.sstandart sapmadır, kgirdiyi formda ayrıştırır {1,2,3}.


Standart sapma için hangi formül kullanılır? Referansta bulamadım.
Kusur

@flawr Bu grafik , aşağıya doğru.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Bunu gördüm, ama verilen bir formül yok.
Kusur

@flawr Oh, anlıyorum. Belki de böyle bir şey varsa, tercümana bağlıdır.
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Burada 493 satırında buldum , iyi görünüyor!
Kusur

11

Mathematica, 24 22 bayt

Güzel, Mathematica'da StandardDevi...popülasyon standart sapmasını değil, örnek standart sapmayı hesaplayan yerleşik bir oh vardır.

Ama ya kullanırsak Variance... oh ... aynı anlaşma.

Ancak başka bir ilgili yerleşik var:

CentralMoment[#,2]^.5&

Yaşasın. :)

Bu aynı zamanda 22 bayt için de geçerlidir:

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

Ve bu 27 için:

N@RootMeanSquare[#-Mean@#]&

10

Oktav, 14 bayt

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

İdeone üzerinde deneyin .


2
g=İşlev tanıtıcısının geçerli bir gönderim olması için bir ad gerektirmediğinden, kaldırarak iki bayt kaydedebilirsiniz .
Alex

10

kdb + , 3 bayt

dev

APL derviatlarından birinin buna yerleşik olarak sahip olması gerekiyordu .

Test sürüşü

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 bayt

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

Bu, aşağıdaki işleve eşdeğer olan adsız, monadik bir işlev dizisi tanımlar.

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

TryAPL'de çevrimiçi deneyin .

Nasıl çalışır

Kod birkaç trenden oluşur.

M←+/÷≢

Bu , doğru argüman için ( tüm öğelerin toplamı) ve (uzunluk) Myürüten , daha sonra sonuçlara (bölme) uygulayarak girişin aritmetik ortalamasını döndüren monadik bir 3-treni (çatal) tanımlar .+/÷

M×M

Bu, Mdoğru argüman için geçerli olan, bunu ikinci kez tekrarlayan ×ve sonuçlara (ürün) μ 2 döndüren başka bir çatal .

×⍨-(M×M)

Bu, daha önce açıklandığı gibi aritmetik ortalamanın karesini hesaplayan, ×⍨doğru argümana (kendisiyle ürün) ve son -olarak sonuçlara (fark) uygulayan başka bir çataldır.

Giriş (x 1 ,…, x N ) için bu işlev geri döner (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Bu oluşturulan işlev, Mdoğru argümanı için geçerlidir *∘.5. İkincisi kullanımları doğru argüman tımar haritası girişini uygulamak aiçin a*0.5(kare kökü a).

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

Son olarak, önce doğru işlevi, sonra solu sonuca uygulayan ve standart sapmayı aşağıdaki gibi hesaplayan bu monadik 2-tren (üstüne) var.

formül


5

R, 41 40 39 36 30 28 bayt

kod

Sayesinde beher , Alex A. ve MickyT çok bayt için.

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

eski kodlar

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) 

Bu, popülasyon standart sapmasını sağlamalıdır.


1
R bilmiyorum, ama dizi ortalama ile giriş dizisini artırmak mümkün olurdu? Daha kısa olabilir.
beher

1
Bu sitede, soru tarafından açıkça izin verilmedikçe, genellikle bir REPL ortamını kabul edemeyiz. Bu nedenle, bu durumda catkonsola yazdırmak için kullanmanız gerekir .
Alex

1
Ayrıca, R, ^daha kısa bir bayt olan üs alma için kullanır **.
Alex

1
meanBir skaler döndürdüğü için ortalamayı toplamalısınız; sumetkisi yoktur. 36 bayt:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex

1
@ AndréMuta özür dilerim, test ettiğimde etrafta asılı duran bir X vardı.
MickyT

5

Pyth, 20 19 17 13 bayt

@.O^R2-R.OQQ2

4 bayt golf için @FryAmTheEggman teşekkürler!

Çevrimiçi deneyin.

Nasıl çalışır

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

Bir Pyth programının ayrışmasının eğik bir parabol gibi görünmesini seviyorum.
Conor O'Brien

5

CJam, 24 22 21 bayt

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

@Aditsu'ya 1 baytlık golf için teşekkürler!

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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.

Ben sadece uzunluğu çift dönüştürebilirsiniz düşünüyorum
aditsu

@aditsu Elbette. Teşekkürler!
Dennis

5
:mh dahi btw :)
aditsu

2
Reduce by hypotenuse.her gün gördüğün bir şey değil.
lirtosiast

4

APL, 24 bayt

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

Dennis'in Dyalog APL çözümünden biraz farklı bir yaklaşım . Bu, herhangi bir APL uygulamasıyla çalışmalıdır.

Bu, vektörü ( x - µ ) hesaplayan adsız bir monadik işlev oluşturur 2 olarak 2*⍨⍵-+/⍵÷≢⍵ile bölme bu N ( ÷≢⍵), kullanılarak, bu vektörden toplamını alır +/ve daha sonra kare kökünü (alır .5*⍨).

Çevrimiçi deneyin


Her APL uygulama destekler {dfns }, ya . Ancak, her sürüm desteklerR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám

4

Julia, 26 19 bayt

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

Bu, bir diziyi kabul eden ve bir kayan nokta döndüren adsız bir işlev oluşturur.

Kurtulmamış, sanırım:

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 bayt

stdDev(augment(Ans,{mean(Ans

Buradan örnek standart sapmadan popülasyon standart sapmasını elde etmek için algoritmayı ödünç aldım .

Ben olmadan bulabildiğim en kısa çözüm augment(9 bayt:

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

AndréMuta'ya katılıyorum, bu gerekli sonucu vermiyor, buraya
Kusur

1
@ AndréMuta @flawr TI'nin yerleşik stdDev(örneği örnek SD'yi hesaplar; stdDev(augment(Ans,{mean(Anspopülasyon SD'sini hesaplar. Bağlantı verdiğiniz sayfada.
lirtosiast

3

Haskell, 61 bayt

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

sum(n>>[1])Haskell'in katı tip sistemini kandırmak için belki de benim özel uzunluk fonksiyonum hariç .


sum(1<$n)Ve <$>için kullanabilirsiniz map.
Laikoni

Bu yanıtın zamanında daha eski bir GHC sürümü nedeniyle bu işlevlerin mevcut olmayabileceği aklıma geldi, ancak bu ipucuna göre, Mart 2015'te başlangıç ​​seviyesine getirildiler ve site politikası daha yeni bir dile izin vermek için yine de değişti özellikleri.
Laikoni

3

Python 3.4+, 30 bayt

from statistics import*;pstdev

Yerleşik işlevi içe aktarır pstdev, ör.

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

pstdevİlk satırdan hemen sonra sorun değil mi? Xnor'ın bunu bir süre önce yaptığını düşünüyorum sum. Anonim lambdaların nasıl kullanılacağına dair bir anlam ifade eder p=pstdevveyamap(pstdev, [...])
FryAmTheEggman 15:15

Ben de aynı şeyi söyleyecektim. Meta yayınlar sadece bir fonksiyon hazırlamayı destekliyor gibi görünüyor.
xnor

Hâlâ hazır bilgi yazmak gerektiğini düşünüyorum pstdevgibi olsa from statistics import*;pstdev. Aksi takdirde, bu kütüphaneden herhangi bir işlev olabilir.
xnor

@xnor Düzenlendi. tbh Bu durumlar hakkındaki karardan gerçekten emin değilim ...
Sp3000

Belki bir meta soru yardımcı olabilir? :)
Beta

2

JavaScript (ES6), 73 bayt

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

@BetaDecay Çıktının hassasiyeti ile ilgili mi? Orijinalim aslında bu kadar doğru değildi ve hemen sonra sabitledim, sadece kayan noktayı bulmak için hehe ... Yani şimdi olduğu gibi iyi mi?
Mwr247

Evet bu iyi :)
Beta Çürüğü

7
Psst ... eval(a.join`+`)yerine bu toplama yöntemini kullanarak 5 bayt tıraş olabilira.reduce((e,f)=>e+f)
George Reith

@GeorgeReith Güzel numara! Bunu daha sonra hatırlamak zorundayım ...
Mwr247

2

Jöle , rakipsiz

11 byte Bu cevap yarışmayı zorlaştırır, çünkü meydan okumayı destekleyen bir dil kullanır.

S÷L
Dz_²ÇN½

Bu, Jelly'e APL cevabımın doğrudan çevirisidir .Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Bu benim APL cevabımın doğrudan çevirisidir J.

Çevrimiçi deneyin!


MÖnceden tanımlanmış bir yapı hakkında hiçbir fikrim yoktu.
Conor O'Brien

Öyle değil. M=:+/%#satır içi işlev tanımıdır.
Dennis

Ama önceden tanımlanmış, değil mi? Belki de yerleşik yanlış terimdir
Conor O'Brien

Hayır, önceden tanımlanmamış. M=:+/%#fiilini kaydeder +/%#içinde M, o zaman çağırır.
Dennis

Üzgünüm XD Son kısmı görmedim
Conor O'Brien

1

Simpleks s.0.5 , 43 bayt

Sadece Cuz. Gerçekten bu bir bayt daha golf gerekiyor.

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 bayt

Kod:

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

Açıklama:

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

Misal:

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

Burada çevrimiçi deneyin


1

Perl5, 39 38


 Komut dosyası için 16
için 22 Manahtar
için +1 Edüğmesi
39 =

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

Çilekte Test Edildi 5.20.2.


Oh, ama sonra cevaplarımızın programlar yerine fonksiyonlar olabileceğini söyledin. Bu durumda,

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

sadece 38. Çilek 5.20.2'de test edilmiştir.

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

0

Python, 57 bayt

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

Girişi liste olarak alır

Teşekkürler @xnor


Ne yapabilirim düşünüyorum .5yerine 0.5bir bayt kaydedin. len(x)Bunun yerine mi demek istiyorsun len(l)?
Alex

@AlexA. Ah, hayır sanmıyorum ...
Beta Çürümesi

1
Üzgünüm, kafam karıştı. Yok sayın xve lsaçma. Ama yine de .5bir bayt kaydetmek için yapabilirsiniz .
Alex

1
@BetaDecay List-comp kullanmak lambda: eşlemekten daha kısadır sum((x-sum(l)/len(l))**2for x in l).
xnor

1
Farklı formülasyon aynı uzunluğa elde edilmiştir: 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)

açıklama

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

sonuç

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

Fortran'daki denklemin basit bir uygulaması:

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 bayt (işlev olarak)

Bir fonksiyon olmasına izin verildiğini fark ettim. Hata! Cevabımı önemli ölçüde azaltır. Bu, bir Sdizi alan ve popülasyon standart sapmasını döndüren bir işlevi tanımlar . Bir açıklama için diğerini okuyun, ancak ayrıştırma bölümünü atlayın. Bir daha yapmak istemiyorum.

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

Bir program olarak, 212 bayt

Ne yazık ki, giriş listesini bir dize olarak almak ve kendim ayrıştırmak zorunda. Bu, yanıta 100 bayt ekler, bu nedenle virgülle ayrılmış bir listeden başka bir giriş biçimine izin verilirse, bunu duymaktan memnuniyet duyarım. Ayrıca VAL, buggy olduğu için virgülden önce bir boşluğa sahip olmanın veya dizenin sonunun programı kırdığını unutmayın. Virgülden sonra veya dizenin başlangıcında sorun yoktur.

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)

Açık ve açık:

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

Aksiyom, 137 bayt

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

M () işlevi girişteki listenin ortalamasını döndürür. Hatadaki her iki işlev de% i sanal sabit sqrt (-1) değerini döndürür. Test kodu ve sonuçları. [ama sonuç iyi ise, karmaşık bir sayının gerçek kısmıdır]

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

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

Standart sapma formülünü uygular

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.