基于回归模型的协同过滤推荐算法

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,iR(ruiμbubi)2+λ(ubu2+ibi2)
公式解析:

  • 公式第一部分 ∑ 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,iR(ruiμbubi)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αθjJ(θ)
梯度下降更新 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,iR(ruiμbubi)λ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
    

以上是关于基于回归模型的协同过滤推荐算法的主要内容,如果未能解决你的问题,请参考以下文章

推荐系统的常用算法----算法岗面试题

第3章 第5节 推荐系统的常用算法

推荐算法之模型协同过滤(1)-关联规则

推荐算法的基于协同过滤的推荐

个性化推荐系统推荐算法

个性化推荐系统推荐算法