#-[i]- coding: utf-8 -[/i]-计算皮尔逊相关系数,找出兴趣相投的用户:(插入自己的数据)
import json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
user_info = {}
#爬取到的数据
user_dict = {
'ns2250225':[4,3,4,5,4],
'justin':[3,4,3,4,2],
'totox':[2,3,5,1,4],
'fabrice':[4,1,3,4,5],
'doreen':[3,4,2,5,3]
}
#录入用户数据
def user_data(user_dict):
for name in user_dict:
user_info[name] = {u'消失的爱人' : user_dict[name][0]}
user_info[name][u'霍比特人3'] = user_dict[name][1]
user_info[name][u'神去村'] = user_dict[name][2]
user_info[name][u'泰坦尼克号'] = user_dict[name][3]
user_info[name][u'这个杀手不太冷'] = user_dict[name][4]
user_data(user_dict)
#存放用户数据
try:
with open('user_data.txt', 'w') as data:
for key in user_info:
data.write(key)
for key2 in user_info[key]:
data.write('\t')
data.write(key2)
data.write('\t')
data.write('\t')
data.write(str(user_info[key][key2]))
data.write('\n')
data.write('\n')
except IOError as err:
print('File error: ' + str(err))
from math import sqrt向某用户推荐电影(加权平均所有人的评价)
#计算皮尔逊相关度(1为完全正相关,-1为完成负相关)
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
#插入自己的数据
user_info['me'] = {u'消失的爱人' : 5,
u'神去村' : 3,
u'炸裂鼓手' : 5}
#找出皮尔逊相关系数>0的用户,说明该用户与自己的电影品味比较相近
for user in user_info:
res = sim_pearson(user_info, 'me', user)
if res > 0:
print('the user like %s is : %s' % ('me', user))
print('result :%f\n' % res)
#向某个用户推荐电影(加权平均所有人的评价值)结果与分析:
def getRecommendations(prefs,person,similarity=sim_pearson):
totals={}
simSums={}
for other in prefs:
# don't compare me to myself
if other==person: continue
sim=similarity(prefs,person,other)
# ignore scores of zero or lower
if sim<=0: continue
for item in prefs[other]:
# only score movies I haven't seen yet
if item not in prefs[person] or prefs[person][item]==0:
# Similarity * Score
totals.setdefault(item,0)
totals[item]+=prefs[other][item]*sim
# Sum of similarities
simSums.setdefault(item,0)
simSums[item]+=sim
# Create the normalized list
rankings=[(total/simSums[item],item) for item,total in totals.items()]
# Return the sorted list
rankings.sort()
rankings.reverse()
return rankings
#向我推荐电影
res = getRecommendations(user_info, "me")
print('Recommand watching the movie:')
print json.dumps(res, encoding='UTF-8', ensure_ascii=False)
本文为 @ 21CTO 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。