У меня есть код python о пользователе сходства с Корреляцией Пирсона, и я хочу проанализировать шаг вычисления, потому что я начинаю с Python хе-хе. Когда я пытаюсь вычислить вручную и сравнить с результатом этой программы, результат всегда отличается. Мне интересно, ошибаюсь ли я, когда пытаюсь вычислить вручную. Код выглядит так:Корреляция Пирсона в Python
# A dictionary of movie critics and their ratings of a small set of movies
critics={'User 1': {'Spiderman': 1.0, 'Batman Begins': 2.0, 'Superman': 4.0},
'User 2': {'Spiderman': 2.0, 'Batman Begins': 3.0, 'Superman': 3.0}
}
from math import sqrt
# Returns the Pearson correlation coefficient for p1 and p2
def sim_pearson(prefs,p1,p2):
# Get the list of mutually rated items
si={}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1
# if they are no ratings in common, return 0
if len(si)==0: return 0
# Sum calculations
n=len(si)
# Sums of all the preferences
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])
# Sums of the squares
sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
sum2Sq=sum([pow(prefs[p2][it],2) for it in si])
# Sum of the products
pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])
# Calculate r (Pearson score)
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
def main():
z = sim_pearson(critics, 'User 1','User 2')
print z
if __name__ == "__main__":
main()
Я хочу, чтобы вычислить сходство между пользователем 1 и пользователем 2. Но я запутался в этой части:
([prefs[p1][it] for it in si])
, что есть смысл [его] ?
Результат подобия, если я использую это программа: +0,755928946018
верно значение этого кода ([prefs[p1][it] for it in si])
множится рейтинги пользователя 1? Мне нравится 1*2*4
? или он должен быть умножен на рейтинги пользователя 2? Мне нравится (1*2)+(1*3)+(4*3)
?
Я смущен с [p1][it]
. Надеюсь, вы можете мне помочь, спасибо за то, что вы сделали.
Хороший ответ! Очень подробно – Llopis
и 'n' относится к числу пользователей или количеству фильмов, рейтинг которых по пользователю? – user3528526
Я получил 'sum1 = 7'' sum2 = 8'' sum1sq = 21' 'sum2sq = 22'' psum = 56', это правда? потому что результат всегда различен каждый раз, когда я вычисляю вручную хмм – user3528526