想象一下,如果
淘宝给你推荐了一个很符合自己心意的商品……
猫眼给你推荐了一部喜欢看的电影……
当当给你推荐了一本适合自己的书……
你会不会有下单购买的欲望?
即使你足够明智,不会因为这些推荐而冲动消费,但却不是所有人都能做到,依然会有很多人接受这样的推荐。
推荐系统可以说是机器学习的一个重要的应用方向。
有了这些智能的推荐,网站的销售业绩相比从前就能得到很大的提高。
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 和 Θ 的矩阵为:
那么评分的预测结果可以使用向量进行表达: 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 进行过处理,那么在学习完之后,需要将均值加回来,这样才是最终的预测结果:
对于小华来说,系统预测他的评分,其实就是大家评分的均值:
文章转载自公众号:止一之路