Top-N Recommendation——基于用户的推荐实验

注:
1. 数据集来源 MovieLens
2. 源代码在末尾附上

一、Introduction

大家无论是在实体商店还是在网络上,都会有Top-N推荐的情况。基于客户或者基于商品做出推荐。本实验基于Movielens、Ratings的电影数据集,对用户做出Top-N 推荐。主要目的是基于User-Based的思想来进行Top-10的相关电影推荐。

二、Methodology

本实验基于User-Based 的思路,首先通过Item-based计算电影的相似度,对每部电影都生成一个它与其他电影的相似度的序列(按顺序排列),然后从中得到Top-10的电影来作为该部电影的相关推荐电影集。然后根据用户历史行为从Item-base中选出对应的电影序列,从而产生推荐的电影。
MovieLens中的数据格式如下:

  1::Toy Story (1995)::Animation|Children's|Comedy

1:表示电影ID; Toy Story(1995)表示电影名 ;Animation|Children’s|Comedy :表示标签
因此可以用一个向量表来表示该电影的信息:
Top-N Recommendation——基于用户的推荐实验_第1张图片
附注: 0 表示电影没有该标签 , 1 表示电影有该标签

对每一部电影,计算它与其他电影的相似度,生成一个相似度的有序序列。N部电影生成N个有序序列,因此对每一部电影都有一个单独的推荐列表。 如:
用户历史记录为U{movie1,movie3,movie5};假设每一部电影的推荐项为10,那么就有3*10=30部电影的推荐(其中可能包含重复的,将重复的电影剔除),然后再按照这些电影的相似度大小排序,选出10部电影推荐给该用户。这样就完成了针对用户历史行为的电影推荐。

三、Trading Algorithm

  • Item-Based:
    首先生成一个电影的信息矩阵(N*M),然后对于每一个部电影,使用相似度计算的公式,将该电影与其余N-1部电影做相似计算,然后再对相似度进行排序,推荐前Top-10的电影。
  • 相似度:
    公式:
    Top-N Recommendation——基于用户的推荐实验_第2张图片
    本实验采用的是Cosine相似度:
    这里写图片描述

    • 原理:多维空间两点与所设定的点形成夹角的余弦值。
    • 范围:【-1,1】,值越大,说明夹角越小,两点相距越近,相似度就越高。
    • 说明:Cosine相似度被广泛应用于计算文档的数据的相似度,本实验是基于标签的电影推荐,因此采用了该公式来计算两个电影之间标签集的相似度,以此来代表两部电影的相似度。
  • TF-IDF算法(计算某个标签对于该电影的权重)
    由于MovieLens里面的Movie数据只给出了电影的标签(如下),但是并没有给出该标签用户的点击量,因此无法对该标签在本电影中的权重进行计算。因此,本实验没有用TF-IDF计算词频,确定标签权重的步骤。

  • User-based
    每一个已有用户都有一个历史观看记录,根据历史观看记录,来找出推荐的电影集。推荐的依据是Item-based思想产生的推荐序列,每一部电影都有一个推荐序列,如果用户有User{movie1,movie2,……,movien} n个历史观看记录,原则上说就应该对应着 N个推荐序列。将这N个推荐序列中重复的电影剔除,再按照从高到低的相似度排序,从中选出若干部电影推荐给用户。这就是User-based算法的思想。

  • 验证精确度
    为了验证推荐的精确度,我们将已有的用户浏览记录分为两部分,80%用来训练,20%用来评估推荐算法的精确度。
    比如:根据用户历史行为(80%的训练集),产生的推荐序列为 Rec{movie1,movie2,movie3,movie4…,movie10},然后,将剩下的的评估集打印出来,与推荐的电影比较,计算相似命中率(由于我们这里是划分集合评估,所以命中率指的是与推荐电影的相似度)。
    注:结论部分有说明,采用相似命中率是因为训练集与评估集的电影是互斥的,推荐的电影是根据训练集作为历史记录,评估集作为检测推荐算法的精确度。推荐的电影(根据Item-based算法)是从全部集合中选出来推荐的,评估电影只占全部电影的20%,因此评估的效果并不是很好;其次,用户*电影矩阵大小为6040*4000,但是给的评论数据才有100万,因此Item-Based算法的推荐序列本来就存在了误差,故而影响到了User-based推荐序列的精确度。

四、Result

为了验证结果,将推荐的电影序列打印出来,为了便于截图,此处只给用户推荐了10部电影。而且用于评估的电影,我们只选取了相似命中率最高(也就是在评估的电影集合中与推荐序列最吻合的那一部)的那一部电影来验证相似命中率。
在这里我们随机选取了三部个用户,将其电影的Top-10推荐以及它的相似度打印出来,以便分析比较。

User1:
Top-N Recommendation——基于用户的推荐实验_第3张图片

User2:
Top-N Recommendation——基于用户的推荐实验_第4张图片

User3:
Top-N Recommendation——基于用户的推荐实验_第5张图片

五、Conclusion

结果证明,对于每一个用户,都输出了一个推荐序列,而且按照相似度排列的Top-N推荐。列如, User3:用于评估推荐相似命中率的电影序列有10部,该用户的T推荐列表也有10部,从结果来看相似命中率并不是很高。

  • 存在的问题:命中率较低
  • 问题分析与方案
    • 第一,实验的数据比较少,训练集得到的模型并不可靠;
    • 第二,本实验评估的是用户观看的电影与推荐列表的电影的相似度,用于评估的电影是取用户浏览数据的后20%数据,数据没有随机性;
    • 第三,由于用于评估的电影与训练集电影不同,因此评估的电影没有重复性(也就是说,训练集的电影在评估集中不能出现,所以评估的电影无法命中,故本实验采用的是相似命中率通过标签的相似度来评估推荐电影的准确率),所以实验的精确度依赖于评估集合中电影的标签与推荐电影标签的相似度(与用户行为相关度不是很大)。因此对于一个用户,生成的推荐序列与评估电影序列,相似命中率不是很高。

总体来说,本实验基于User-based思想,以前面的Item-based实验数据的结果,通过相似度计算,生成针对于用户的top-N 推荐序列。虽然数据上的准确度,但是总体上还是完成了推荐的目的。

点击此处下载源代码

你可能感兴趣的:(C++,算法,topN,基于用户推荐)