Tính hệ số tương quan


9

Cho một dãy số cho các sự kiện X và Y, hãy tính hệ số tương quan của Pearson. Xác suất của mỗi sự kiện là bằng nhau, do đó, các giá trị dự kiến ​​có thể được tính bằng cách đơn giản là tổng hợp từng chuỗi và chia cho số lượng thử nghiệm.

Đầu vào

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

Đầu ra

0.769

Mã ngắn nhất sẽ thắng. Đầu vào có thể bằng stdin hoặc arg. Đầu ra sẽ bằng thiết bị xuất chuẩn.

Chỉnh sửa: Không nên cho phép các hàm dựng sẵn (nghĩa là tính toán giá trị kỳ vọng, phương sai, độ lệch, v.v.) để cho phép đa dạng hơn trong các giải pháp. Tuy nhiên, hãy thoải mái thể hiện một ngôn ngữ phù hợp với nhiệm vụ sử dụng nội dung (cho triển lãm).

Dựa trên ý tưởng của David cho đầu vào cho Mathicala (86 char sử dụng hàm dựng sẵn)

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

Mặc quần áo bằng cách sử dụng ý nghĩa riêng của chúng tôi (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

Tinh giản rất tốt mã Mathicala, sử dụng ý nghĩa của riêng bạn!
DavidC

Mã MMa có thể được rút ngắn. Xem bình luận của tôi dưới câu trả lời của David. Ngoài ra, trong mã của bạn, bạn có thể xác địnhm=Total@#/Length@#&
Tiến sĩ belisarius

Câu trả lời:


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

Lấy đầu vào từ STDIN, ở định dạng được cung cấp trong bài viết gốc. Kết quả:

0,76909044055492

Sử dụng sản phẩm chấm vector:

trong đó các vectơ đầu vào được điều chỉnh xuống dưới tương ứng.

112 byte

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

0,76909044055492

Cùng một alg, ngôn ngữ khác nhau. Trong cả hai trường hợp, các dòng mới đã được thêm vào để 'dễ đọc' và không bắt buộc. Sự khác biệt đáng chú ý duy nhất về chiều dài là dòng đầu tiên: phân tích cú pháp đầu vào.


5

Toán học 34 byte

Dưới đây là một vài cách để có được mối tương quan thời điểm sản phẩm Pearson. Tất cả đều tạo ra kết quả như nhau. Từ Tiến sĩ belisarius: 34 byte

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

Tích hợp chức năng Tương quan I : 15 ký tự

Điều này giả định rằng xylà danh sách tương ứng với từng biến.

x~Correlation~y

0,76909


Tích hợp chức năng Tương quan II : 31 ký tự

Giả định này là một danh sách các cặp theo thứ tự.

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

0,76909

Việc sử dụng ;;để Allcảm ơn A Simmons.


Dựa vào chức năng Độ lệch chuẩn : 118 115 ký tự

Mối tương quan có thể được xác định bởi:

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


Tương quan cuộn tay : 119 ký tự

Giả sử xylà danh sách ...

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


Tôi nhận được 0,076909 cho đoạn mã cuối cùng. Ngoài ra tại sao bạn có s = StandardDeviation; Khi s không bao giờ được áp dụng?
dặm

Xem xét các giả định trong câu trả lời cho ngôn ngữ Q, trong
Mathicala

@VitaliyKaurov, Vâng, điểm tốt, hiện đã được tính đến.
DavidC

@milest. Tất nhiên! StandardDeviation là "di sản" từ các giải pháp trước đó. Hãy nghĩ rằng tôi sẽ dành scho Sum.
DavidC

@milest Lỗi trong đầu ra cuối cùng cũng là do /(n-1)bị mang nhầm từ giải pháp trước đó. Bây giờ sửa lại.
DavidC

2

Q

Giả sử các nội dung được cho phép và dữ liệu x, y là các vectơ riêng biệt (7 ký tự):

x cor y

Nếu dữ liệu được lưu trữ dưới dạng các cặp theo thứ tự, như được chỉ định bởi David Carraher, chúng tôi nhận được (cho 12 ký tự):

{(cor).(+)x}

Không dữ liệu tương quan thường bao gồm các cặp theo thứ tự?
DavidC

Tôi đã thêm al thay thế cho trường hợp đó
hoài nghi

2

MATLAB / Octave

Với mục đích chỉ thể hiện các phần dựng sẵn:

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

2

APL 57

Sử dụng phương pháp tiếp cận sản phẩm chấm:

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 byte

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

Lần này là một hàm lấy hai đối số. Sử dụng công thức vector để tính toán nó.

Sử dụng

   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

Giải trình

Lấy hai danh sách ab làm đối số riêng biệt.

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

Bạn có thể tìm ra xytrong dòng cuối cùng bằng cách ghép chúng lại với nhau ,.để tặng bạn((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
Gareth

Tôi phải thừa nhận, bản thân mã trông tuyệt đẹp ... nói như một người yêu thích mã không chữ và số của mình ...;)
WallyWest

Có một phiên bản ngắn hơn 24 byte +/ .*&(%+/&.:*:)&(-+/%#)được công nhận bởi Oleg trên J diễn đàn .
dặm

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 hàm trợ giúp ( ES, tương ứng với giá trị dự kiến ​​và độ lệch chuẩn) được xác định. Đầu vào được dự kiến ​​là 2 lần lặp (danh sách, bộ dữ liệu, v.v.). Hãy thử trực tuyến .


1

Oracle SQL 11.2, 152 byte (dành cho triển lãm)

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

Không chơi gôn

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
)

Chuỗi đầu vào nên sử dụng cùng một dấu tách thập phân như cơ sở dữ liệu.


1

Python 3 với SciPy, 52 byte (dành cho triển lãm)

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

Một chức năng vô danh mà mất đầu vào của hai bộ dữ liệu như danh sách xy, và trả về hệ số tương quan.

Làm thế nào nó hoạt động

Không có nhiều thứ đang diễn ra ở đây; SciPy có một nội trang trả về cả hệ số và giá trị p để kiểm tra sự không tương quan, do đó, hàm chỉ đơn giản chuyển các tập dữ liệu cho điều này và trả về phần tử đầu tiên của bộ dữ liệu được (coefficient, p-value)trả về bởi nội dung.

Hãy thử nó trên Ideone

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.