美文网首页今日看点每天写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