推荐系统(Recommender System)

推荐系统(Recommender System)

案例

  • 为用户推荐电影

数据展示

Bob Tom Alice Jack 动作成分 浪漫成分
Movie1 5 ? 0 3 ? ?
Movie2 ? 0 3 ? ? ?
Movie3 0 1 0 5 ? ?
Movie4 ? 4 1 0 ? ?

算法

  • 协同过滤算法(Collaborative filter learning algorithm)

记号

  • \(n_m\): 数据中电影的数量, 其中n表示number, m表示movie
  • \(n_u\): 数据中用户的数量, 其中n表示number, u表示user
  • \(i\): 表示第i部电影
  • \(j\): 表示第j位用户
  • \(y^{(i, j)}\): 第j位用户对第i部电影的评分, 我们发现在原始数据中有?, 表示用户没有看过, 不能评分, 这里对应的\(y^{(i, j)}\)为0, \(y^{(i, j)}\)需要配合下一个\(r\)记号
  • \(r^{(i, j)}\): 第j位用户是否看过第i部电影, 如果看过则为1, 没有则为0, 其中r表示rate
  • \(x^{(i)}\): 第i部电影的特征向量
  • \(\theta^{(j)}\): 第j位用户的权重
  • \(x_k^{(i)}\): 第i部电影的第k个特征向量
  • \((i,j):r(i,j)=1\), 表示取使得\(r(i,j)=1\)\((i,j)\)

步骤

  • 对每一部电影的评分进行去中心化, 得到去中心化的数据以及均值, 在去中心化的过程中忽略评分为?的数据
  • 随机初始化\(X\)\(\Theta\)
  • 计算损失函数\[J(x^{(i)}, ..., x^{(n_m)},\theta^{(j)}, ..., \theta^{(n_u)})={1\over{2m}}\sum_{(i,j):r(i,j)=1}((\theta^{(i)})^Tx^{(i)}-y^{(i,j)})^2+{\lambda\over2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2+{\lambda\over{2}}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2\]
  • 求解\[min_{x^{(i)}, ..., x^{(n_m)},\theta^{(j)}, ..., \theta^{(n_u)}}J(x^{(i)}, ..., x^{(n_m)},\theta^{(j)}, ..., \theta^{(n_u)})\]
  • 梯度
    • \[x_k^{(i)}:=x_k^{(i)}-\alpha(\sum_{j:r(i,j)=1}((\theta^{(j)})^T)-y^{(i,j)})\theta_k^{(i,j)}+\lambda x_k^{(i)})\]
    • \[\theta_k^{(j)}:=\theta_k^{(j)}-\alpha(\sum_{i:r(i,j)=1}((\theta^{(i)})^T-y^{(i,j)})x_k^{i}+\lambda \theta_k^{(j)})\]

Matlab实现CostFunction关键部分

%此处, 虽然有一些用户没有对一些电影做出评价, 但是Y仍然为0, 在下一个J的赋值语句中, 通过R计算出符合要求的J
J = (X * Theta' - Y) .^ 2;

J = (1 / 2) * sum(sum(J .* R)) + (lambda / 2) * sum(sum(X .^ 2)) + (lambda / 2) * sum(sum(Theta .^ 2));

X_grad = ((X * Theta' - Y) .* R) * Theta + lambda * X;
Theta_grad = ((X * Theta' - Y) .* R)' * X + lambda * Theta;

猜你喜欢

转载自www.cnblogs.com/megachen/p/10542368.html
今日推荐