Chuẩn hóa các mẫu (Tính điểm z)


14

Đưa ra một danh sách các số dấu phẩy động, chuẩn hóa nó .

Chi tiết

  • Danh sách được chuẩn hóa nếu giá trị trung bình của tất cả các giá trị là 0 và độ lệch chuẩn là 1. Một cách để tính toán điều này là bằng cách tính toán trung bình và độ lệch chuẩn là và sau đó tính toán tiêu chuẩn hóa bằng cách thay thế mọi bằng .x1,x2,,xnμσ
    μ=1ni=1nxiσ=1ni=1n(xiμ)2,
    xixiμσ
  • Bạn có thể giả sử rằng đầu vào chứa ít nhất hai mục nhập riêng biệt (ngụ ý ).σ0
  • Lưu ý rằng một số việc triển khai sử dụng độ lệch chuẩn mẫu, mà là không bằng với dân số độ lệch chuẩn chúng tôi đang sử dụng ở đây.σ
  • Có một câu trả lời CW cho tất cả các giải pháp tầm thường .

Ví dụ

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

(Những ví dụ này đã được tạo với tập lệnh này .)

Câu trả lời:





4

MATL , 10 byte

tYm-t&1Zs/

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

Giải trình

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 + THẮNG, 41,32 30 byte

9 byte được lưu nhờ vào Erik + 2 nhờ vào ngn

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

Nhắc cho vectơ số và tính toán độ lệch chuẩn và các phần tử chuẩn của vectơ đầu vào


Bạn không thể chỉ định x←v-(+/v)÷⍴v←⎕và sau đó làm gì x÷((+/x*2)÷⍴v)*.5?
Erik the Outgolfer 14/12/18

Tôi thực sự có thể. Cảm ơn.
Graham

apl + win có làm phần mở rộng singleton ( 1 2 3+,4← → 1 2 3+4) không? nếu có, bạn có thể viết lại (+/x*2)÷⍴vthành+/x×x÷⍴v
ngn 16/12/18

@ngn Điều đó làm việc cho 2 byte khác. Cảm ơn.
Graham

3

R + pryr, 53 52 byte

-1 byte sử dụng sum(x|1)thay vì length(x)như đã thấy trong giải pháp của @Robert S.

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

Đối với việc là một ngôn ngữ được xây dựng cho các nhà thống kê, tôi ngạc nhiên rằng nó không có chức năng tích hợp. Ít nhất không phải là một mà tôi có thể tìm thấy. Ngay cả chức năng mosaic::zscorekhông mang lại kết quả mong đợi. Điều này có thể là do sử dụng độ lệch chuẩn dân số thay vì độ lệch chuẩn mẫu.

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


2
Bạn có thể thay đổi <-thành a =để tiết kiệm 1 byte.
Robert S.

@ J.Doe không, tôi đã sử dụng phương pháp tôi nhận xét về giải pháp của Robert S. scalegọn gàng!
Giuseppe

2
@ J.Doe vì bạn chỉ sử dụng nmột lần, bạn có thể sử dụng trực tiếp cho 38 byte
Giuseppe

2
@RobertS. Ở đây trên PPCG, chúng tôi có xu hướng khuyến khích cho phép đầu vào và đầu ra linh hoạt, bao gồm xuất ra nhiều hơn mức cần thiết, ngoại trừ những thách thức trong đó bố cục chính xác của đầu ra là toàn bộ thách thức.
ngm

6
Tất nhiên R tích hợp sẽ không sử dụng "phương sai dân số". Chỉ những kỹ sư bối rối mới sử dụng một thứ như vậy (hencethe câu trả lời của Python và Matlab;))
ngm 14/12/18


2

Thạch , 10 byte

_ÆmµL½÷ÆḊ×

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

Nó không ngắn hơn, nhưng hàm xác định của Jelly ÆḊcũng tính toán định mức vectơ.

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

Này, thay thế tốt đẹp! Thật không may, tôi không thể thấy một cách để rút ngắn nó.
Erik the Outgolfer 14/12/18

2

Toán học, 25 byte

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

Chức năng thuần túy. Lấy danh sách các số làm đầu vào và trả về danh sách các số chính xác của máy làm đầu ra. Lưu ý rằng Standardizehàm tích hợp sử dụng phương sai mẫu theo mặc định.


2

J , 22 byte

-1 byte nhờ quẻ bò!

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

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

J , 31 23 byte

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

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

                   +/%# - 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
Sắp xếp lại nó mang lại cho 22 [:(%[:%:1#.*:%#)]-+/%# tio.run/##y/qfVmyrp2CgYKVg8D/ , tôi nghĩ rằng một trong những mũ đó có thể được gỡ bỏ, nhưng cho đến nay vẫn chưa có may mắn nào, EDIT: một chuyến đi trực tiếp nhiều hơn (-%[:%:1#.-*-%#@[)+/%#cũng ở 22
Kritixi Lithos

@ Quách quạ Cảm ơn!
Galen Ivanov


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

Cảm ơn @flawr về các đề xuất sử dụng sum(1<$x)thay vì sum[1|_<-x]và nội tuyến trung bình, @xnor để nội tuyến độ lệch chuẩn và các mức giảm khác.

Mở rộng:

-- 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
Bạn có thể thay thế [1|_<-x]bằng (1<$x)để lưu một vài byte. Đó là một mẹo hay để tránh fromIntegral, điều mà tôi chưa từng thấy cho đến nay!
flawr

Nhân tiện: Tôi thích sử dụng tryitonline , bạn có thể chạy mã của mình ở đó và sau đó sao chép mã gạt được định dạng sẵn để đăng ở đây!
flawr


Bạn có thể viết (-x+)cho (+(-x))để tránh parens. Ngoài ra, nó trông giống như fcó thể là pointfree : f=(/sum(1<$x)), và scó thể được thay thế bằng định nghĩa của nó.
xnor

@xnor Ooh, (-x+)rất tiện dụng, tôi chắc chắn rằng tôi sẽ sử dụng nó trong tương lai
Jon Purdy

2

MathGolf , 7 byte

▓-_²▓√/

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

Giải trình

Đây thực sự là một trò giải trí theo byte cho câu trả lời 05AB1E của Kevin Cruijssen, nhưng tôi lưu một số byte từ MathGolf có 1-byters cho mọi thứ cần thiết cho thử thách này. Ngoài ra, câu trả lời có vẻ khá tốt trong quan điểm của tôi!

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

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

Đã bình luận

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]

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

Không sử dụng thư viện.

Hàm trợ giúp %tính tổng các iquyền hạn của danh sách, cho phép chúng ta nhận được ba giá trị hữu ích.

  • 0%llà độ dài của l(gọi cái này n)
  • 1%llà tổng của l(gọi cái này s)
  • 2%llà tổng bình phương của l(gọi cái này m)

Chúng ta có thể biểu thị điểm z của một yếu tố y

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

(Đây là biểu thức được (y-s/n)/sqrt(v/n-(s/n)^2)đơn giản hóa một chút bằng cách nhân đỉnh và đáy với n.)

Chúng ta có thể chèn các biểu thức 0%l, 1%l, 2%lmà không cần dấu ngoặc vì %chúng tôi xác định có độ ưu tiên cao hơn toán tử số học.

(%)i=sum.map(^i)có cùng độ dài với i%l=sum.map(^i)l. Làm cho nó nhiều điểm hơn không giúp đỡ. Xác định nó như g i=...mất byte khi chúng ta gọi nó. Mặc dù %hoạt động cho bất kỳ danh sách nào nhưng chúng tôi chỉ gọi nó với danh sách đầu vào có vấn đề, không có mất byte khi gọi nó bằng đối số lmỗi lần vì cuộc gọi hai đối số i%lkhông dài hơn cuộc gọi một đối số g i.


LMộtTEX
flawr 16/12/18

tôi thực sự thích thế % ý tưởng! Nó trông giống như phiên bản rời rạc của những khoảnh khắc thống kê .
flawr

1

K (oK) , 33 23 byte

-10 byte nhờ ngn!

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

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

Lần thử đầu tiên về mã hóa (tôi không dám đặt tên là "chơi gôn") ở K. Tôi khá chắc chắn rằng nó có thể được thực hiện tốt hơn nhiều (quá nhiều tên biến ở đây ...)


1
đẹp! bạn có thể thay thế ban đầu (x-m)bằng t( tio )
ngn 16/12/18

1
khu vực nội { }là không cần thiết - tên tham số ngầm của nó là xvà nó đã được thông qua một xnhư là đối số ( tio )
NGN

1
-1 byte khác bằng cách thay thế x-+/xbằng x-/x. đối số bên trái -/đóng vai trò là giá trị ban đầu cho việc giảm ( tio )
ngn 16/12/18

@ngn Cảm ơn bạn! Bây giờ tôi thấy rằng 2 golf đầu tiên là rõ ràng; cái cuối cùng vượt quá trình độ hiện tại của tôi :)
Galen Ivanov


1

TI-Basic (sê-ri 83), 14 11 byte

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

Đưa đầu vào vào Ans. Ví dụ, nếu bạn gõ ở trên vào prgmSTANDARD, sau đó {1,2,3}:prgmSTANDARDsẽ trả về {-1.224744871,0.0,1.224744871}.

Trước đây, tôi đã thử sử dụng 1-Var Statslệnh lưu trữ độ lệch chuẩn dân số σx, nhưng sẽ ít gặp rắc rối hơn khi tính toán thủ công.


1

05AB1E , 9 byte

ÅA-DnÅAt/

Câu trả lời JavaScript của @Arnauld , vì vậy hãy đảm bảo nâng cao anh ấy!

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

mc-dJ.OQ@.Om^-Jk2Q2

Hãy thử trực tuyến tại đây .

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

Chỉnh sửa: sau khi thấy câu trả lời của Kevin , đã thay đổi sử dụng nội dung trung bình cho kết quả bên trong. Câu trả lời trước: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)

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

Liên kết là một phiên bản chức năng của mã xây dựng một mảng từ STDIN với chiều dài và sau đó là các phần tử của nó, sau đó chạy hàm Z trên đó và cuối cùng in ra các giá trị.

Xác định hàm Ztrả về một mảng.

Trên 1.dòng 4 là cần thiết để thực hiện đúng số học dấu phẩy động.



0

Than , 25 19 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

μxTôi

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

σxTôi

Chỉnh sửa: Đã lưu 6 byte nhờ chỉ @ ASCII cho a) bằng cách sử dụng SquareRoot()thay vì Power(0.5)b) sửa lỗi vectơ Divide()(nó đang thực hiện IntDivide()thay thế) c) tạo Power()vectorise.


gạch bỏ 25 = không có byte? : P (Ngoài ra, bạn chưa cập nhật liên kết TIO)
ASCII - chỉ

@ ASCII-chỉ Oops, cảm ơn!
Neil
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.