返回介绍

3.属性规约

发布于 2024-01-28 21:41:24 字数 3907 浏览 0 评论 0 收藏 0

由于推荐系统模型的输入数据需要,需对处理后的数据进行属性规约,提取模型需要的属性。本案例中模型需要的数据属性为用户和用户访问的网页。因此删除其他的属性,只选择用户与用户访问的网页,其输入数据集见表12-23。

表12-23 模型输入数据集

12.2.4 模型构建

在实际应用中,构造推荐系统时,并不是采用单一的推荐方法进行推荐。为了实现较好的推荐效果,大部分都结合多种推荐方法将推荐结果进行组合,最后得出推荐结果,在组合推荐结果时,可以采用串行或者并行的方法。本例所展示的是并行的组合方法,如图12-8[1]所示。

图12-8 推荐系统流程图

针对此项目的实际情况,其分析目标的特点为:长尾网页丰富、用户个性化需求强烈以及推荐结果的实时变化,以及结合原始数据的特点:网页数明显小于用户数。本例采用基于物品的协同过滤推荐系统对用户进行个性化推荐,以其推荐结果作为推荐系统结果的重要部分。因其利用用户的历史行为为用户进行推荐,可以令用户容易信服其推荐结果。

基于用户和基于物品的协同过滤算法的区别在于:基于用户的协同过滤回答的是“将物品A推荐给哪个用户?”(假设答案是用户B),基于物品的协同过滤回答的是“将哪个物品推荐给用户B?”(在前面的假设下,答案是A)。也就是说,两者的问法并不一样,但是最终的推荐结果是相同的。基于用户的协同过滤是用在用户少、物品多的场景,反之,基于物品的协同过滤就是用在用户多、物品少的场景。总的来说,都是为了减少计算量。而在数学上,两者的区别是在输入的用户-物品评分矩阵中,要不要进行转置,换句话说,只要对用户-物品评分矩阵进行转置,就可以将基于用户和基于物品的协同过滤相互转换。(通俗地说,计算机可没法识别究竟是“将物品推荐给人”还是“将人推荐给物品”。)

基于物品的协同过滤系统的一般处理过程:分析用户与物品的数据集,通过用户对项目的浏览与否(喜好)找到相似的物品,然后根据用户的历史喜好,推荐相似的项目给目标用户。图12-9是基于物品的协同过滤推荐系统图[2],从图中可知用户A喜欢物品A和物品C,用户B喜欢物品A、物品B和物品C,用户C喜欢物品A。从这些用户的历史喜好可以分析出物品A和物品C是比较类似的,喜欢物品A的人都喜欢物品C,基于这个数据可以推断用户C很有可能也喜欢物品C,所以系统会将物品C推荐给用户C。

图12-9 基于物品的推荐系统原理图

根据上述处理过程可知,基于物品的协同过滤算法主要分为两步。

计算物品之间的相似度。

根据物品的相似度和用户的历史行为给用户生成推荐列表。

其中,关于物品相似度计算的方法有:1)夹角余弦;2)杰卡德(Jaccard)相似系数;3)相关系数等。将用户对某一个物品的喜好或者评分作为一个向量,例如所有用户对物品1的评分或者喜好程度表示为A1=(x11,x21,x31,…xn1),所有用户对物品M的评分或者喜好程度表示为AM=(x1m,x2m,x3m,…xnm),其中m为物品,n为用户数。可以采用上述几种方法计算两个物品之间的相似度,其计算公式见表12-24。由于用户的行为是二元选择(0-1型),因此本例在计算物品的相似度过程中采用杰卡德相似系数法。

表12-24 相似度计算公式

在协同过滤系统分析的过程中,用户行为存在很多种,例如浏览网页与否、是否购买、评论、评分、点赞等行为。如果要采用统一的方式表示所有行为是很困难的,因此,只能针对具体的分析目标进行具体的表示。在本例中,原始数据只记录了用户访问网站的浏览行为,因此用户的行为是浏览网页与否,并没有进行类似电子商务网站上的购买、评分和评论等用户行为。

完成各个物品之间的相似度的计算后,即可构成一个物品之间的相似度矩阵,类似于表12-25。通过采用相似度矩阵,推荐算法会给用户推荐与其物品最相似的K个物品。采用公式P=SIM×R,度量了推荐算法中用户对所有物品的感兴趣程度。其中,R代表用户对物品的兴趣,SIM代表所有物品之间的相似度,P为用户对物品感兴趣的程度。因为用户的行为是二元选择(是与否),所以在用户对物品的兴趣R矩阵中只存在0和1。

表12-25 相似度矩阵

由于推荐系统是根据物品的相似度以及用户的历史行为对用户的兴趣度进行预测并推荐,因此在评价模型的时候需要用到一些评测指标。为了得到评测指标,一般是将数据集分成两部分:大部分作为模型训练集,小部分数据作为测试集。通过训练集得到的模型,在测试集上进行预测,然后统计出相应的评测指标,通过各个评测指标的值可以知道预测效果的好与坏。

其中,用Python借助Numpy来实现协同过滤算法并不困难,其代码如代码清单12-8所示。

代码清单12-8 Python实现协同过滤算法

import numpy as np
def Jaccard(a, b): #自定义杰卡德相似系数函数,仅对0-1矩阵有效
  return 1.0*(a*b).sum()/(a+b-a*b).sum()
class Recommender():
  sim = None #相似度矩阵
  def similarity(self, x, distance): #计算相似度矩阵的函数
    y = np.ones((len(x), len(x)))
    for i in range(len(x)):
      for j in range(len(x)):
        y[i,j] = distance(x[i], x[j])
    return y
  def fit(self, x, distance = Jaccard): #训练函数
    self.sim = self.similarity(x, distance)
  def recommend(self, a): #推荐函数
    return np.dot(self.sim, a)*(1-a)

代码详见:demo/code/Recommender.py

本例采用随机打乱数据的方法完成模型的评测,具体方法为:首先用随机函数打乱原始数据的顺序(用random库的shuffle()函数可以轻松做到),然后将用户行为数据集按照均匀分布随机分成M份(本例取M=10),挑选一份作为测试集,将剩下的M-1份作为训练集。然后在训练集上建立模型,并在测试集上对用户行为进行预测,统计出相应的评测指标。为了保证评测指标并不是过拟合的结果,需要进行多次重复,由于开始时的随机函数打乱顺序保证了测试的随机性,因此,仅需要少数几次试验,就可以得出比较稳定可靠的评测结果,最后将实验测出的评测指标的平均值作为最终的评测指标。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文