推荐系统(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部电影的特征向量
- ( heta^{(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)}, heta{(j)}, ..., heta{(n_u)})={1over{2m}}sum_{(i,j):r(i,j)=1}(( heta{(i)})Tx{(i)}-y{(i,j)})2+{lambdaover2}sum_{i=1}{n_m}sum_{k=1}n(x_k{(i)})2+{lambdaover{2}}sum_{j=1}{n_u}sum_{k=1}{n}( heta_k{(j)})2$$
- 求解$$min_{x^{(i)}, ..., x{(n_m)}, heta{(j)}, ..., heta{(n_u)}}J(x{(i)}, ..., x{(n_m)}, heta{(j)}, ..., heta^{(n_u)})$$
- 梯度
-
[x_k^{(i)}:=x_k^{(i)}-alpha(sum_{j:r(i,j)=1}(( heta^{(j)})^T)-y^{(i,j)}) heta_k^{(i,j)}+lambda x_k^{(i)})
]
-
[ heta_k^{(j)}:= heta_k^{(j)}-alpha(sum_{i:r(i,j)=1}(( heta^{(i)})^T-y^{(i,j)})x_k^{i}+lambda heta_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;