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

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

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

Оглавление книги

Оглавление статьи/книги

Генерация: 1.691. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз