大数据,机器学习,人工智能人工智能/模式识别/机器学习精华专题机器学习与数据挖掘

机器学习入门笔记系列(12)| 基于内容的推荐系统

2018-10-14  本文已影响8人  胖三斤66

一、基于内容的推荐系统

推荐系统时当下非常流行的机器学习应用。

下面,讲解「基于内容的推荐系统」。

1.1 基于内容的推荐算法思想

根据用户过去喜欢的物品,为用户推荐和他过去喜欢的物品相似的物品,而关键就在于这里的物品相似性的度量,这才是算法运用过程中的核心。

举个例子,在京东上购物的小伙伴们应该都知道,每当你进入任何一个物品页面的时候都会有一个“猜你喜欢”的栏目,这时候他就会根据你经常购买的物品给你推荐相似的物品。

基于内容的推荐算法一般包括以下三步:

  1. 物品表示:提取物品的特征 x 来表示物品;
  2. 特征学习:利用一个用户过去喜欢或者不喜欢的物品的特征数据,来训练学习算法得到用户的偏好特征 \theta
  3. 生成推荐列表:通过比较上一步得到的用户偏好与候选物品的特征,为此用户推荐一组相关性最大的物品。

1.2 电影推荐系统的实现

首先定义一些表达式:

n_u = 用户人数
n_m = 电影数量
r(i,j) = 1 当用户 j 对 电影 i 进行了评分
y^{(i,j)} = 用户 j 对电影 i 评分的分数(if~r(i,j) = 0, y^{(i,j)}=undefined),其中用户对电影的评分范围是 0 星到 5 星

1.2.1 给定电影特征和评分,学习用户偏好

电影推荐系统实例1

其中,上表中 ? 代表用户对该电影没有评分。表的左半边是用户对电影的评分,最右边的两列是电影的特征。

物品表示:假设从电影提取两个特征 x_1,x_2 分别表示电影的爱情指数(即电影中爱情元素的占比)与动作指数(即电影中动作元素的占比),取值范围均为 0 到 1 ,且 x_1 + x_2 = 1

特征学习:知道这些电影特征值 x_1,x_2 以及知道用户对这些电影的评分后,可以选用学习算法对每个用户建模来学习用户偏好 \theta^{(j)}。即假设我们选用线性回归模型,最终,对于每个用户 j,通过训练学习一个参数(这里我们可以称为用户偏好) \theta^{(j)},这样就可以用 x^{(i)}\theta^{(j)} 来预测用户 j 对电影 i 的评分。

特征学习-对每个用户建立预测模型 线性回归模型具体实现

其中,在构建推荐系统时,我们也不想只对某一个用户学习出参数向量 \theta^{(j)},我们想对所有的用户都学习出 \theta。因为我有 n_u 个用户,所以我希望学习出所有的参数。那么我要做的是将这个最优化目标另外再加上一个求和。所以与之前所学的线性回归模型唯一不同的是现在不是只对一个 θ^{(j)},现在我要对所有的用户求这个目标函数的和,然后对整个优化目标求最小值,最小化整个这个代价函数 min_{\theta^{(1)},..,\theta^{(n_u)}} J(\theta^{(1)},...,\theta^{(n_u)})

\sum_{i:r(i,j)=1} 是一个用户对所有已评分电影;\sum_{j=1}^{n_u} 是遍历所有用户

生成推荐列表:得到了用户偏好 \theta^{(j)},代入待选电影的特征值 x^{(i)},进行预测并根据预测结果排序,将排名靠前的电影推荐给用户。

这看上去就跟之前所学线性回归模型在优化目标上有点区别之外,其余没有特别大的区别。

1.2.2 给定用户偏好和评分,学习电影的特征

假设已知条件调换,我们有某一个数据集,我们并不知道特征的值是多少。所以比如我们得到一些关于电影的数据:不同用户对电影的评分,但我们并不知道每部电影到底有多少浪漫的成分,也不知道到底有多少浪漫的成分,于是我把所有的问题都打上问号,只知道用户对这几部电影的评分。没有了电影的特征值是没法进行学习算法就没法推荐。那么 「如何得到电影的特征值并构建推荐系统」

电影推荐系统实例1

假设我们对每一位用户进行问卷调查,而且每一位用户都告诉我们,他们是否喜欢爱情电影以及他们是否喜欢动作电影(比如现在很多网站都会让用户选择喜爱偏好)。假如用户 1 告诉我们她十分喜欢爱情电影,于是用户1的偏好 \theta^{(1)}_1 对应的值就是满分即 5 分,而她非常不喜欢动作电影,于是 \theta^{(1)}_2 就是0。通过这种方式能得到所有用户的偏好 \theta

给定用户偏好

然后通过四个用户喜爱偏好和对第1部电影的评分,可以大概推断出第 1 部电影的爱情元素占比较高,动作元素占比很小,从而初始化电影 1 的特征值,以此类推可对所有电影特征进行初始化。

初始化电影的特征值

初始化完成后,通过梯度下降算法最小化代价函数,预测电影本身指数,整个过程如下:

给定用户偏好和评分,学习电影的特征

跟给定电影的特征,预测用户对电影评分的公式几乎一样,就是两者的变量发生了对调而已。

1.2.1 和 1.2.2 公式对比

二、协同过滤(Collaborative Filtering)

假设只知道用户对电影的评分的情况下,如何得到电影的合理特征值 x 以及用户对电影类型的偏好 \theta

一种构建推荐系统的方法叫做协同过滤。

2.1 协同过滤算法思路

在知道用户对电影的评分的情况下,如何得到电影的合理特征值 x 以及用户对电影类型的偏好 \theta

基本的协同过滤算法:随机初始化 \theta 的值,基于你一开始随机猜测出的 \theta 的值,运用 1.2.2 方法,可以学习到不同电影的特征 x,然后用学习到的电影的特征 x1.2.1 方法,可以得到对参数 \theta 的更好估计,又用这个更好的 \theta1.2.2 方法,得到更好的电影的特征 x 。然后我们可以继续迭代,不停重复优化 \theta \rightarrow x \rightarrow \theta \rightarrow ... 。如果你这样做的话,你的算法将会收敛到一组合理的电影的特征 x 以及一组不同用户合理偏好参数 \theta 的估计。

Guess~\theta \Rightarrow x \Rightarrow \theta \Rightarrow x \Rightarrow \theta \Rightarrow ... (至收敛)

2.2 协同过滤算法实现

上面讲解了算法的思路就是不停地重复这些计算,先随机地初始化这些参数 \theta,然后运用 \theta 初始化 x;然后优化 x,优化 \theta,优化 x,优化 \theta ...

但实际上呢,存在一个更有效率的算法让我们不再需要再这样不停地依次计算 x,\theta,而是能够将 x,\theta 同时计算出来。

首先,将 1.2.1 和 1.2.2 的优化目标合并。

合并优化目标

其中,红框标注出来的求和公式都是一样的,就是表达不同而已。

Tips:用这种方法,我们可以不需要 x_0 = 1 这个前提,也就是 x^{(i)} \in \mathbb{R}^{n},\theta^{(j)} \in \mathbb{R}^{n}

协同过滤算法完整的过程

PS:第二步中,先计算完全部特征 x,再计算全部参数 \theta

2.3 协同过滤算法向量化实现

协同过滤算法向量化实现

Y = Y + \mu

2.4 电影之间的相似度衡量

两个电影的特征值之差 ||x^{(i)} - x^{(j)}|| 可以衡量两个电影之间的相似程度。

2.5 算法实现细节:均值归一化

对于从未对电影评分的用户,使用协同过滤算法会得到他的偏好全0 并且他对所有的电影评分都是 0,这样我们无法推荐他任何电影

对于从未对电影评分的用户

这个问题需要使用均值归一化解决

电影评分矩阵 Y

使用均值归一化的协同过滤算法

对未知的用户,让他对电影的评分等于电影的平均分,即上例中

y(i,5) = [2.5,2.5,2,2.25,2.25]^T

换句话说,使用均值归一化的协同过滤算法,对于未知的用户,我们推荐平均评分较高的电影给他。

We talked about mean normalization. However, unlike some other applications of feature scaling, we did not scale the movie ratings by dividing by the range (max – min value). This is because:
All the movie ratings are already comparable (e.g., 0 to 5 stars), so they are already on similar scales.

总结

基于内容的推荐算法一般包括以下三步:

  1. 物品表示:提取物品的特征 x 来表示物品;
  2. 特征学习:利用一个用户过去喜欢或者不喜欢的物品的特征数据,来训练学习算法得到用户的偏好特征 \theta
  3. 生成推荐列表:通过比较上一步得到的用户偏好与候选物品的特征,为此用户推荐一组相关性最大的物品。
协同过滤算法学习特征 $x$ 和用户偏好 $\Theta$

参考文献

  1. 吴恩达机器学习 week9
  2. 【推荐系统】详解基于内容的推荐算法
上一篇下一篇

猜你喜欢

热点阅读