是什么
基于用户(user-based)的协同过滤主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。
怎么做:
①首先:我们需要知道目标用户A看过哪些电影,没看过哪些电影,这样才能推荐。所以我们需要一个user_movie表。
②其次:我们要知道与目标用户A相似度高的用户在看什么电影,这样才能推荐。这里需要一个user_user表记录用户间相似度。
③怎么实现推荐?可以根据邻居用户(相似度高的前n个用户)对目标用户A未看过的电影的打分,来预测目标用户A所有未看过的电影的可能评分,并将估分最高的电影优先推荐
这一步就是简单的读表:读取user表作为列,读取movie表作为行,根据user_movie表填充矩阵。然后可以对矩阵中可能存在的情况进行简单分析~
def getSimilarity(a, b):
vectorA = pd.DataFrame(np.array(a))
vectorB = pd.DataFrame(np.array(b))
# 找两个向量同时非-404的元素重新组成两个向量
y = np.where(vectorA + vectorB >= 0)
#print(y[0]) 这里需要打印出来看看到底是啥鬼玩意
if len(y[0]) == 0: # 如果完全没有共同看过的电影,返回-404
return -404
return vectorA[y[1][0]].corr(vectorB[y[1][0]])
a = [-404, 20, 30, -404, 80, -404]
b = [-404, 80, 90, -404, 0, -404]
c = [0, -404, -404, 70, -404, 40]
d = [-404, -404, -404, -404, -404, -404]
print(getSimilarity(a,b)) #0.9792308883055543
print(getSimilarity(a,c)) #-404 a与c直接无共同评分的电影
print(getSimilarity(a,d),getSimilarity(b,c),getSimilarity(b,d),getSimilarity(c,d)) #-404 同上
#嘿嘿代码仅供参考,作者的实验用的都不完全是这份代码哈哈哈哈
计算完两两间相似度后,填充到user_user表中即可~
#可参考一下代码逻辑~
movie_list = user_movie.loc[[user_id]] #user_id是整形
movie_list = movie_list.iloc[0] # dataframe转成series
movie_unrated_index = np.where(movie_list < 0)[0] #
movie_unrated = movie_list[movie_unrated_index] #得到未观看电影的集合,type为series
movie_unrated_name = movie_unrated.index.tolist() #得到电影id的list
(在这附近踩到了坑,补个博客pandas通过索引数组,获取对应值数组)
公式:其中I 是与目标用户相似度较高(且对该电影有评分的邻居用户集合)(可以灵活选择I的个数~)
sorted(movie_prevalue_dict.items(),key=lambda x:x[1],reverse=True)
"""
第一个参数是需要排序的列表,第二个参数是指定key(列表中每一项的第几个元素)来进行排序。
解释这句代码:d.items()返回的是一个列表 [('a', 74), ('b', 90), ('c', 84), ('d', 85), ('e', 64), ('f', 66), ('g', 88)]
sorted会对d.items()这个list进行遍历,把list中的每一个元素,也就是每一个tuple()当做x传入匿名函数lambda x:x[1],函数返回值为x[1],
也就是key=x[1]=tuple()[1]=('a', 74)[1],也就是说按照里表中每个项的第二个元素进行排序(第一个是想x[0])
"""
#感谢:https://www.cnblogs.com/zhuminghui/p/9251968.html
可以看一下关于AUC曲线绘制的文,有代码
但上述链接中的AUC值的计算与此处的计算不同,毕竟上述链接主要是针对二分类问题,本文是针对推荐列表。
恳请路过的你提供一些推荐算法的评估思路呀