Korelasyon katsayısını hesaplayın


9

X ve Y olayları için bir dizi sayı verildiğinde Pearson'un korelasyon katsayısını hesaplayın. Her olayın olasılığı eşittir, bu nedenle beklenen değerler her bir seriyi toplayarak ve deneme sayısına bölerek hesaplanabilir.

Giriş

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

Çıktı

0.769

En kısa kod kazanır. Giriş stdin veya arg tarafından yapılabilir. Çıktı stdout tarafından yapılacaktır.

Düzenleme: Çözümlerde daha fazla çeşitlilik sağlamak için yerleşik işlevlere izin verilmemelidir (yani hesaplanan beklenen değer, sapma, sapma, vb.). Bununla birlikte, builtins (sergi için) kullanarak görev için çok uygun bir dil göstermekten çekinmeyin.

David'in Mathematica için girdi fikrine dayanır (yerleşik ortalama kullanan 86 karakter)

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

Kendi ortalamamızı kullanarak süpürgelik (101 karakter)

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 kodunu çok güzel bir şekilde düzene sokmak, kendi ortalamasını kullanmak!
DavidC

MMa kodu kısaltılabilir. Yorumuma David'in cevabı altında bakın. Ayrıca, kodunuzda tanımlayabilirsinizm=Total@#/Length@#&
Dr. belisarius

Yanıtlar:


3

PHP 144 bayt

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

Girişi, STDIN'den, orijinal gönderide sağlanan biçimde alır. Sonuç:

,76909044055492

Vektör nokta ürününü kullanarak:

burada giriş vektörleri tarafından aşağıya doğru ayarlanmıştır ve sırasıyla.

Perl 112 bayt

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

,76909044055492

Aynı alg, farklı dil. Her iki durumda da, 'okunabilirlik' için yeni satırlar eklenmiştir ve gerekli değildir. Uzunluktaki tek önemli fark ilk satırdır: girişin ayrıştırılması.


5

Mathematica 34 bayt

İşte Pearson ürün moment korelasyonunu elde etmenin birkaç yolu. Hepsi aynı sonucu verir. Dr.Belisarius'tan: 34 bayt

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

Dahili Korelasyon fonksiyonu I : 15 karakter

Bu , her değişkene karşılık gelen listeler olduğunu xve ylisteler olduğunu varsayar .

x~Correlation~y

0,76909


Dahili Korelasyon fonksiyonu II : 31 karakter

Bu, d'nin sıralı çiftlerin bir listesi olduğunu varsayar.

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

0,76909

Kullanımı ;;için Allbir Simmons sayesinde.


Standart Sapma fonksiyonuna dayanarak : 118 115 karakter

Korelasyon şu şekilde belirlenebilir:

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


Elle haddelenmiş Korelasyon : 119 karakter

Varsayım xve ylisteler ...

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


Son kod snippet'i için 0.076909 alıyorum. Ayrıca neden s = StandardDeviation; ne zaman uygulanır?
mil

Q-diline cevap olarak varsayımlar göz önüne alındığında, Mathematica'da sadece x ~ Korelasyon ~ y
Vitaliy Kaurov

@VitaliyKaurov, Evet, iyi bir nokta, şimdi dikkate alındı.
DavidC

@milest. Elbette! StandardDeviation önceki çözümlerden "miras" idi. Ben rezerv edeceğiz düşünün siçin Sum.
DavidC

@milest Son çıktıdaki hatanın /(n-1), daha önceki çözümden yanlışlıkla aktarılmasından kaynaklanıyordu . Şimdi düzeltildi.
DavidC

2

S

Yerleşiklere izin verildiğini ve x, y verilerinin ayrı vektörler olduğunu varsayarsak (7 karakter):

x cor y

Veriler, David Carraher tarafından belirtildiği gibi sıralı çiftler olarak depolanırsa (12 karakter için):

{(cor).(+)x}

Korelasyon verileri normalde sıralı çiftlerden oluşmuyor mu?
DavidC

Bu dava için al alternatif ekledim
skeevey

2

MATLAB / Octave

Yalnızca yerleşikleri göstermek amacıyla:

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

2

APL 57

Nokta ürün yaklaşımını kullanarak:

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 bayt

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

Bu kez iki argüman alan bir işlev olarak. Hesaplamak için vektör formülünü kullanır.

kullanım

   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

açıklama

İki bağımsız a ve b listesini bağımsız değişken olarak alır.

([:+/*%*&(+/)&.:*:)&(-+/%#)  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

Dışarı faktör olabilir xve ybirlikte bunları dikilmesiyle son satırında ,.sana vermek için((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
Gareth

İtiraf etmeliyim ki, kodun kendisi muhteşem görünüyor ... alfasayısal olmayan kodunu seven biri olarak konuşma ...;)
WallyWest

+/ .*&(%+/&.:*:)&(-+/%#)J forumlarında Oleg tarafından tanınan daha kısa 24 baytlık bir sürüm var .
mil

1

Python 3, 140 bayt

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 yardımcı fonksiyon ( Eve Ssırasıyla beklenen değer ve standart sapma için) tanımlanmıştır. Girdinin 2 yinelenebilir (listeler, tuples, vb.) Olması bekleniyor. Çevrimiçi deneyin .


1

Oracle SQL 11.2, 152 bayt (sergi için)

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

Un-golfed

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
)

Giriş dizesi, veritabanı ile aynı ondalık ayırıcıyı kullanmalıdır.


1

SciPy ile Python 3, 52 bayt (sergi için)

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

İki veri kümesinin girişini liste xvey korelasyon katsayısını döndüren .

Nasıl çalışır

Burada pek bir şey yok; SciPy, korelasyonsuzluğu test etmek için hem katsayıyı hem de p-değerini döndüren bir yerleşime sahiptir, bu nedenle işlev sadece veri kümelerini buna geçirir (coefficient, p-value)ve yerleşik tarafından döndürülen grubun ilk öğesini döndürür .

Ideone üzerinde deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.