サンプルの標準化(zスコアの計算)


14

浮動小数点数のリストが与えられたらそれを標準化します。

詳細

  • リストx1,x2,,xnれる標準場合の平均すべての値が0であり、標準偏差はこれを計算する1つの方法は、第1の平均を計算することによってであるμと標準偏差σとして
    μ=1ni=1nxiσ=1ni=1n(xiμ)2,
    及びその後すべて置き換えることにより標準化を計算するxi用いてxiμσ
  • 入力に少なくとも2つの異なるエントリが含まれると仮定できます(これは、σ0を意味します)。
  • 一部の実装ではサンプル標準偏差を使用しますが、これはここで使用しているσ標準偏差σとは異なります。
  • すべての些細な解決策にCWの答えがあります

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

(これらの例はこのスクリプトで生成されています。)

回答:






4

APL + WIN、41,32 30バイト

Erikのおかげで9バイト節約、さらにngnのおかげで2バイト節約

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

数値ベクトルの入力を求め、入力ベクトルの平均標準偏差と標準化要素を計算します


割り当ててx←v-(+/v)÷⍴v←⎕からできませんx÷((+/x*2)÷⍴v)*.5か?
エリックアウトゴルファー

確かにできます。ありがとう。
グラハム

apl + winはシングルトン拡張(1 2 3+,4←→ 1 2 3+4)を行いますか?そうならば、あなたは書き換えることができ(+/x*2)÷⍴v+/x×x÷⍴v
NGN

@ngnさらに2バイトで機能します。ありがとう。
グラハム

3

R + pryr、53 52バイト

@Robert S.のソリューションで見られるsum(x|1)ような代わりに-1バイトを使用length(x)

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

統計学者向けに構築された言語であるため、これに組み込み関数がないことに驚いています。少なくとも私が見つけることができるものはありません。関数でさえ、mosaic::zscore期待される結果を生み出しません。これは、サンプルの標準偏差の代わりに母集団の標準偏差を使用しているためと思われます。

オンラインでお試しください!


2
をに変更し<-=1バイト節約できます。
ロバートS.

@ J.Doeいや、私はRobert S.のソリューションについてコメントした方法を使った。scaleきちんとしたです!
ジュゼッペ

2
J.Doe @あなただけ使用するので、nあなたがそれを直接使用することができたら、38バイト
ジュゼッペ

2
@RobertS。ここでPPCGでは、出力の正確なレイアウトが課題のすべてのポイントである課題を除き、必要以上の出力を含む柔軟な入出力を可能にすることを推奨する傾向があります。
ngm

6
もちろん、Rビルトインは「人口分散」を使用しません。混乱しているエンジニアのみがそのようなものを使用します(したがって、PythonとMatlabの回答;))
ngm



2

Mathematica、25バイト

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

純粋な機能。入力として数値のリストを受け取り、出力として機械精度の数値のリストを返します。組み込みStandardize関数はデフォルトでサンプル分散を使用することに注意してください。


2

J、22バイト

Cows quackのおかげで-1バイト!

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

オンラインでお試しください!

J31 23バイト

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

オンラインでお試しください!

                   +/%# - 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
[:(%[:%:1#.*:%#)]-+/%# 22tio.run/##y/qfVmyrp2CgYKVg8D/…を再配置すると、これらのキャップの1つを削除できると思いますが、これまで運がなかった、編集:より直接的なバイトシェービング(-%[:%:1#.-*-%#@[)+/%#も22
Kritixi Lithos

@Cows quackありがとう!
ガレンイワノフ


2

Haskell、80 75 68バイト

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

平均値のsum(1<$x)代わりに使用sum[1|_<-x]してインライン化する提案をしてくれた@flawrに感謝します。標準偏差や他の縮約をインライン化してくれた@xnorに感謝します。

拡張:

-- 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
に置き換え[1|_<-x](1<$x)、数バイトを節約できます。これは、fromIntegralこれまで見たことのないを回避するための素晴らしいトリックです!
flawr

ちなみに、私はtryitonlineを使用するのが好きで、そこでコードを実行してから、事前にフォーマットされたaswerをコピーしてここに投稿できます!
flawr


あなたは書くことができます(-x+)のために(+(-x))回避する括弧へ。また、fpointfree:のように見え、定義で置き換えることができます。f=(/sum(1<$x))s
xnor

@xnorああ、(-x+)便利です、私は必ず私が将来的にあることを使うことになるんだ
ジョン・パーディ

2

MathGolf、7バイト

▓-_²▓√/

オンラインでお試しください!

説明

これは文字通りKevin Cruijssenの05AB1Eの回答をバイト単位で再現したものですが、このチャレンジに必要なすべてのバイトを1バイト持つMathGolfからいくつかのバイトを節約します。また、答えは私の意見では非常によく見えます!

▓         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バイト

a=>a.map(x=>(x-g(a))/g(a.map(x=>(x-m)**2))**.5,g=a=>m=eval(a.join`+`)/a.length)

オンラインでお試しください!

コメント済み

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バイト

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

オンラインでお試しください!

ライブラリを使用しません。

ヘルパー関数はリストのべき乗の%合計を計算し、i3つの有用な値を取得できます。

  • 0%lの長さですl(これを呼び出しますn
  • 1%lの合計ですl(これを呼び出しますs
  • 2%lの平方和ですl(これを呼び出しますm

我々は、素子のZスコアを発現することができるyように

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

(これは、(y-s/n)/sqrt(v/n-(s/n)^2)上部と下部にを掛けることにより、少し簡略化された式nです。)

私たちは、式を挿入することができ0%l1%l2%lなぜなら括弧なし%、我々は定義が算術演算子よりも優先順位が高いです。

(%)i=sum.map(^i)はと同じ長さi%l=sum.map(^i)lです。それをよりポイントフリーにすることは役に立ちません。定義すると、g i=...呼び出すときにバイトが失われます。が%任意のリストのための作品が、我々は唯一の問題の入力リストでそれを呼び出し、引数でそれを呼び出すには何バイトの損失はありませんl2引数呼び出しがあるため毎回i%l、もはや一引数よりもありますg i


我々が持っています LATEバツここ:)
flawr

私はこの%アイデアが本当に好きです!統計モーメントの離散バージョンのように見えます
flawr

1

K(oK)33 23バイト

ngnのおかげで-10バイト!

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

オンラインでお試しください!

Kでのコーディングの最初の試み(あえて「ゴルフ」と名付けないでください)。私はそれがもっとうまくできると確信しています(変数名が多すぎる...)


1
いいね!あなたは、最初に取って代わることができ(x-m)t
NGN

1
インナーは{ }不要です-その暗黙のパラメータ名がありx、それが渡されたx引数(と
NGN

1
置換することにより、別の-1バイトx-+/xx-/x。の左引数-/は、リダクションの初期値として機能します(tio
ngn

@ngnありがとう!今、最初の2つのゴルフは明らかです。最後のものは私の現在のレベルを超えています:)
ガレンイワノフ


1

TI-Basic(83シリーズ)、14 11バイト

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

入力を受け取りますAns。たとえば、に上記を入力するprgmSTANDARDと、{1,2,3}:prgmSTANDARDが返され{-1.224744871,0.0,1.224744871}ます。

以前、1-Var Stats母標準偏差をに保存するコマンドを使用してみましたがσx、手動で計算する方が簡単です。


1

05AB1E、9 バイト

ÅA-DnÅAt/

のポート @ArnauldのJavaScriptの回答のので、必ず彼してください!

オンラインで試すたり、すべてのテストケースを確認してください

説明:

Å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バイト

mc-dJ.OQ@.Om^-Jk2Q2

こちらからオンラインでお試しください。

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

編集:ケビンの答えを見た後、内部結果に平均ビルトインを使用するように変更。前の答え:mc-dJ.OQ@csm^-Jk2QlQ2


0

SNOBOL4(CSNOBOL4)、229バイト

	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)

オンラインでお試しください!

リンクは、その長さと要素を指定してSTDINから配列を構築し、そのZ上で関数を実行し、最終的に値を出力するコードの機能バージョンへのものです。

関数を定義します Z配列を返すを。

1.4行目は、適切に浮動小数点演算を実行する必要があります。



0

25 19バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

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

計算する μ そして、それぞれからベクトル化された減算 バツ

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

計算する σ、ベクトル化された各除算 バツ それによって、結果を出力します。

編集:a)a)のSquareRoot()代わりにPower(0.5)b)ベクトル化を修正Divide()IntDivide()代わりに行っていた)c)Power()ベクトル化を行うための@ASCII のみのおかげで6バイトを保存しました。


取り消し線25 =バイトなし?:P(また、TIOリンクをまだ更新していない)
ASCIIのみ

@ASCIIのみ
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.