Обчисліть коефіцієнт кореляції


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 або arg. Вихід буде за допомогою stdout.

Редагувати: вбудовані функції не повинні бути дозволені (тобто розраховане очікуване значення, дисперсія, відхилення тощо), щоб забезпечити більше різноманітності в рішеннях. Однак сміливо демонструйте мову, яка добре підходить для виконання завдання, використовуючи вбудовані (для виставки).

На основі ідеї Девіда про введення для Mathematica (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 можна скоротити. Дивіться мій коментар під відповіддю Девіда. Також у своєму коді ви можете визначитиm=Total@#/Length@#&
доктор belisarius

Відповіді:


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

Те саме водорості, різною мовою. В обох випадках були додані нові рядки для 'читабельності', і вони не потрібні. Єдина помітна різниця в довжині - перший рядок: розбір вхідних даних.


5

Mathematica 34 байти

Ось кілька способів отримати відповідність моменту продукту Pearson. Всі вони дають однаковий результат. Від доктора belisarius: 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-мову, в Mathematica це просто x ~ Кореляція ~ y
Віталій Кауров

@VitaliyKaurov, Так, хороший момент, зараз враховано.
DavidC

@milest. Звичайно! StandardDeviation був "спадщиною" від попередніх рішень. Думаю , що я буду Ми залишаємо sза Sum.
DavidC

@milest Помилка в кінцевому виході також була пов'язана з /(n-1)помилковим перенесенням з попереднього рішення. Тепер виправлено.
DavidC

2

Q

Припустимо, що вбудовані дозволені і x, y дані - це окремі вектори (7 символів):

x cor y

Якщо дані зберігаються як упорядковані пари, як вказує Девід Каррахер, ми отримуємо (для 12 символів):

{(cor).(+)x}

Чи кореляційні дані зазвичай не складаються з упорядкованих пар?
DavidC

Я додав альтернативу для цього випадку
skeevey

2

МАТЛАБ / Октава

Для демонстрації лише вбудованих модулів:

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

Пояснення

Окремі аргументи бере два списки 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
Гарет


Існує версія коротше 24 байт +/ .*&(%+/&.:*:)&(-+/%#)визнається Олег на J форумах .
миль

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 допоміжні функції ( Eі Sдля очікуваного значення та стандартного відхилення відповідно). Вхід очікується як 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

Python 3 з SciPy, 52 байти (для виставки)

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

Анонімна функція , яка приймає дані з двох наборів даних в вигляді списків xі y, і повертає коефіцієнт кореляції.

Як це працює

Тут багато чого не відбувається; SciPy має вбудований, який повертає і коефіцієнт, і значення p для тестування некореляції, тому функція просто передає набір даних до цього і повертає перший елемент (coefficient, p-value)кортежу, повернутий вбудованим.

Спробуйте це на Ideone

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.