Tính độ lệch chuẩn


19

Thử thách

Đưa ra một danh sách các số, tính độ lệch chuẩn dân số của danh sách.

Sử dụng phương trình sau để tính độ lệch chuẩn dân số:

Đầu vào

Đầu vào sẽ một danh sách các số nguyên ở bất kỳ định dạng nào (danh sách, chuỗi, v.v.). Vài ví dụ:

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

Các số sẽ luôn là số nguyên.

Đầu vào sẽ là STDIN hoặc đối số hàm.

Đầu ra

Đầu ra phải là một số dấu phẩy động.

Quy tắc

Bạn có thể sử dụng các hàm dựng sẵn để tìm độ lệch chuẩn.

Câu trả lời của bạn có thể là một chương trình đầy đủ hoặc một chức năng.

Ví dụ

10035, 436844, 42463, 44774 => 175656.78441352615

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

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

Chiến thắng

Chương trình hoặc chức năng ngắn nhất sẽ thắng.

Bảng xếp hạng


1
Bạn có nghĩa là đầu ra phải là một dấu phẩy động HOẶC số nguyên?
Mutador

3
Tôi nghĩ rằng hầu hết các hàm độ lệch chuẩn tích hợp đều tính toán độ lệch chuẩn mẫu.
Mutador

Điều gì về nếu danh sách đầu vào là void? 175656.78441352615 cho tôi 175656.78441352614
RosLuP

@RosLuP Bạn không phải lo lắng về điều đó
Beta Decay

1
@ a13a22 Theo quy tắc tiêu chuẩn của PPCG, bạn có thể lấy thông tin đầu vào thông qua các đối số chức năng
Beta Decay

Câu trả lời:


18

Clip , 3

.sk

.slà độ lệch chuẩn, kphân tích cú pháp đầu vào trong biểu mẫu {1,2,3}.


Công thức nào được sử dụng cho độ lệch chuẩn? Tôi không thể tìm thấy nó int anh tham khảo.
flawr

@flawr Đây là biểu đồ này , về phía dưới.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi đã thấy điều đó, nhưng không có công thức nào được đưa ra.
flawr

@flawr ơi, tôi hiểu rồi. Có lẽ sau đó tùy thuộc vào người phiên dịch, nếu một điều như vậy tồn tại.
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi tìm thấy nó ở đây trên dòng 493, nó có vẻ ổn!
flawr

11

Toán học, 24 22 byte

Thật tuyệt, Mathicala có tích hợp StandardDevi...oh ... tính toán độ lệch chuẩn mẫu, không phải độ lệch chuẩn dân số.

Nhưng nếu chúng ta sử dụng Variance... oh ... cùng một thỏa thuận.

Nhưng có một tích hợp liên quan khác:

CentralMoment[#,2]^.5&

Yay :)

Điều này cũng hoạt động cho 22 byte:

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

Và điều này cho 27:

N@RootMeanSquare[#-Mean@#]&

10

Octave, 14 byte

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

Hãy thử nó trên ideone .


2
Bạn có thể lưu hai byte bằng cách xóa g=vì hàm xử lý không cần tên để gửi hợp lệ.
Alex A.

10

kdb + , 3 byte

dev

Một trong những người giám sát APL phải có điều này như là một tích hợp.

Chạy thử nghiệm

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

Thuốc nhuộm APL, 24 23 21 20 19 17 byte

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

Điều này định nghĩa một hàm chức năng đơn âm, không tên, tương đương với chức năng sau.

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

Hãy thử chúng trực tuyến trên TryAPL .

Làm thế nào nó hoạt động

Mã này bao gồm một số chuyến tàu.

M←+/÷≢

Điều này xác định một đơn vị 3 tàu (ngã ba) Mthực thi +/(tổng tất cả các phần tử) và (độ dài) cho đối số đúng, sau đó áp dụng ÷(chia) cho kết quả, trả về giá trị trung bình số học của đầu vào.

M×M

Đây là một ngã ba khác áp dụng Mcho đối số đúng, lặp lại lần thứ hai này và áp dụng ×(sản phẩm) cho kết quả, trả về μ 2 .

×⍨-(M×M)

Đây là một ngã ba khác tính bình phương trung bình số học như đã giải thích trước đó, áp dụng ×⍨(sản phẩm với chính nó) cho đối số đúng và cuối cùng áp dụng -(chênh lệch) cho kết quả.

Đối với đầu vào (x 1 , Hoài, x N ) , hàm này trả về (x 1 - 2 , Mạnh , x N - 2 ) .

*∘.5∘M

Hàm tổng hợp này được áp dụng Mcho đối số đúng của nó, sau đó *∘.5. Cái sau sử dụng currying đối số đúng để áp dụng đầu vào bản đồ acho a*0.5(căn bậc hai của a).

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

Cuối cùng, chúng ta có 2 tàu đơn (trên đỉnh) này, áp dụng chức năng bên phải trước, sau đó bên trái cho kết quả của nó, tính toán độ lệch chuẩn như sau.

công thức


5

R, 41 40 39 36 30 28 byte

Nhờ có cốc , Alex A.MickyT cho nhiều byte.

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

mã cũ

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) 

Điều này sẽ mang lại độ lệch chuẩn dân số.


1
Tôi không biết R, nhưng liệu có thể tăng mảng đầu vào với giá trị trung bình của mảng không? Có vẻ như có thể ngắn hơn.
cốc

1
Trên trang này, chúng tôi thường không thể sử dụng môi trường REPL trừ khi câu hỏi được cho phép rõ ràng. Do đó, trong trường hợp này, bạn sẽ cần sử dụng catđể in ra bàn điều khiển.
Alex A.

1
Ngoài ra, R sử dụng ^cho lũy thừa, ngắn hơn một byte **.
Alex A.

1
Bạn không cần tính tổng trung bình kể từ khi meantrả về vô hướng; sumkhông có hiệu lực. 36 byte:x=scan();cat(mean((x-mean(x))^2)^.5)
Alex A.

1
@ AndréMuta xin lỗi, khi tôi kiểm tra nó, tôi có một chữ X treo xung quanh.
MickyT

5

Pyth, 20 19 17 13 byte

@.O^R2-R.OQQ2

Cảm ơn @FryAmTheEggman vì đã chơi golf 4 byte!

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

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

Tôi thích cách phân rã của một chương trình Pyth trông giống như một parabola bị lệch.
Conor O'Brien

5

CJam, 24 22 21 byte

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

Cảm ơn @aditsu vì đã chơi golf 1 byte!

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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.

Tôi nghĩ bạn có thể chuyển đổi độ dài thành gấp đôi
aditsu

@aditsu Tất nhiên rồi. Cảm ơn!
Dennis

5
:mhlà thiên tài btw :)
aditsu

2
Reduce by hypotenuse.không phải là thứ bạn nhìn thấy hàng ngày.
lirtosiast

4

APL, 24 byte

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

Một cách tiếp cận khác một chút so với giải pháp APL của Dennis . Điều này sẽ làm việc với bất kỳ thực hiện APL.

Điều này tạo ra một chức năng monadic giấu tên rằng tính toán vector ( x - μ ) 22*⍨⍵-+/⍵÷≢⍵, phân chia này bằng N ( ÷≢⍵), có tổng của vector này sử dụng +/, và sau đó mất căn bậc hai ( .5*⍨).

Dùng thử trực tuyến


Không phải mọi thực hiện APL hỗ trợ {dfns }, hoặc . Tuy nhiên, mọi phiên bản đều hỗ trợR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám

4

Julia, 26 19 byte

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

Điều này tạo ra một hàm không tên chấp nhận một mảng và trả về một float.

Ungolfed, tôi đoán:

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

Tôi đã mượn thuật toán để có độ lệch chuẩn dân số so với độ lệch chuẩn mẫu từ đây .

Giải pháp ngắn nhất tôi có thể tìm thấy mà không augment(có 9 byte:

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

Tôi đồng ý với AndréMuta, điều này không tạo ra kết quả cần thiết, xem tại đây.
flawr

1
Nội dung của @ AndréMuta @flawr TI stdDev(tính toán SD mẫu; stdDev(augment(Ans,{mean(Anstính toán dân số SD. Đó là trên trang bạn liên kết đến.
lirtosiast

3

Haskell, 61 byte

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

Nói một cách đơn giản, ngoại trừ chức năng độ dài tùy chỉnh của tôi sum(n>>[1])để đánh lừa hệ thống loại nghiêm ngặt của Haskell.


Bạn có thể sử dụng sum(1<$n)<$>cho map.
Laikoni

Tôi nhận ra rằng các chức năng đó có thể không xuất hiện do phiên bản GHC cũ hơn tại thời điểm trả lời này, nhưng theo mẹo này, chúng được giới thiệu để mở đầu vào tháng 3 năm 2015 và chính sách trang web đã thay đổi để cho phép ngôn ngữ mới hơn Tính năng, đặc điểm.
Laikoni

3

Python 3,4+, 30 byte

from statistics import*;pstdev

Nhập hàm dựng sẵn pstdev, vd

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

Tôi nghĩ chỉ pstdevsau dòng đầu tiên là ok? Tôi tin rằng xnor đã làm điều đó một thời gian trước với sum. Thật ý nghĩa khi biết lambdas ẩn danh sẽ được sử dụng như thế nào p=pstdevhoặcmap(pstdev, [...])
FryAmTheEggman

Tôi sẽ nói điều tương tự. Meta bài viết dường như chỉ hỗ trợ đặt một chức năng theo nghĩa đen.
xnor

Tôi nghĩ rằng bạn vẫn cần phải viết theo nghĩa đen pstdev, như thế from statistics import*;pstdev. Mặt khác, đây có thể là bất kỳ chức năng nào từ thư viện đó.
xnor

@xnor Đã chỉnh sửa. tbh Tôi không thực sự chắc chắn về phán quyết trong những tình huống này ...
Sp3000

Có lẽ một câu hỏi meta sẽ hữu ích? :)
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 Về độ chính xác của đầu ra? Bản gốc của tôi thực sự không có chính xác, và tôi đã sửa nó ngay sau đó, chỉ để khám phá điểm nổi là ok hehe ... Vậy bây giờ nó có tốt không?
Mwr247

Vâng không sao :)
Beta Decay

7
Psst ... bạn có thể tắt 5 byte bằng cách sử dụng phương pháp tổng hợp này eval(a.join`+`)thay vì a.reduce((e,f)=>e+f)
George Reith

@GeorgeReith Thủ thuật hay! Tôi sẽ phải nhớ cái đó sau ...
Mwr247

2

Thạch , không cạnh tranh

11 byte Câu trả lời này không có tính cạnh tranh, vì nó sử dụng một ngôn ngữ trì hoãn thử thách.

S÷L
Dz_²ÇN½

Đây là bản dịch trực tiếp câu trả lời APL của tôi cho Jelly. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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=:+/%#

Đây là bản dịch trực tiếp câu trả lời APL của tôi cho J.

Hãy thử trực tuyến!


Tôi không biết Mlà một bản dựng sẵn được xác định trước.
Conor O'Brien

Không phải vậy. M=:+/%#là một định nghĩa hàm nội tuyến.
Dennis

Nhưng nó được xác định trước, phải không? Có lẽ nội dung sai là thuật ngữ sai
Conor O'Brien

Không, nó không được xác định trước. M=:+/%#lưu động từ +/%#vào M, sau đó gọi nó.
Dennis

Tôi xin lỗi XD Tôi đã không xem phần cuối
Conor O'Brien

1

Đơn giản v.0.5 , 43 byte

Chỉ là anh em họ thôi. Tôi thực sự cần phải chơi thêm một byte này.

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

Mã số:

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

Giải trình:

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

Thí dụ:

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

Dùng thử trực tuyến tại đây


1

Perl5, 39 38


 16 cho tập lệnh
+22 cho công Mtắc
+ 1 cho công Etắc
= 39

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

Thử nghiệm ở Dâu 5.20.2.


Ồ, nhưng sau đó tôi nhận ra rằng bạn nói câu trả lời của chúng tôi có thể là chức năng thay vì chương trình. Trong trường hợp đó,

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

vừa 38. Đã thử nghiệm ở Dâu 5.20.2 như

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

Đưa đầu vào thành một danh sách

Cảm ơn @xnor


Tôi nghĩ bạn có thể làm .5thay thế 0.5để tiết kiệm một byte. Ngoài ra bạn có nghĩa là len(x)thay vì len(l)?
Alex A.

@AlexA. Uhh, không, tôi không nghĩ vậy ...
Beta Decay

1
Xin lỗi, đã nhầm lẫn. Coi thường xlvô nghĩa. Nhưng bạn vẫn có thể làm .5để tiết kiệm một byte.
Alex A.

1
@BetaDecay Sử dụng danh sách comp ngắn hơn so với ánh xạ lambda : sum((x-sum(l)/len(l))**2for x in l).
xnor

1
Một công thức khác nhau cho cùng một chiều dài : 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)

giải trình

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

kết quả

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

Chỉ cần thực hiện đơn giản phương trình trong 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 (dưới dạng hàm)

Tôi chỉ nhận thấy nó được phép là một chức năng. Rất tiếc, điều đó làm giảm đáng kể câu trả lời của tôi. Điều này xác định một hàm Slấy một mảng và trả về độ lệch chuẩn dân số. Đi đọc phần khác để giải thích, nhưng bỏ qua phần phân tích cú pháp. Tôi không muốn làm lại.

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

Là một chương trình, 212 byte

Thật không may, tôi phải lấy danh sách đầu vào dưới dạng một chuỗi và tự phân tích nó. Điều này thêm hơn 100 byte vào câu trả lời, vì vậy nếu một số định dạng đầu vào không phải là danh sách được phân tách bằng dấu phẩy được cho phép, tôi rất vui khi nghe nó. Cũng lưu ý rằng vì VALlà lỗi, có một khoảng trắng trước dấu phẩy hoặc theo dõi chuỗi phá vỡ chương trình. Sau dấu phẩy hoặc ở đầu chuỗi là tốt.

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 và giải thích:

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

Tiên đề, 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])))

Hàm m () sẽ trả về giá trị trung bình của danh sách trong đầu vào. Cả hai hàm trên đều trả về% i là hằng số tưởng tượng sqrt (-1). Mã để kiểm tra và kết quả. [nhưng kết quả nếu nó ổn, nó là phần thực của một số phức]

(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

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

Thực hiện công thức cho độ lệch chuẩn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.