一.基于邻域的算法
1.基于用户的协同过滤算法学习与实现
数据
1::661::3::978302109
1::914::3::978301968
1::3408::4::978300275
算法思路
算法
代码实现
def SplitData (data,M,k,seed):
test=[]
train=[]
random.seed(seed)
for user,item in data:
if random.randint(0,M)==k:
test.append([user,item])
else:
tarin.append([user,item])
return train,test
>>> import pandas as pd
>>> from pandas import Series,DataFrame
>>> rnames = ['user_id','movie_id','rating','timestamp']
>>> ratings = pd.read_table(r'/Users/zhangjiatao/Documents/STUDY/项目学习/《推荐系统》/数据/ml-1m/ratings.dat',sep='::',header=None,names=rnames)
这样我们就把数据读入我们的我们的ratings中了,我们输入
>>> ratings[:3]
查看前三行
可以看到数据已经被读入了,然后我们要将这种形式的数据转换成我们的评分矩阵我们再输入命令
>>> data = ratings.pivot(index='user_id',columns='movie_id',values='rating')
>>> data[:5]
movie_id 1 2 3 4 5 6 7 8 9 10 ... \
user_id ...
1 5.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
5 NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN ...
movie_id 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952
user_id
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
[5 rows x 3706 columns]
def UserSimilarity(train):
W=dict()
for u in train.keys():
for v in train.keys():
if u == v:
continue
W[u][v]=len(train[u]&train[v])
W[u][v]=math.sqrt(len(train[u]*train[v]*1.0))
return W
def Recommend(user,train,W):
rank=dict()
interacted_intems=train[user]
for u,wuv in sorted (W[u].items,key=itemgetter(1),\revers=True) [0:K] :
for i, rvi in train[v].items():
continue
rank[i]+=wuv*rvi
return rank