说明:之前学过的知识的总结
推荐系统:
协同过滤推荐:基于物品的推荐&基于用户的推荐
步骤:
user-based
建立用户-物品评分举证
对矩阵进行SVD分解具体代码实现
目标用户的邻居用户
物品的预测评分
推荐评分最高K个物品
__author__ = 'DELL'
from math import sqrt
'''critics={'Cathy':{'a':2.5,'b':3.5,'c':3,'d':3.5,'e':2.5,'f':3},
'Sophie':{'a':3,'b':3.5,'c':1.5,'d':5,'e':1.5,'f':3},
'Susie':{'a':2.5,'b':3,'d':3.5,'f':4},
'Antonio':{'b':3.5,'d':4,'e':2.5,'f':4.5},
'Marco':{'a':3,'b':4,'c':2,'d':3,'e':2,'f':3},
'Jack':{'a':3,'b':4,'d':5,'e':3.5,'f':3},
'Leo':{'b':4.5,'d':4,'e':1.0}
}'''
def loadMovieLensTrain(filename='u1.base'):
str1 ='./ml-100k/'
prefs={}
for line in open(str1+filename,'r'):
(user,movieid,rating,ts)=line.split('\t')
prefs.setdefault(user,{})
prefs[user][movieid]=float(rating)
return prefs
def loadMovieLensTest(filename='u1.test'):
str1 ='./ml-100k/'
prefs={}
for line in open(str1+filename,'r'):
(user,movieid,rating,ts)=line.split('\t')
prefs.setdefault(user,{})
prefs[user][movieid]=float(rating)
return prefs
def sim_distance(prefs,person1,person2):
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
if len(si)==0:
return 0
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1]
if item in prefs[person2]])
return 1/(1+sqrt(sum_of_squares))
def top_match(prefs,person,n,similarity=sim_distance):
scores=[(similarity(prefs,person,other),other) for other in prefs if other!=person]
scores.sort()
scores.reverse()
return scores[0:n]
prefs=loadMovieLensTrain(filename='u1.base')
print top_match(prefs,'1',5)
item-based
建立用户-物品评分举证
对矩阵进行SVD分解具体代码实现
相似的K个物品
根据用户对物品的评分找出最相似的K个物品