Программирование на языке Ruby.

5.27. Вычисление коэффициента корреляции.

Коэффициент корреляции — одна из самых простых и полезных статистических мер. Он измеряет «линейность» набора, состоящего из пар (x, у), и изменяется от -1.0 (полная отрицательная корреляция) до +1.0 (полная положительная корреляция).

Для вычисления воспользуемся функциями mean и sigma (стандартное отклонение), которые были определены в разделах 5.25 и 5.26. О смысле этого показателя можно прочитать в любом учебнике по математической статистике.

В следующем коде предполагается, что есть два массива чисел одинакового размера:

Def correlate(x,y).

 sum = 0.0.

 x.each_index do |i|

  sum += x[i]*y[i].

 end.

 xymean = sum/x.size.to_f.

 xmean = mean(x).

 ymean = mean(y).

 sx = sigma(x).

 sy = sigma(y).

 (xymean-(xmean*ymean))/(sx*sy).

End.

A = [3, 6, 9, 12, 15, 18, 21].

B = [1.1, 2.1, 3.4, 4.8, 5.6].

С = [1.9, 1.0, 3.9, 3.1, 6.9].

C1 = correlate(a,a)         # 1.0.

C2 = correlate(a,a.reverse) # -1.0.

C3 = correlate(b,c)         # 0.8221970228.

Приведенная ниже версия отличается лишь тем, что работает с одним массивом, каждый элемент которого — массив, содержащий пару (x, у):

Def correlate2(v).

 sum = 0.0.

 v.each do |a|

  sum += a[0]*a[1].

 end.

 xymean = sum/v.size.to_f.

 x = v.collect {|a| a[0]}.

 y = v.collect {|a| a[1]}.

 xmean = mean(x).

 ymean = mean(y).

 sx = sigma(x).

 sy = sigma(y).

 (xymean-(xmean*ymean))/(sx*sy).

End.

D = [[1,6.1], [2.1,3.1], [3.9,5.0], [4.8,6.2]].

C4 = correlate2(d) # 0.2277822492.

И, наконец, в последнем варианте предполагается, что пары (x, у) хранятся в хэше. Код основан на предыдущем примере:

Def correlate_h(h).

 correlate2(h.to_a).

End.

E = { 1 => 6.1, 2.1 => 3.1, 3.9 => 5.0, 4.8 => 6.2}.

C5 = correlated(e) # 0.2277822492.