Advertisement
konyakov

Коэффициент корреляции Пирсона

Feb 18th, 2012
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.76 KB | None | 0 0
  1. from math import sqrt
  2.  
  3. values = {
  4.     'Guido van Rossum': {'python': 5.0, 'php': 1.2, 'ruby': 4.0, 'perl': 2.8},
  5.     'Larry Wall': {'python': 5.0, 'php': 1.2, 'ruby': 4.0, 'perl': 5.0},
  6. }
  7.  
  8. def pearsons_correlation_coefficient(values, obj1, obj2):
  9.     """
  10.    Коэффициент корреляции Пирсона
  11.    диапазон значений результата от -1 до 1
  12.    """
  13.     if isinstance(values, dict) and values.has_key(obj1) and values.has_key(obj2):
  14.         signs = [] # признаки оценки
  15.         # отбор признаков, присутствующих у обоих
  16.         for key, value in values[obj1].items():
  17.             if key in values[obj2]:
  18.                 signs.append(key)
  19.         # если признаков нет, вернуть 0
  20.         if not signs: return 0
  21.         # количество признаков
  22.         n = len(signs)
  23.         # сумма знач.всех признаков
  24.         sum1 = sum([values[obj1][s] for s in signs])
  25.         sum2 = sum([values[obj2][s] for s in signs])
  26.         # сумма квадратов знач.всех признаков
  27.         sum1Sq = sum([pow(values[obj1][s],2) for s in signs])
  28.         sum2Sq = sum([pow(values[obj2][s],2) for s in signs])
  29.         # сумма произведений знач.всех признаков
  30.         pSum = sum([values[obj1][s]*values[obj2][s] for s in signs])
  31.         # Коэффициент Пирсона
  32.         num = pSum-(sum1*sum2/n)
  33.         den = sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
  34.         if den == 0: return 0
  35.         r = num/den
  36.         return r
  37.     else:
  38.         raise ValueError
  39.  
  40. print pearsons_correlation_coefficient(values, 'Guido van Rossum', 'Larry Wall')
  41. # 0.79850420561
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement