คำนวณสัมประสิทธิ์สหสัมพันธ์


9

กำหนดตัวเลขสำหรับเหตุการณ์ X และ Y ให้คำนวณสัมประสิทธิ์สหสัมพันธ์ของเพียร์สัน ความน่าจะเป็นของแต่ละเหตุการณ์มีค่าเท่ากันดังนั้นค่าที่คาดหวังสามารถคำนวณได้โดยรวมเพียงแต่ละชุดและหารด้วยจำนวนการทดลอง

อินพุต

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 หรือหาเรื่อง เอาต์พุตจะเป็นโดย stdout

แก้ไข: ไม่ควรอนุญาตให้ใช้ฟังก์ชัน Builtin (เช่นคำนวณค่าคาดหวังความแปรปรวนเบี่ยงเบน ฯลฯ ) เพื่อให้มีความหลากหลายมากขึ้นในโซลูชัน อย่างไรก็ตามอย่าลังเลที่จะสาธิตภาษาที่เหมาะกับงานที่ใช้บิวอิน (สำหรับการจัดนิทรรศการ)

ตามแนวคิดของ David สำหรับการป้อนข้อมูลใน Mathematica (86 char โดยใช้ 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

การรอบโดยใช้ค่าเฉลี่ยของเราเอง (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 สามารถตัดให้สั้นลงได้ ดูความคิดเห็นของฉันภายใต้คำตอบของเดวิด นอกจากนี้ในรหัสของคุณคุณอาจกำหนด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

การใช้ผลิตภัณฑ์เวกเตอร์ดอท:

โดยที่อินพุตเวกเตอร์ถูกปรับลดลงโดยและตามลำดับ

Perl 112 ไบต์

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

0.76909044055492

alg เดียวกันภาษาอื่น ในทั้งสองกรณีมีการเพิ่มบรรทัดใหม่สำหรับ 'ความสามารถในการอ่าน' และไม่จำเป็น ความแตกต่างที่โดดเด่นในความยาวคือบรรทัดแรก: การแยกวิเคราะห์ของอินพุต


5

Mathematica 34 ไบต์

ต่อไปนี้เป็นวิธีการรับค่าสหสัมพันธ์ของเพียร์สัน พวกเขาทั้งหมดให้ผลลัพธ์เดียวกัน จากดร. เบลิซาเรีย: 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ขอบคุณ A Simmons


การใช้ฟังก์ชัน Standard Deviation : 118 115 chars

ความสัมพันธ์สามารถกำหนดได้โดย:

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


Correlation ที่รีดด้วยมือ : 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 เมื่อใดที่ไม่เคยใช้
ไมล์

พิจารณาสมมติฐานในการตอบคำถามภาษาคิวใน Mathematica มันเป็นเพียงแค่x ~ สหสัมพันธ์ ~ y
Vitaliy Kaurov

@VitaliyKaurov ใช่แล้วข้อดีอยู่ในตอนนี้
DavidC

@milest แน่นอน! StandardDeviation คือ "ดั้งเดิม" จากโซลูชันก่อนหน้า คิดว่าฉันจะสำรองสำหรับs Sum
DavidC

@milest ข้อผิดพลาดในผลลัพธ์สุดท้ายนั้นเกิดจาก/(n-1)การดำเนินการผิดพลาดจากโซลูชันก่อนหน้านี้ แก้ไขแล้ว
DavidC

2

Q

อนุญาตให้สร้างบิวอินได้และ 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

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

คำอธิบาย

ใช้สองรายการaและbเป็นอาร์กิวเมนต์แยกต่างหาก

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

คุณสามารถปัจจัยออกxและyในบรรทัดสุดท้ายโดยเย็บเข้าด้วยกันด้วย,.เพื่อให้คุณ((m@:*/@|:-*/@m)%%:@*/@(m@:*:-*:@m))x,.y
แกเร็ ธ

ฉันต้องยอมรับรหัสในตัวเองดูงดงาม ... พูดในฐานะคนที่รักรหัสที่ไม่ใช่ตัวอักษรและตัวเลขของเขา ... ;)
WallyWest

มีที่สั้นกว่า 24 ไบต์รุ่น+/ .*&(%+/&.:*:)&(-+/%#)ได้รับการยอมรับโดย Oleg ในเจฟอรั่ม
ไมล์

1

Python 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 รายการ ( EและSสำหรับค่าที่คาดหวังและค่าเบี่ยงเบนมาตรฐานตามลำดับ) อินพุตคาดว่าเป็น 2 iterables (รายการ tuples ฯลฯ ) ลองมันออนไลน์


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

Python 3 พร้อม SciPy, 52 ไบต์ (สำหรับจัดแสดง)

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

ฟังก์ชันที่ไม่ระบุชื่อที่รับอินพุตของชุดข้อมูลสองชุดเป็นรายการxและyและส่งกลับค่าสัมประสิทธิ์สหสัมพันธ์

มันทำงานอย่างไร

มีไม่มากเกิดขึ้นที่นี่; SciPy มี builtin ที่คืนค่าสัมประสิทธิ์และค่า p สำหรับการทดสอบที่ไม่สัมพันธ์กันดังนั้นฟังก์ชันจะส่งชุดข้อมูลไปที่สิ่งนี้และส่งคืนองค์ประกอบแรกของ(coefficient, p-value)tuple ที่ส่งคืนโดย builtin

ลองใช้กับ Ideone

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.