Hitung koefisien korelasi

9

Diberikan serangkaian angka untuk peristiwa X dan Y, hitung koefisien korelasi Pearson. Probabilitas masing-masing peristiwa adalah sama, sehingga nilai yang diharapkan dapat dihitung dengan hanya menjumlahkan setiap seri dan membaginya dengan jumlah percobaan.

Memasukkan

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

Keluaran

0.769

Kode terpendek menang. Input bisa dengan stdin atau arg. Output akan dengan stdout.

Sunting: Fungsi bawaan tidak boleh diizinkan (yaitu nilai yang diharapkan yang dihitung, varians, penyimpangan, dll) untuk memungkinkan lebih banyak keragaman dalam solusi. Namun, jangan ragu untuk menunjukkan bahasa yang cocok untuk tugas menggunakan builtin (untuk pameran).

Berdasarkan ide David untuk input untuk Mathematica (86 char menggunakan builtin mean)

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

Menyusuri dengan menggunakan mean kami sendiri (101 char)

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
mil
sumber
Perampingan kode Mathematica yang sangat bagus, menggunakan mean Anda sendiri!
DavidC
Kode MMa dapat disingkat. Lihat komentar saya di bawah jawaban David. Juga, dalam kode Anda, Anda dapat mendefinisikanm=Total@#/Length@#&
Dr. belisarius

Jawaban:

3

PHP 144 byte

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

Mengambil input dari STDIN, dalam format yang disediakan di pos asli. Hasil:

0.76909044055492

Menggunakan produk titik vektor:

di mana vektor input disesuaikan ke bawah oleh dan masing - masing.

Perl 112 byte

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

0.76909044055492

Alg yang sama, bahasa yang berbeda. Dalam kedua kasus, baris baru telah ditambahkan untuk 'keterbacaan', dan tidak diperlukan. Satu-satunya perbedaan panjang yang mencolok adalah baris pertama: penguraian input.

primo
sumber
5

Mathematica 34 byte

Berikut adalah beberapa cara untuk mendapatkan korelasi momen produk Pearson. Mereka semua menghasilkan hasil yang sama. Dari Dr. belisarius: 34 byte

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

Fungsi Korelasi bawaan I : 15 karakter

Ini mengasumsikan bahwa xdan ydaftar sesuai dengan masing-masing variabel.

x~Correlation~y

0,76909


Fungsi Korelasi bawaan II : 31 karakter

Ini mengasumsikan d adalah daftar pasangan yang dipesan.

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

0,76909

Penggunaan ;;untuk Allterima kasih kepada A Simmons.


Mengandalkan fungsi Deviasi Standar : 118 115 karakter

Korelasi dapat ditentukan oleh:

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


Korelasi linting tangan : 119 karakter

Dengan asumsi xdan ydaftar ...

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

DavidC
sumber
Saya mendapatkan 0,076909 untuk cuplikan kode terakhir. Juga mengapa Anda memiliki s = StandardDeviation; kapan s tidak pernah diterapkan?
mil
Mempertimbangkan asumsi dalam jawaban untuk bahasa-Q, dalam Mathematica itu hanya x ~ Korelasi ~ y
Vitaliy Kaurov
@VitaliyKaurov, Ya, poin bagus, sekarang diperhitungkan.
DavidC
@terlalu. Tentu saja! StandardDeviation adalah "warisan" dari solusi sebelumnya. Pikir saya akan cadangan suntuk Sum.
DavidC
@milest Kesalahan dalam output akhir juga karena /(n-1)keliru terbawa dari solusi sebelumnya. Sekarang dikoreksi.
DavidC
2

Q

Dengan asumsi builtin diizinkan dan data x, y adalah vektor yang terpisah (7 karakter):

x cor y

Jika data disimpan sebagai pasangan pesanan, seperti yang ditunjukkan oleh David Carraher, kami mendapatkan (untuk 12 karakter):

{(cor).(+)x}
skeevey
sumber
Bukankah data korelasi biasanya terdiri dari pasangan yang dipesan?
DavidC
Saya menambahkan al alternatif untuk kasus itu
skeevey
2

MATLAB / Oktaf

Untuk tujuan mendemonstrasikan built-in saja:

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

APL 57

Menggunakan pendekatan produk titik:

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         
Graham
sumber
2

J, 30 27 byte

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

Kali ini sebagai fungsi mengambil dua argumen. Menggunakan rumus vektor untuk menghitungnya.

Pemakaian

   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

Penjelasan

Membawa dua daftar a dan b sebagai argumen terpisah.

([:+/*%*&(+/)&.:*:)&(-+/%#)  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
mil
sumber
Anda dapat memfaktorkan xdan ydi baris terakhir dengan menjahitnya bersama ,.untuk memberi Anda((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
Gareth
Saya harus akui, kode itu sendiri terlihat cantik ... berbicara sebagai seseorang yang menyukai kode non-alfanumeriknya ...;)
WallyWest
Ada lebih pendek 24 byte versi +/ .*&(%+/&.:*:)&(-+/%#)diakui oleh Oleg pada J forum .
mil
1

Python 3, 140 byte

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 fungsi pembantu ( Edan S, untuk nilai yang diharapkan dan standar deviasi, masing-masing) didefinisikan. Input diharapkan sebagai 2 iterables (daftar, tupel, dll). Cobalah online .

Mego
sumber
1

Oracle SQL 11.2, 152 byte (untuk pameran)

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

Tidak bermain golf

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
)

String input harus menggunakan pemisah desimal yang sama dengan database.

Jeto
sumber
1

Python 3 dengan SciPy, 52 byte (untuk pameran)

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

Fungsi anonim yang mengambil input dari dua set data sebagai daftar xdan y, dan mengembalikan koefisien korelasi.

Bagaimana itu bekerja

Tidak banyak yang terjadi di sini; SciPy memiliki builtin yang mengembalikan baik koefisien dan nilai-p untuk pengujian non-korelasi, sehingga fungsi hanya meneruskan set data ke ini dan mengembalikan elemen pertama dari (coefficient, p-value)tuple yang dikembalikan oleh builtin.

Cobalah di Ideone

TheBikingViking
sumber