相関係数を計算する


9

イベントXとYの一連の数値を指定して、ピアソンの相関係数を計算します。各イベントの確率は等しいため、期待値は、各シリーズを合計し、試行回数で割ることによって計算できます。

入力

1   6.86
2   5.92
3   6.08
4   8.34
5   8.7
6   8.16
7   8.22
8   7.68
9   12.04
10  8.6
11  10.96

出力

0.769

最短のコードが勝ちます。入力はstdinまたはargを使用できます。出力は標準出力になります。

編集:ソリューションの多様性を高めるために、組み込み関数(つまり、計算された期待値、分散、偏差など)を許可しないでください。ただし、ビルトインを使用するタスク(展示用)に適した言語を自由にデモンストレーションしてください。

Mathematicaへの入力に関するDavidのアイデアに基づいています(組み込みの平均値を使用した86文字)

m=Mean;x=d[[All,1]];y=d[[All,2]];(m@(x*y)-m@x*m@y)/Sqrt[(m@(x^2)-m@x^2)(m@(y^2)-m@y^2)]

m = Mean;
x = d[[All,1]];
y = d[[All,2]];
(m@(x*y) - m@x*m@y)/((m@(x^2) - m@x^2)(m@(y^2) - m@y^2))^.5

自分の平均値(101文字)を使用した幅木

m=Total[#]/Length[#]&;x=d[[All,1]];y=d[[All,2]];(m@(x*y)-m@x*m@y)/((m@(x^2)-m@x^2)(m@(y^2)-m@y^2))^.5

m = Total[#]/Length[#]&;
x = d[[All,1]];
y = d[[All,2]];
(m@(x*y)-m@x*m@y)/((m@(x^2)-m@x^2)(m@(y^2)-m@y^2))^.5

Mathematicaコードの非常に優れた合理化、独自の手段を使用して!
DavidC、2012年

MMaコードは短縮できます。Davidの回答の下にある私のコメントを参照してください。また、コードで次のように定義できますm=Total@#/Length@#&
Dr. belisarius

回答:


3

PHP 144バイト

<?
for(;fscanf(STDIN,'%f%f',$$n,${-$n});$f+=${-$n++})$e+=$$n;
for(;$$i;$z+=$$i*$a=${-$i++}-=$f/$n,$y+=$a*$a)$x+=$$i*$$i-=$e/$n;
echo$z/sqrt($x*$y);

元の投稿で提供された形式で、STDINから入力を受け取ります。結果:

0.76909044055492

ベクトル内積の使用:

ここでは入力ベクトルであることにより、下方調節それぞれ。

Perl 112バイト

/ /,$e+=$`,$f+=$',@v=($',@v)for@u=<>;
$x+=($_-=$e/$.)*$_,$y+=($;=$f/$.-pop@v)*$;,$z-=$_*$;for@u;
print$z/sqrt$x*$y

0.76909044055492

同じalg、別の言語。どちらの場合も、「読みやすさ」のために新しい行が追加されており、必須ではありません。長さの唯一の注目すべき違いは、最初の行、つまり入力の解析です。


5

Mathematica 34バイト

ピアソンの積率相関を取得するいくつかの方法を次に示します。それらはすべて同じ結果を生成します。belisarius博士から:34バイト

Dot@@Normalize/@(#-Mean@#&)/@{x,y}

組み込み相関関数I:15文字

これは、xおよびyが各変数に対応するリストであることを前提としています。

x~Correlation~y

0.76909


組み込み相関関数II:31文字

これは、dが順序付けられたペアのリストであると想定しています。

d[[;;,1]]~Correlation~d[[;;,2]]

0.76909

使用;;のためのAllAシモンズのおかげ。


標準偏差関数に依存118 115文字

相関関係は次の方法で決定できます。

s=StandardDeviation;
m=Mean;
n=Length@d;
x=d[[;;,1]];
y=d[[;;,2]];
Sum[((x[[i]]-m@x)/s@x)((y[[i]]-m@y)/s@y),{i,n}]/(n-1)

0.76909


手巻き相関:119文字

と仮定xy、リストです...

s=Sum;n=Length@d;m@p_:=Tr@p/n;
(s[(x[[i]]-m@x)(y[[i]]-m@y),{i,n}]/Sqrt@(s[(x[[i]]-m@x)^2,{i,n}] s[(y[[i]] - m@y)^2,{i,n}]))

0.76909


最後のコードスニペットの0.076909を取得します。また、なぜs = StandardDeviationがあるのですか。sが適用されない場合
マイル

Q-言語のための答えで考慮すると仮定、MathematicaでそれだけであるX〜相関〜Y
Vitaliy Kaurov

@VitaliyKaurov、はい、良い点です。
DavidC、

@milest。もちろん!StandardDeviationは、以前のソリューションの「レガシー」でした。私が予約sするつもりだと思いますSum
DavidC、

@milest最終出力のエラーは/(n-1)、以前のソリューションから誤って持ち越されたことが原因でした。今修正されました。
DavidC、

2

Q

組み込みが許可され、x、yデータが別々のベクトル(7文字)であると仮定します。

x cor y

David Carraherが示すように、データが順序付けられたペアとして保存されている場合、次の結果が得られます(12文字分)。

{(cor).(+)x}

通常、相関データは順序付けられたペアで構成されていませんか?
DavidC、2012年

その場合の代替案を追加しました
skeevey

2

MATLAB /オクターブ

組み込みのみを示す目的のため:

octave:1> corr(X,Y)
ans =  0.76909
octave:2> 

2

APL 57

ドット積アプローチを使用する:

a←1 2 3 4 5 6 7 8 9 10 11

b←6.86 5.92 6.08 8.34 8.7 8.16 8.22 7.68 12.04 8.6 10.96

(a+.×b)÷((+/(a←a-(+/a)÷⍴a)*2)*.5)×(+/(b←b-(+/b)÷⍴b)*2)*.5

0.7690904406         

2

J、30 27バイト

([:+/*%*&(+/)&.:*:)&(-+/%#)

今回は2つの引数を取る関数として。計算にベクトル式を使用します。

使用法

   f =: ([:+/*%*&(+/)&.:*:)&(-+/%#)
   (1 2 3 4 5 6 7 8 9 10 11) f (6.86 5.92 6.08 8.34 8.7 8.16 8.22 7.68 12.04 8.6 10.96)
0.76909

説明

2つのリストabを別々の引数として受け取ります。

([:+/*%*&(+/)&.:*:)&(-+/%#)  Input: a on LHS, b on RHS
                   &(     )  For a and b
                         #     Get the count
                      +/       Reduce using addition to get the sum
                        %      Divide the sum by the count to get the average
                     -         Subtract the initial value from the average
                             Now a and b have both been shifted by their average
                             For both a and b
                *:             Square each value
         (+/)&.:               Reduce the values using addition to get the sum
                               Apply in the inverse of squaring to take the square root
                               of the sum to get the norm
       *&                    Multiply norm(a) by norm(b)
     *                       Multiply a and b elementwise
      %                      Divide a*b by norm(a)*norm(b) elementwise
 [:+/                        Reduce using addition to the sum which is the
                             correlation coefficient and return it

あなたは出て考慮することができますxし、yそれらを一緒に縫い合わせることによって、最終ラインで,.あなたを与えるために((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
ガレス・

私は認めなければなりません、コード自体はゴージャスに見えます...彼の非英数字コードを愛する誰かとして話す...;)
WallyWest

+/ .*&(%+/&.:*:)&(-+/%#)J フォーラムで Olegによって認識されたより短い24バイトのバージョンがあります
マイル

1

Python 3、140バイト

E=lambda x:sum(x)/len(x)
S=lambda x:(sum((E(x)-X)**2for X in x)/len(x))**.5
lambda x,y:E([(X-E(x))*(Y-E(y))for X,Y in zip(x,y)])/S(x)/S(y)

2ヘルパー関数(E及びS期待値と標準偏差は、それぞれ)が定義されています。入力は2つのイテラブル(リスト、タプルなど)として期待されます。オンラインでお試しください


1

Oracle SQL 11.2、152バイト(展示用)

SELECT CORR(a,b)FROM(SELECT REGEXP_SUBSTR(:1,'[^ ]+',1,2*LEVEL-1)a,REGEXP_SUBSTR(:1,'[^ ]+',1,2*LEVEL)b FROM DUAL CONNECT BY INSTR(:1,' ',2,LEVEL-1)>0);

ゴルフなし

SELECT CORR(a,b)
FROM
(
  SELECT REGEXP_SUBSTR(:1, '[^ ]+', 1, 2*LEVEL-1)a, REGEXP_SUBSTR(:1, '[^ ]+', 1, 2*LEVEL)b
  FROM DUAL
  CONNECT BY INSTR(:1, ' ', 2, LEVEL - 1) > 0
)

入力文字列には、データベースと同じ小数点を使用する必要があります。


1

SciPyを使用したPython 3、52バイト(展示用)

from scipy.stats import*
lambda x,y:pearsonr(x,y)[0]

2つのデータセットの入力をリストxおよびとして受け取りy、相関係数を返す無名関数。

使い方

ここでは何も起こりません。SciPyには、非相関をテストするための係数とp値の両方を返す組み込み関数があるので、関数はデータセットをこれに渡し(coefficient, p-value)、組み込み関数によって返されたタプルの最初の要素を返します。

イデオーネでお試しください

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