상관 계수 계산


9

이벤트 X 및 Y에 대해 일련의 숫자가 주어지면 Pearson의 상관 계수를 계산하십시오. 각 사건의 확률은 동일하므로 각 계열을 간단히 합산하고 시행 횟수로 나누어 예상 값을 계산할 수 있습니다.

입력

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로 입력 할 수 있습니다. 출력은 stdout에 의해 이루어집니다.

편집 : 솔루션의 다양성을 높이기 위해 기본 제공 함수 (예 : 계산 된 예상 값, 분산, 편차 등)를 허용해서는 안됩니다. 그러나 전시를 위해 내장을 사용하는 작업에 적합한 언어를 자유롭게 보여주십시오.

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

MMa 코드를 줄일 수 있습니다. David의 답변 아래에있는 내 의견을 참조하십시오. 또한, 코드에서 당신은 정의 할 수 있습니다m=Total@#/Length@#&
박사를 벨리 사리우스

답변:


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

벡터 내적 사용 :

여기서,는 입력 벡터이다 으로 하향 조정 하고 , 각각.

펄 112 바이트

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

0.76909044055492

같은 언어, 다른 언어. 두 경우 모두 '가독성'을 위해 새 줄이 추가되었으며 필요하지 않습니다. 길이에서 유일하게 눈에 띄는 차이는 첫 번째 줄입니다. 입력 파싱입니다.


5

Mathematica 34 바이트

다음은 Pearson 곱 모멘트 상관 관계를 얻는 몇 가지 방법입니다. 그들은 모두 같은 결과를 낳습니다. 벨리 사리우스 박사 : 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

의 사용 ;;에 대한 All시몬스에 감사합니다.


표준 편차 함수에 의존 : 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 자

가정 x하고 y목록입니다 ...

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-언어에 대한 대답 가정을 고려할 때, 매스 매 티카에서 단지입니다 X ~ 상관 관계 ~ Y
비탈리 Kaurov

@VitaliyKaurov, 예, 좋은 점이 이제 고려되었습니다.
DavidC

@milest. 물론이야! StandardDeviation은 이전 솔루션의 "레거시"였습니다. 내가 예약 될까요 s위해 Sum.
DavidC

@milest 최종 출력의 오류 /(n-1)는 이전 솔루션에서 실수로 전달 되었기 때문에 발생했습니다 . 이제 수정되었습니다.
DavidC

2

내장이 허용되고 x, y 데이터가 별도의 벡터 (7 자)라고 가정합니다.

x cor y

David Carraher가 표시 한대로 데이터가 순서 쌍으로 저장되면 다음과 같은 문자를 얻습니다 (12 자).

{(cor).(+)x}

상관 관계 데이터는 일반적으로 순서 쌍으로 구성되지 않습니까?
DavidC

나는 그 사건에 대한 알 대안 추가
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 바이트

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

이번에는 두 가지 인수를 취하는 함수로 사용합니다. 벡터 수식을 사용하여 계산합니다.

용법

   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

설명

두 개의 목록 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

당신은을 인수 분해 할 수 xy함께 그들을 바느질에 의해 마지막 줄에 ,.당신에게주고((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
가레스

인정해야합니다. 코드 자체가 화려 해 보입니다 ... 영숫자가 아닌 코드를 좋아하는 사람으로서 말하기 ...;)
WallyWest

+/ .*&(%+/&.:*:)&(-+/%#)J 포럼 에서 Oleg가 인식 하는 짧은 24 바이트 버전이 있습니다 .
마일

1

파이썬 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 헬퍼 기능 ( ES기대 값과 표준 편차는 각각) 정의된다. 입력은 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]

두 개의 데이터 세트를 목록 x및 로 입력 y하고 상관 계수를 리턴 하는 익명 함수입니다 .

작동 원리

여기에는 많은 일이 없습니다. SciPy에는 비상 관성을 테스트하기 위해 계수와 p- 값을 모두 리턴하는 내장 기능이 있으므로이 함수는 단순히 데이터 세트를 여기에 전달 (coefficient, p-value)하고 내장에서 리턴 한 튜플 의 첫 번째 요소를 리턴합니다.

Ideone에서 사용해보십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.