机器学习 day16推荐系统

01 问题规划

特征对于机器学习来说是十分重要的,机器学习领域有一个伟大的想法,对于某些问题有一些算法可以自动的学习一系列合适的特征。


  • 我们为什么要谈论推荐系统?
    1. 它是机器学习中的一个重要的应用,比如说亚马逊会根据你之前所买的书来给你推荐一些书。
    2. 有一些环境能让你开发某个算法来学习使用哪些特征,而推荐系统就是那些环境中的一个例子,通过推荐系统我们能领悟一些特征学习的思想。
  • 推荐系统问题的组成:以电影评分为例,先说下这些符号的意思。n_u表示用户的数量、n_m表示电影的数量、r(i,j)代表用户j是否对电影i进行评价(=1代表评价了),当用户对电影进行评分后会得到一个值y(i,j),它代表用户j对电影i所给出的评分(0~5星表示)。
  • 因此推荐系统的问题是给出r(i,j)和y(i,j)数据然后去查找那些没有评分的电影,并试图预测这些电影的评价星级。

在这里插入图片描述

  • 总结:如果我们想开发一个推荐系统,那我们应该想出一个学习算法,一个能自动为我们填补那些缺失值的算法,这样就可以知道用户还有哪些电影没看过并推荐新电影给用户。

02 基于内容的推荐算法

  • 我们用x_1(一部电影为爱情片的程度)和x_2(一部电影为动作片的程度)来表示电影的特征。为了做出预测我们把每个用户的评价预测值看做成一个线性回归问题。预测值就是用户j所学参数的转置与电影特征的内积。

在这里插入图片描述

  • 我们要m^(j) 表示评价了电影j的用户数量,为了学习用户参数向量(sita)^(j)我们应该怎么做呢?这是一个基本的线性回归问题,我们可以直接选择一个参数向量,那么这里的预测值会尽可能接近我们在训练集中观察的值。为了学习参数向量我们来最小化参数向量(我们对所有用户j评价的所有电影的(预测值-实际观测值)的平方求和)再除以m。这就像是线性回归我们选择参数向量来最小化这种方差项,并且也可以加入正则化项。如果将这个公式最小化,你可以得到一个很好的对参数向量的估计值,用来对用户j的电影评价做预测。

在这里插入图片描述

  • 当构建推荐系统时,我们不仅是要学习单个用户的参数,我们要学习的是所有用户的参数向量,这时就要用到下面这个式子:

在这里插入图片描述

  • 总结一下:图片上面是我们的优化目标函数,换一种写法J依旧是优化目标函数也是我们试图最小化的项。如果去推到梯度下降更新的话,将会得到下面公式(分别是k=0和k!=0的情况,因为上面的公式k是不等于0的),用梯度下降算法进行参数更新,最小化J来学习所有的参数。

在这里插入图片描述

  • 基于内容的推荐算法,因为我们假设变量是已有的即我们有描述电影内容的特征量(电影中爱情成分和动作成分有多少),同时用这些特征量来进行预测。

03 协同过滤

  • 协同过滤有一个很有意思的特性叫特征学习,这种算法能自行学习所要使用的特征。
  • 我们假设已经知道了每个用户的参数,那么通过每个用户的评分就可以算出一个电影包含爱情和动作的程度。(右下角)

在这里插入图片描述

  • 我们将这一学习问题标准化到任意特征x(i),求出x(i)让预测值尽可能的接近真实值。

在这里插入图片描述

  • 基于内容的推荐算法是给特征求参数,第二个是给参数求特征。实际上我们可以随机地猜取一些参数,然后就能得到特征,再根据特征求参数不断地迭代得到更好地参数和特征,最终将会收敛到一组合理的特征和参数。这个过程就是协同过滤算法。

在这里插入图片描述

  • 对于推荐系统问题,仅建立在每位用户都对数个电影进行了评价,并且每部电影都经过数位用户评价的情况下,这样才能重复这个迭代过程,才能求出参数和特征。
  • 总结下:协同过滤算法是指当你执行算法时,要观察大量的用户及用户的实际行为来协同得到每个人对电影更佳的评分值。协同的另一层的意思就是说每一位用户都在帮助算法更好的进行特征学习。如果每一个用户都对一部分电影做出了评价,那么每个用户都在帮助算法学习出更适合的特征,然后这些被学习出来的特征又可以更好的预测其他用户的评分。

04 协同过滤算法

  • 存在一种算法不需要不停的计算特征和参数,而是能够将特征和参数同时计算出来。下面就是这种算法,需要将前两个优化目标函数结合为一个。第一个平方误差项(所有用户j的总和及所有被该用户评分过的电影总和)和第二个平方误差项(与上面那个是相反的运算:对每部电影i,将所有对它评分过的用户j求和)相加得到新的平方误差项(对所有有评分的用户和电影进行求和),剩下两项拖下来。
  • 新的优化目标函数J有一个特性,你将x作为常数并关于参数(sita)最优化其实就是在计算第一个式子,反过来你将参数(sita)作为常数并关于x求J的最小值的话,其实就是在计算第二个式子。
  • 当我们以这样的方法学习特征量时我们不再遵循原来的惯例(x_0=1),理由是我们现在是在学习所有的特征,没有必要将一个特征值硬编码为1,因为如果算法真的需要一个特征值为1,那么它可以选择靠自己去获取1这个数值,比如将x_1设为1.

在这里插入图片描述

  • 协同过滤算法步骤:
    1. 将特征和参数初始为小的随机值(这有点像神经网络)
    2. 用梯度下降或者其他的高级优化算法将代价函数最小化(这里没有分出k=0的情况是因为不存在x_0=1这一项了)
    3. 如果给你参数和特征,就可以预测评分了

在这里插入图片描述

  • 这个算法可以学习几乎所有电影的特征和所有用户参数,能对不同用户会如何对他们尚未评分的电影做出评价,给出相当准确的预测。

05 矢量化:低轶矩阵分解

将介绍协同过滤算法向量化的实现及使用算法可以实现的一些功能(比如说给定一个商品,可以找到与之相关的一些产品)。


  • 将数据的预测值写成矩阵形式:

在这里插入图片描述

  • 用另一种方法低轶矩阵分解(矩阵X乘以sita的转置)写出这个算法的所有预测评分:

在这里插入图片描述

  • 利用学习到的属性来找到相关的电影,通常算法会学到一些有意义的特征。我们可以衡量两个电影的相似度(两个电影的特征距离很接近)来找到相关影片。

在这里插入图片描述

06 实施细节:均值规范化

  • 下面增加了一个用户,这个用户之前没有给任何电影评过分,将其带入协同过滤算法中。因为用户对电影没有评分,所以算法的第一项对用户参数的选择是没有影响的,只有最后一项可以影响参数的选择,又因为最后一项是正则化,所以说得出来的参数是二维的零向量。二维零向量与哪个二维向量内积都为0,这样的结果不是我们想要的。

在这里插入图片描述

  • 均值归一化的思想可以帮助我们解决这个问题,下面介绍它是如何工作的:把每个电影评分都归一化使得均分为0

    1. 将所有的评分都放到Y矩阵中
    2. 计算每个电影所得评分的均值,并将其存放在一个叫u的向量中
    3. 将Y中所有元素-均值
    4. 对新的评分数据集使用协同过滤算法来学习用户参数及电影特征
    5. 最后来计算电影评分:用户参数的转置与电影特征的内积+u(因为训练集中减去了均值,因此在这里需要加上)
  • 之前用户参数为二维零向量的问题依然存在,但是第五个用户的预测评分变了,变成了电影评分的均值。选择一个大众比较喜欢的推荐给第五个用户,当然如果一个电影没有评分(就不应该推荐,因为关心没有评价电影的人比关系没有被评价过电影更有意义),也可以对Y的每一列进行均值归一化。

在这里插入图片描述

  • 总结一下:均值归一化的实现作为协同过滤算法的预处理步骤,根据不同的数据集,有时可以让你的算法表现得更好一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值