基于回归模型的协同过滤推荐算法
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于回归模型的协同过滤推荐算法相关的知识,希望对你有一定的参考价值。
基于回归模型的协同过滤推荐
基于回归模型的协同过滤推荐
如果我们将评分看作是一个连续的值而不是离散的值,那么就可以借助线性回归思想来预测目标用户对某物品的评分。其中一种实现策略被称为Baseline(基准预测)。
Baseline:基准预测
Baseline设计思想基于以下的假设:
- 有些用户的评分普遍高于其他用户,有些用户的评分普遍低于其他用户。比如有些用户天生愿意给别人好评,心慈手软,比较好说话,而有的人就比较苛刻,总是评分不超过3分(5分满分)
- 一些物品的评分普遍高于其他物品,一些物品的评分普遍低于其他物品。比如一些物品一被生产便决定了它的地位,有的比较受人们欢迎,有的则被人嫌弃。
这个用户或物品普遍高于或低于平均值的差值,我们称为偏置(bias)
Baseline目标:
- 找出每个用户普遍高于或低于他人的偏置值 b u b_u bu
- 找出每件物品普遍高于或低于其他物品的偏置值 b i b_i bi
- 我们的目标也就转化为寻找最优的 b u b_u bu和 b i b_i bi
使用Baseline的算法思想预测评分的步骤如下:
-
计算所有电影的平均评分 μ \\mu μ(即全局平均评分)
-
计算每个用户评分与平均评分 μ \\mu μ的偏置值 b u b_u bu
-
计算每部电影所接受的评分与平均评分 μ \\mu μ的偏置值 b i b_i bi
-
预测用户对电影的评分:
r ^ u i = b u i = μ + b u + b i \\hat{r}_{ui} = b_{ui} = \\mu + b_u + b_i r^ui=bui=μ+bu+bi
举例:
比如我们想通过Baseline来预测用户A对电影“阿甘正传”的评分,那么首先计算出整个评分数据集的平均评分 μ \\mu μ是3.5分;而用户A是一个比较苛刻的用户,他的评分比较严格,普遍比平均评分低0.5分,即用户A的偏置值 b i b_i bi是-0.5;而电影“阿甘正传”是一部比较热门而且备受好评的电影,它的评分普遍比平均评分要高1.2分,那么电影“阿甘正传”的偏置值 b i b_i bi是+1.2,因此就可以预测出用户A对电影“阿甘正传”的评分为: 3.5 + ( − 0.5 ) + 1.2 3.5+(-0.5)+1.2 3.5+(−0.5)+1.2,也就是4.2分。
对于所有电影的平均评分 μ \\mu μ是直接能计算出的,因此问题在于要测出每个用户的 b u b_u bu值和每部电影的 b i b_i bi的值。对于线性回归问题,我们可以利用平方差构建损失函数如下:
加入L2正则化:
C
o
s
t
=
∑
u
,
i
∈
R
(
r
u
i
−
μ
−
b
u
−
b
i
)
2
+
λ
∗
(
∑
u
b
u
2
+
∑
i
b
i
2
)
Cost=\\sum_{u,i\\in R}(r_{ui}-\\mu-b_u-b_i)^2 + \\lambda*(\\sum_u {b_u}^2 + \\sum_i {b_i}^2)
Cost=u,i∈R∑(rui−μ−bu−bi)2+λ∗(u∑bu2+i∑bi2)
公式解析:
- 公式第一部分 ∑ u , i ∈ R ( r u i − μ − b u − b i ) 2 \\sum_{u,i\\in R}(r_{ui}-\\mu-b_u-b_i)^2 ∑u,i∈R(rui−μ−bu−bi)2是用来寻找与已知评分数据拟合最好的 b u b_u bu和 b i b_i bi
- 公式第二部分 λ ∗ ( ∑ u b u 2 + ∑ i b i 2 ) \\lambda*(\\sum_u {b_u}^2 + \\sum_i {b_i}^2) λ∗(∑ubu2+∑ibi2)是正则化项,用于避免过拟合现象
对于最小过程的求解,我们一般采用随机梯度下降法或者交替最小二乘法来优化实现。
方法一:随机梯度下降法优化
使用随机梯度下降优化算法预测Baseline偏置值
step 1:梯度下降法推导
损失函数:
梯度下降参数更新原始公式:
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
\\theta_j:=\\theta_j-\\alpha\\cfrac{\\partial }{\\partial \\theta_j}J(\\theta)
θj:=θj−α∂θj∂J(θ)
梯度下降更新
b
u
b_u
bu:
损失函数偏导推导:
b u b_u bu更新(因为alpha可以人为控制,所以2可以省略掉):
同理可得,梯度下降更新
b
i
b_i
bi:
b
i
:
=
b
i
+
α
∗
(
∑
u
,
i
∈
R
(
r
u
i
−
μ
−
b
u
−
b
i
)
−
λ
∗
b
i
)
b_i:=b_i + \\alpha*(\\sum_{u,i\\in R}(r_{ui}-\\mu-b_u-b_i) -\\lambda*b_i)
bi:=bi+α∗(u,i∈R∑(rui−μ−bu−bi)−λ∗bi)
step 2:随机梯度下降
由于随机梯度下降法本质上利用每个样本的损失来更新参数,而不用每次求出全部的损失和,因此使用SGD时:
单样本损失值:
参数更新:
step 3:算法实现
import pandas as pd
import numpy as np
class BaselineCFBySGD(object):
def __init__(self, number_epochs, alpha, reg, columns=["uid", "iid", "rating"]):
# 梯度下降最高迭代次数
self.number_epochs = number_epochs
# 学习率
self.alpha = alpha
# 正则参数
self.reg = reg
# 数据集中user-item-rating字段的名称
self.columns = columns
def fit(self, dataset):
'''
:param dataset: uid, iid, rating
以上是关于基于回归模型的协同过滤推荐算法的主要内容,如果未能解决你的问题,请参考以下文章