from math import sqrt
values = {
\'Guido van Rossum\': {\'python\': 5.0, \'php\': 1.2, \'ruby\': 4.0, \'perl\': 2.8},
\'Larry Wall\': {\'python\': 5.0, \'php\': 1.2, \'ruby\': 4.0, \'perl\': 5.0},
}
def pearsons_correlation_coefficient(values, obj1, obj2):
"""
Коэффициент корреляции Пирсона
диапазон значений результата от -1 до 1
"""
if isinstance(values, dict) and values.has_key(obj1) and values.has_key(obj2):
signs = [] # признаки оценки
# отбор признаков, присутствующих у обоих
for key, value in values[obj1].items():
if key in values[obj2]:
signs.append(key)
# если признаков нет, вернуть 0
if not signs: return 0
# количество признаков
n = len(signs)
# сумма знач.всех признаков
sum1 = sum([values[obj1][s] for s in signs])
sum2 = sum([values[obj2][s] for s in signs])
# сумма квадратов знач.всех признаков
sum1Sq = sum([pow(values[obj1][s],2) for s in signs])
sum2Sq = sum([pow(values[obj2][s],2) for s in signs])
# сумма произведений знач.всех признаков
pSum = sum([values[obj1][s]*values[obj2][s] for s in signs])
# Коэффициент Пирсона
num = pSum-(sum1*sum2/n)
den = sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
if den == 0: return 0
r = num/den
return r
else:
raise ValueError
print pearsons_correlation_coefficient(values, \'Guido van Rossum\', \'Larry Wall\')
# 0.79850420561