Berechnen Sie den Korrelationskoeffizienten

9

Berechnen Sie anhand einer Reihe von Zahlen für die Ereignisse X und Y den Pearson-Korrelationskoeffizienten. Die Wahrscheinlichkeit jedes Ereignisses ist gleich, sodass die erwarteten Werte berechnet werden können, indem einfach jede Reihe summiert und durch die Anzahl der Versuche dividiert wird.

Eingang

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

Ausgabe

0.769

Der kürzeste Code gewinnt. Die Eingabe kann durch stdin oder arg erfolgen. Die Ausgabe erfolgt per Standardausgabe.

Bearbeiten: Eingebaute Funktionen sollten nicht zugelassen werden (dh berechneter erwarteter Wert, Varianz, Abweichung usw.), um eine größere Vielfalt an Lösungen zu ermöglichen. Sie können jedoch eine Sprache demonstrieren, die für die Aufgabe gut geeignet ist, indem Sie integrierte Funktionen (für Ausstellungen) verwenden.

Basierend auf Davids Idee für die Eingabe für Mathematica (86 Zeichen unter Verwendung des eingebauten Mittelwerts)

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

Umgehen mit unserem eigenen Mittelwert (101 Zeichen)

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
Meilen
quelle
Sehr schöne Rationalisierung des Mathematica-Codes mit Ihrem eigenen Mittelwert!
DavidC
Der MMa-Code kann gekürzt werden. Siehe meinen Kommentar unter Davids Antwort. Auch in Ihrem Code können Sie definierenm=Total@#/Length@#&
Dr. belisarius

Antworten:

3

PHP 144 Bytes

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

Übernimmt die Eingabe von STDIN in dem im ursprünglichen Beitrag angegebenen Format. Ergebnis:

0,76909044055492

Verwenden des Vektorpunktprodukts:

wobei die Eingangsvektoren nach unten korrigiert durch und verbunden.

Perl 112 Bytes

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

0,76909044055492

Gleiche Alge, andere Sprache. In beiden Fällen wurden aus Gründen der Lesbarkeit neue Zeilen hinzugefügt, die nicht erforderlich sind. Der einzige bemerkenswerte Längenunterschied ist die erste Zeile: das Parsen der Eingabe.

primo
quelle
5

Mathematica 34 Bytes

Hier sind einige Möglichkeiten, um die Pearson-Produktmomentkorrelation zu erhalten. Sie alle führen zum gleichen Ergebnis. Von Dr. belisarius: 34 Bytes

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

Eingebaute Korrelationsfunktion I : 15 Zeichen

Dies setzt voraus, dass xund yListen sind, die jeder Variablen entsprechen.

x~Correlation~y

0,76909


Eingebaute Korrelationsfunktion II : 31 Zeichen

Dies setzt voraus, dass d eine Liste geordneter Paare ist.

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

0,76909

Die Verwendung von ;;für Alldank A Simmons.


Unter Berufung auf die Standardabweichungsfunktion : 118 115 Zeichen

Die Korrelation kann bestimmt werden durch:

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


Handgerollte Korrelation : 119 Zeichen

Vorausgesetzt xund ysind Listen ...

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
quelle
Ich erhalte 0.076909 für das letzte Code-Snippet. Auch warum haben Sie s = StandardDeviation; Wann wird s nie angewendet?
Meilen
In Anbetracht der Annahmen als Antwort für die Q-Sprache ist es in Mathematica nur x ~ Korrelation ~ y
Vitaliy Kaurov
@VitaliyKaurov, Ja, guter Punkt, jetzt berücksichtigt.
DavidC
@milest. Na sicher! StandardDeviation war "Vermächtnis" der früheren Lösungen. Denke ich reserviere sfür Sum.
DavidC
@milest Der Fehler in der endgültigen Ausgabe war auch darauf zurückzuführen, /(n-1)dass er fälschlicherweise von der früheren Lösung übernommen wurde. Jetzt korrigiert.
DavidC
2

Q.

Angenommen, eingebaute Daten sind zulässig und x, y-Daten sind separate Vektoren (7 Zeichen):

x cor y

Wenn Daten als geordnete Paare gespeichert werden, wie von David Carraher angegeben, erhalten wir (für 12 Zeichen):

{(cor).(+)x}
skeevey
quelle
Bestehen Korrelationsdaten normalerweise nicht aus geordneten Paaren?
DavidC
Ich habe eine Alternative für diesen Fall hinzugefügt
skeevey
2

MATLAB / Oktave

Nur zur Demonstration von Einbauten:

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

APL 57

Verwenden des Punktproduktansatzes:

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
quelle
2

J, 30 27 Bytes

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

Diesmal als Funktion mit zwei Argumenten. Verwendet die Vektorformel zur Berechnung.

Verwendungszweck

   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

Erläuterung

Nimmt zwei Listen a und b als separate Argumente.

([:+/*%*&(+/)&.:*:)&(-+/%#)  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
Meilen
quelle
Sie können das xund yin der letzten Zeile herausrechnen, indem Sie sie zusammennähen ,., um Ihnen zu geben((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
Gareth
Ich muss zugeben, der Code an sich sieht großartig aus ... spricht als jemand, der seinen nicht-alphanumerischen Code liebt ...;)
WallyWest
Es gibt eine kürzere 24-Byte-Version, +/ .*&(%+/&.:*:)&(-+/%#)die von Oleg in den J- Foren erkannt wird .
Meilen
1

Python 3, 140 Bytes

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)

Es werden 2 Hilfsfunktionen ( Eund Sfür den erwarteten Wert bzw. die Standardabweichung) definiert. Die Eingabe wird als 2 Iterables (Listen, Tupel usw.) erwartet. Probieren Sie es online aus .

Mego
quelle
1

Oracle SQL 11.2, 152 Bytes (zur Ausstellung)

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

Nicht Golf gespielt

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
)

Die Eingabezeichenfolge sollte dasselbe Dezimaltrennzeichen wie die Datenbank verwenden.

Jeto
quelle
1

Python 3 mit SciPy, 52 Bytes (für Ausstellung)

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

Eine anonyme Funktion, die die Eingabe der beiden Datensätze als Listen xund verwendet yund den Korrelationskoeffizienten zurückgibt.

Wie es funktioniert

Hier ist nicht viel los; SciPy verfügt über ein eingebautes Element, das sowohl den Koeffizienten als auch den p-Wert zum Testen (coefficient, p-value)der Nichtkorrelation zurückgibt. Die Funktion übergibt daher einfach die Datensätze an dieses und gibt das erste Element des vom eingebauten Tupel zurückgegebenen Tupels zurück.

Probieren Sie es auf Ideone

TheBikingViking
quelle