在机器学习中存在一些算法可以自动地学习到你可能感觉兴趣的东西,推荐系统 (recommender systems) 会根据你的兴趣来学习,向你推荐你可能感觉兴趣的东西
举一个例子:假使有 5 部电影,3部爱情片、2部动作片。 4 个用户为其中的部分电影打了分。现在希望构建一个算法,预测每个人可能给没看过的电影打多少分,以此作为推荐的依据
变量定义:
nu:用户的数量
nm:电影的数量
r(i, j):用户 j 给电影 i 评过分则 r(i, j) = 1
y(i,j):用户 j 给电影 i 的评分 (注:这里 i 和 j 不要搞反)
mj:代表用户 j 评过分的电影的总数
在一个基于内容的推荐系统算法中,假设对于我们希望推荐的东西,里面都有相应的特征
举个例子:每部电影都有两个特征, x1 代表电影的浪漫程度,x2 代表电影的动作程度,比如:x(1)是第一部电影的特征向量,为[0.9 0]
θ(j) 用户 j 的参数向量,x(i) 电影 i 的特征向量,对于用户 j 和电影 i,我们预测其评分为:(θ(j))Tx(i)
加入正则化后的代价函数(均方误差)如下:
根据代价函数的偏导数后得到梯度下降的更新公式为:
1.3 协同过滤 Collaborative filtering
之前我们是根据电影的特征来计算出每一个用户的评价,反过来如果我们拥有用户的评价可以计算出电影的特征
代价函数也是类似:
那如果既没有用户的参数,也没有电影的特征,那该怎么办?
可以采用协同过滤算法,同时学习这两者,算法是通过随机初始化一个用户的参数,然后去计算电影的特征,再用电影的特征去优化用户的参数,不断迭代,直到得到两者都最优
1.4 协同过滤算法 Collaborative filtering algorithm
结合之前说的两者计算方式可以将两个式子结合起来一起优化:
总结一下协同过滤算法的步骤:
1. 初始 x 和 θ 为一些随机小值
2. 使用梯度下降算法最小化代价函数 J
3. 在训练完算法后,通过计算 θTx 预测用户 j 给电影 i 的评分
1.5 向量化:低秩矩阵分解 Vectorization:Low rank matrix factorization
在之前的例子中可以采取向量化的方式来表示对电影的评分Y,一行表示每个用户对一个电影的评分
对于这个大的评分矩阵,我们就可以将 θ 和 X 分开来表示,最后再以 X * θT 的方式来表示这个评分大矩阵
除此之外,如果我们想要寻找一个与电影 x(i) 相关的电影,可以通过计算两部电影的特征向量之间的距离 ∥x(i) − x(j)∥的方式来寻找相关电影
例如,想要找到与电影 x(i) 相关的5部电影,就可以根据 ∥x(i) − x(j)∥ 计算出距离最小的5部电影,即为5部与电影 x(i)相关的电影
1.6 实施细节:均值归一化 Mean normalization
如果新增一个用户 Eve,她没有为任何电影评分,那么我们应该怎么为 Eve 推荐电影
如果继续按照之前的模型,因为她没有打分,代价函数第一项为0,那目标函数就变为最后一项(正则化项),优化目标函数后 θ(5) 中的元素就都是0,再拿着 θ(5) 去预测评分,最后得到得评分都是0,那这么做就没什么意义了
所以我们就提出了归一化
首先需要对结果 Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值
然后利用这个新的 Y 矩阵来训练算法, 最后在预测评分时,需要在预测值的基础上加回平均值,即预测值等于 (θ(j))Tx(i) + μi 。
那么对于像 Eve 这样没对任何电影评价过的用户,预测值等于 μi ( (θ(j))Tx(i) = 0),即新模型按照电影的平均分来向他推荐电影