美文网首页今日看点每天写1000字互联网科技
机器学习笔记038 | 推荐系统的理论逻辑

机器学习笔记038 | 推荐系统的理论逻辑

作者: 止一量化养家 | 来源:发表于2017-10-23 07:57 被阅读366次

想象一下,如果

淘宝给你推荐了一个很符合自己心意的商品……

猫眼给你推荐了一部喜欢看的电影……

当当给你推荐了一本适合自己的书……

你会不会有下单购买的欲望?

即使你足够明智,不会因为这些推荐而冲动消费,但却不是所有人都能做到,依然会有很多人接受这样的推荐。

推荐系统可以说是机器学习的一个重要的应用方向。

有了这些智能的推荐,网站的销售业绩相比从前就能得到很大的提高。

1 基于内容的推荐算法

机器学习是如何发现用户偏好、怎么给出合理推荐的呢?

下面就用电影评分为例,说说基于内容的推荐(Content Based Recommendations)

评分的结果是,评分从 0 到 5 :

假如我们有5部电影和4个用户,评分的情况如下,问号代表没有评分:

这里我们进行如下标记:

nm : 电影数量,这里的值为 5
nu : 用户数量,这里的值为 4
r(i, j) : 用户 j 是否已经对电影 i 评分,如果已经评分,则为 1 ,否则为0,例如 r(1, 2) = 1,r(3,1) = 0。
y(i,j) :用户 j 对电影 i 的评分,例如 y(1,1) = 5,y(3,1) 未定义。

根据电影的信息,我们可以总结出两个特征:爱情、动作。

当然,各个电影的特征成分可能存在差异,如下表:

如果将用户的评分为标记 y ,特征和标签分别是:

每一部电影的特征向量就是:

那么对于每一个用户 j ,都可以学习到一个参数:

如果采用线性回归算法进行预测,那么问号处用户 j 对电影 i 的评分就通过 (j))Tx(i) 来得到。

为了得到 θ(j) ,我们的优化目标是:

其中 n 是特征数量,上面这里就是 n = 2 ,r(i, j) = 1 表示用户 j 已经对电影 i 评分,y(i,j) 为用户 j 对电影 i 的评分。

为了得到 θ(1) ,θ(2) ,…,θ(nu) ,我们的优化目标是:

所使用的梯度是:

2 协同过滤算法

但是有时候,我们并不清楚这些电影具备什么特征。

假如我们并不清楚电影《泰坦尼克号》是爱情片是动作片,还是爱情动作片,也不了解它到底有多少爱情成分,有多少动作成分。

那对我们来说,不仅用户的偏好是未知的,这些电影的特征也是未知的:

2.1 基本版

假设通过采访的方式,我们了解到小芳和丽丽喜欢爱情片,小明和老王偏爱动作片。

他们的偏好组成的参数向量就是:

基于他们的偏好,我们大概就能判断出电影《你的名字》和《泰坦尼克号》是爱情片,《英伦对决》和《奇异博士》是动作片。

通过特征和标签,我们可以得到参数 θ 的值。类似的,通过用户的偏好参数,我们也能计算得到特征 x 的值:

对于所有的参数 θ(1) ,…,θ(nu) ,我们可以学习得到 x(1) ,…,x(nm)

有了电影的特征信息,我们能推测出用户的偏好;有了用户偏好,我们能推测出电影的特征信息。

但是两个都没有,这就变成了一个先有鸡还是先有蛋的问题。

实际上我们能做的,就是随机猜测参数 θ 的值,然后优化计算得到特征 x ,再优化计算得到参数 θ ,如此反复来估计 θ 和 x :

θ → x → θ → x → θ → x → ······

我们根据每个用户对多部电影的评分,以及每部电影由多个不同用户的评分,来估算出电影的特征和用户的偏好,这实际上是这些用户在进行高效的合作。

每位用户的评分都是在帮助算法学习出更好的特征,而这些特征又可以被系统用来给其他人做出更准确的预测,这个过程就是最基本的协同过滤(Collaborative Filtering)

2.2 改进版

不知道你有没有发现,参数计算的前半部分:

和特征计算的前半部分:

两者其实是相同的,只是计算的顺序相反。

前者是对每部电影,计算各个用户对电影评分的误差,再对所有电影进行加总;
后者是对每个用户,计算各部电影该用户评分的误差,再对所有用户进行加总。

那么代价函数其实可以调整成为:

这里的 i 和 j 都是从 1 开始的,也就是特征 x 是 n 维的向量,参数 θ 也是 n 维的向量。

我们不需要 x0 和 θ0 ,因为所有特征都需要学习得到。

如果一个特征的值永远为 1 (x0 = 1),那么这应该可以通过学习得到,而不需要由我们来固定,这样的话算法其实更加灵活。

我们的优化目标是使得该代价函数最小,为了解决这个优化问题,我们将这个代价函数视为特征 x 和用户参数 θ 的函数。

运行梯度下降算法同时执行如下步骤:

这就是改进后的协同过滤算法。

这个算法不用像之前那样,需要反复计算 x 和 θ ,而是直接将这两组参数同时化简。

总的来说,协同过滤算法执行步骤如下

1.随机初始化 x(1) ,…,x(nm) ,θ(1) ,…,θ(nu) 的值;
2.使用梯度下降算法最小化 J( x(1) ,…,x(nm) ,θ(1) ,…,θ(nu) );
3.对于某个用户的参数 θ 和某部电影的特征 x,通过 θTx 来预测该用户对该电影的评分。

对于每部电影,每个用户的评分预测结果可以形成这样一个矩阵:

我们让 X 和 Θ 的矩阵为:

那么评分的预测结果可以使用向量进行表达: T

3 如何推荐

3.1 根据预测评分推荐

在得到所有评分的预测结果之后,那些某个用户没有评分的电影,就可以根据预测评分进行推荐。他可能评分高的,就优先推荐给他。

例如老王没有对《奇异博士》和《雏菊》进行评分,而我们的预计他的评分结果分别是 4 到 5 分和 0 到 1 分:

那么我们就把《奇异博士》推荐给他。

3.2 根据相关性推荐

另外一种方式就是,如果某个用户在网站上看某部电影。

因为我们已经学习得到了所有的特征 x ,通过特征的向量计算,我们就得到两部电影之间的相似性:

假如用户当前所看的电影是 i ,通过找到和 x(i) 距离最小的 x(j) ,我们就得到了相似性最强的电影 j ,然后就把电影 j 推荐给用户

例如老王在看《英伦对决》,通过特征的相似性计算,我们发现《奇异博士》是和《英伦对决》最相似的电影,然后就把《奇异博士》推荐给了老王。

3.3 未评分用户的推荐

假如一个用户没有对任何电影进行过评分,也就是我们没有办法获得他的偏好,那么应该如何给他推荐呢?

例如有这么一个用户小华,他没有对任何电影进行过评分:

如果我们直接使用协同过滤算法,我们学习到的参数其实是:

因为在优化代价函数的过程中,由于用户没有评分,真正对参数的计算起到作用的只有正则化部分:

所以参数为 0 的时候结果是最小的。

参数为 0 ,用户对所有电影的评分也全部被预测为 0 ,这其实没有什么意义:

那么对于没有进行过评分的用户,如何给他们推荐呢?

对于标记评分结果矩阵 Y ,我们可以将已评分的结果进行均值归一化处理:

因为学习之前已经对标记 Y 进行过处理,那么在学习完之后,需要将均值加回来,这样才是最终的预测结果:

对于小华来说,系统预测他的评分,其实就是大家评分的均值:

文章转载自公众号:止一之路

相关文章

网友评论

    本文标题:机器学习笔记038 | 推荐系统的理论逻辑

    本文链接:https://www.haomeiwen.com/subject/esvluxtx.html