基于隐语义模型的新闻推荐系统

开发工具:Tomcat 7.0、myEclipse、Android Studio、PyCharm

毕业设计的题目是基于隐语义模型的新闻推荐系统,新闻推荐系统分为三个部分,第一个部分是管理员使用的后台管理子系统,第二个部分是用户使用的新闻客户端APP,第三个部分是新闻推荐子系统。

  1. 管理员使用的后台管理子系统是一个web应用,后台管理子系统的功能是管理新闻和管理用户。后台管理子系统使用的是MVC框架。
  2. 用户使用的新闻客户端APP是一个安卓应用,新闻客户端的功能是登录、注册、管理个人信息、浏览新闻。浏览的新闻包括两个部分,分别是热门新闻和个性化推荐的新闻。热门新闻是为用户推送浏览量比较高的新闻,个性化推荐的新闻是通过隐语义模型为用户推荐的新闻。
  3. 新闻推荐子系统的功能有两个,一个是新闻的采集,另一个是推荐模块。新闻采集的功能是利用python爬虫技术从搜狐新闻的网站爬取新闻。推荐模块的功能是通过隐语义模型为用户推荐新闻,把推荐的结果保存到数据库里面。

隐语义模型的核心思想是通过隐含特征把用户和用户感兴趣的物品联系起来。隐语义模型通过统计用户行为来实现物品的分类,计算出物品在每个类别里面的权重,而不是把物品硬性地分到某个类别。隐语义模型允许指定总共有多少个分类,数字越小,那么分类的粒度越粗。

隐语义模型是用公式:P、Q矩阵相乘来计算用户对物品的兴趣度,P矩阵记录的是所有用户对每个隐类的兴趣度,Q矩阵记录的是所有物品在每个隐类里面的权重。比如说现在有一篇新闻,用户对每个新闻类别的兴趣度 乘以 一篇新闻在每个新闻类别里面的权重就得到了用户对这篇新闻的兴趣度。所有隐语义模型的关键就是得到模型参数P、Q矩阵。

第一步:是构造用来训练的数据集。从数据库里面得到用户的行为记录,把用户浏览过的新闻定义为正样本,推送给用户但是用户没有浏览过的新闻定义为负样本,正样本和负样本的数量要差不多

第二步:是初始化P、Q矩阵。用0到1的随机数去填充P、Q矩阵

第三步:定义损失函数。采用平方损失函数,并且加入正则化项,以防止过拟合

第四步:是使用随机梯度下降算法优化损失函数。随机梯度下降算法是先求损失函数的参数的偏导数,然后沿着最快的下降方向迭代更新参数,直到找到损失函数的极小值,得到最终的P、Q矩阵

第五歩:把P、Q矩阵相乘预测用户对新闻的兴趣度,然后为用户推荐兴趣度最高的TopN个新闻

(用P、Q矩阵去预测用户对新闻的兴趣度的时候,是从数据集里面筛选出用户没有看过的新闻,然后根据当前遍历到的用户确定P矩阵的行,根据当前遍历到的新闻确定Q矩阵的列,然后P矩阵的这一行和Q矩阵的这一列相乘,得到当前用户对当前新闻的兴趣度,然后把新闻id和预测的值保存到List里面)

注:

1.隐语义模型的参数:隐类的个数F(设置为6)、
学习速率α(设置为0.02)、
正则化参数λ(设置为0.01)、
迭代的次数N(设置为5)

2.学习速率α越大,迭代下降的越快,学习速率α和正则化参数λ是通过实验得到的

3.迭代的次数是人为设置的,每次迭代完,都要对学习速率α进行衰减(α=α* 0.9)。因为一开始的时候P、Q矩阵离最优值相差的比较远,所以需要快速下降,当优化到一定程度后,需要对学习速率进行衰减,慢慢的接近最优值

4.梯度下降算法:是沿着梯度下降的方向求解极小值,每次移动一个步长

5.隐语义模型的缺点:不能实时推荐

6.隐语义模型的优点:
(1)能够通过设置隐类的个数F控制分类的粒度
(2)能确定物品在每个分类里面的权重

7.协同过滤算法分为基于用户的协同过滤算法和基于物品的协同过滤算法。
(1)基于用户的协同过滤算法是找到和目标用户兴趣相似的用户,然后把这些用户感兴趣的物品推荐给目标用户。
(2)基于物品的协同过滤算法是根据用户行为计算物品之间的相似度,根据物品的相似度和用户的历史行为给用户推荐。协同过滤的缺点是不能很好地处理物品在不同类别里面的权重问题

8.推荐系统的冷启动问题:新注册用户的冷启动问题
解决方法:利用用户注册的时候填写的感兴趣的新闻类别,为用户个性化推荐这些类别下面的新闻

9.损失函数:是用来衡量模型的预测值和真实值之间的差距

10.加入偏置项的隐语义模型增加了用户偏置项和物品偏置项。用户偏置项表示用户的评分习惯和物品本身没有关系的因素。物品偏置项表示物品获得的评分和用户没有关系的因素

把用户行为记录表里面的数据从数据库里面读到csv文件里面:把数据库的用户行为表里面的用户id、新闻id、新闻是否浏览的标识读取出来,并且保存到csv文件里面,csv文件的列名是UserID , NewsID , Bview

训练的数据集就是这个csv文件里面的数据

根据训练的数据集初始化隐语义模型,涉及到的参数是:F: 隐特征(隐类)的数量,设置为6 N: 迭代次数,设置为5 α: 随机梯度下降的学习速率,设置为0.02 λ: 正则化参数,设置为0.01
LFM的实现步骤:

1.对P、Q矩阵进行初始化,用随机数填充P、Q矩阵

P矩阵的行的数量是用户id个数,列的数量是隐类F的数量,值是6,矩阵填的值是从0到1的随机数(生成len(userID)行F列从0到1的随机数)

Q矩阵的行的数量是隐特征的个数F,值是6,列的数量是新闻id个数,矩阵填的值是从0到1的随机数

2.建立用户-物品对应关系,初始化目标用户样本数据

根据训练的数据里面的bview=1还是0得到每个用户浏览过的新闻和推荐给用户但是用户没有浏览过的新闻,把用户浏览过的新闻记为正反馈1,推荐给用户但是用户没有浏览过的新闻记为负反馈0,获得了记录所有用户正负反馈的新闻列表

3.计算误差

循环上一步得到的记录了用户正负反馈的样本数据,可以知道当前用户对当前物品的偏好值,利用最开始用随机数填充的P、Q矩阵去预测当前用户对当前物品的兴趣度,拿当前用户对当前物品的实际偏好值减去P、Q矩阵预测的结果得到误差

注:

拿P矩阵里面当前这个用户对每个隐类的值,Q矩阵里面当前这个物品在每个隐类里面的值,一行和一列相乘,值的结果就是预测当前用户对当前这个物品的兴趣度

4、循环F个隐类,使用梯度下降算法,优化P、Q矩阵。

梯度下降算法:用到的参数 学习速率α 正则化参数λ

每次迭代完,都要降低学习速率α。一开始的时候由于P、Q矩阵离最优值相差比较远,所以需要快速下降; 当优化到一定程度后,需要放慢学习速率,慢慢的接近最优值

迭代N次之后,得到最终的P、Q矩阵(N是自己设置的参数)

5、先删除推荐表里面的所有推荐记录,查询用户行为表里面所有的用户id,遍历每个用户,从训练数据里面用户自己没有看过,但是其他人看过的新闻里面,利用优化后的P、Q矩阵根据隐语义模型的计算公式预测用户对物品的兴趣度,然后为用户推荐兴趣度最高的前25条新闻

用户行为表里面包括了个性化推荐的新闻和热点新闻

有个热点新闻表

然后把要推荐的新闻保存到数据库的新闻推荐表里面

个性化新闻和热点新闻被用户点击阅读之后,会修改用户行为表,记录已经浏览

新注册的用户注册成功之后,为该用户推荐的个性化新闻是新闻表news里面浏览量排名前400到425的新闻,把这些推荐的新闻更新到用户行为表里面,浏览量置为0,查询财经、科技、健康等各个板块的热点新闻,给用户看的热点新闻更新到用户行为表里面

从搜狐新闻爬取了6个类别的新闻:历史、娱乐、科技、财经、文化、健康
把爬取到的新闻的新闻类别model_id、标题、发布时间、浏览量、正文内容所在的文件地址保存到数据库的新闻表里面,新闻的正文内容保存到txt文件里面

新闻客户端一共有7个模块的新闻,分别是基于隐语义模型推荐给用户的个性化新闻、娱乐类的热点新闻、文化类的热点新闻、科技类的热点新闻、财经类的热点新闻、历史类的热点新闻、健康类的热点新闻。用户进入新闻客户端,看到的是新闻列表,新闻列表展示的每条新闻显示的是文章标题和文章的发布时间,点击新闻列表里面的某个新闻,才能看到新闻正文内容

安卓的功能是在activity里面对控件设置了监听器,当监听器被触发的时候,会调用相应的方法去处理

基于隐语义模型的推荐算法

机器学习之隐语义模型LFM介绍与代码实现(篇六)

《推荐系统实践》笔记


坚持