基于内容的推荐算法
基于内容的推荐算法(content-based recommendations CB)
CB是最早使用的推荐算法,它的思想:根据用户过去喜欢的物品,为用户推荐和他过去喜欢的物品相似的物品。关键在于物品相似性的度量。
原理大概分为3步:
1:为每个物品Item构建一个物品的,构建一个物品的属性资料(item profile)
2:位每个用户User构建一个用户的喜好资料(User profile)
3:计算用户喜好资料与物品属性资料的相似度,相似度高意味着用户肯喜欢这个物品。
选择一个想要推荐的用户U,针对用户U遍历以便物品集合,计算出每个物品与用户U的相似度,选出相似度最高的k个物品将他们推荐给用户U
第一步:Item profile
Item是指被推荐的物品(一本书),item profile 是指被推荐物品的详细属性(书的作者、数的类型、出版社、出版时间等等)
第二步:Representing Item Profile
例如一本书ABCbook,假设他的item profile 只包含作者,这样items profile就可以如下表示{A,B,C}(作者A,B,C);
再将items profile映射成程序能够读懂的数据结构,将items profile转换成0,1矩阵,方法如下:
1)先构建一个1位矩阵,n表示全部的作者数量,将所有元素设置为0,即初始化,[0,0,0,0,0……..,0,0,0],一共有n个0
2)假设0号元素代表作者A,1号元素代表B,2号元素代表C,3号元素代表D,等等
3)将items profile里的内容映射到1维矩阵中,如果书的作者是a1,a2,a3,那么次书的行向量中a1,a2,a3对应的元素分别置1
那么ABCbook的0,1矩阵是[1,1,1,0,0,0,0,0,….0,0,0],那么可以看出,ABCbook的作者是0,1,2号元素,即作者A,B,C
第三步:User Profile
建立了item的模型后,就要为用户建模了,就是构造User Profile,
这个User Profile就相当于用户的偏好,用户U的偏好可以表示为对各个作者的喜好程度
例:如下一个评书数据(满分5分,对每本书的评分如下,空的表示未评分)
| 《Java设计》 | 《操作系统》 | 《算法分析》 |
小李 | 4 | 5 | 3 |
小刘 |
| 1 | 4 |
可以看出,小李更喜欢《操作系统》和《算法分析》这两本书,假设这两本书的共同点是作者都有A,那么我们可以推出小李可能更喜欢作者A的书,这样就可以构建小李的User Profile,方法如下:
1)算术小李的平均分:avg=(4+5+3)/3=4
2)利用公式算出小李对作者A的喜好程度,xi是所有涉及到作者A的,而且是小李评过分的书的分数,avg就是平均分,n就是所有涉及到作者A的而且是小李评过分的书的数量:((4-4)+(5-4))/2=0.5,也就是说小李对作者A的喜好程度可以用0.5这个数值来反应
3)同样也建立一个1位矩阵,其中的元素表示每个演员的喜好程度[0.5,x,y,……z],表示了小李对作者A的喜好程度为0.5,等等
第四步:计算推荐依据
利用余弦相似度的公式来计算给定用户U和给定的item I之间的距离,余弦相似度越大说明U越可能喜欢I:
公式
其中Ua表示用户U对作者a的喜好值(即User Profile矩阵中作者A对应的值,例如上0.5)
其中Ia表示书本的作者是否有a(即Item Profile矩阵中作者a对应的值,如上例1)
第五步:推荐
计算小李与每个作者余弦相似度,选择相似度最高的前K个电影,将这K个电影推荐给小李即可。
优点:
1)用户独立性:推荐的产生只与当前用户自己的兴趣模型有关,而与其他用户无关,可以避免恶意作弊行为(刷物品排行榜)
2)推荐具有可解释性:推荐的内容都是根据用户之前的行为产生
3)新物品可以得到推荐:只要物品特征与用户兴趣匹配就可以得到推荐
缺点:
1)项目特征很难抽取:比如社交网络中的人的特征以及电影等不好抽取
2)无法得到用户潜在兴趣:推荐只根据用户对项目的历史喜好产生,所以产生的推荐都是与历史项目相似的,无新意
3)无法为新用户直接产生推荐,新用户没有喜好历史,无法建立兴趣模型,也就无法为他推荐
参考:https://www.cnblogs.com/exlsunshine/p/4214357.html