推荐系统MOOC笔记

对应课程

2. 基于邻域的协同过滤

2.1 协同过滤基本思想

算法分类

  1. Top-N推荐 <=> 评分预测
  2. 基于邻域 <=> 基于模型

步骤

  1. 收集数据
    • 隐式反馈
    • 显式反馈
  2. 寻找邻域/训练模型
  3. 计算推荐结果

2.2 基于用户的协同过滤

用户相似度

  • \(N(u)\)为用户\(u\)有过正回馈的项目集
  • \(N(v)\)为用户\(v\)有过正回馈的项目集合
  • \(u\)\(v\)的兴趣相似度
    • Jaccard相似度:\(\omega_{uv}=\frac{|N(u)\cap N(v)|}{|N(u)\cup N(v)|}\)
    • 余弦相似度:\(\omega_{uv}=\frac{|N(u)\cap N(v)|}{\sqrt{|N(u)||N(v)|}}\)
    • 例:\(\omega_{AB}=\frac{|\{b,d\}\cap \{a,b,c\}|}{|\{b,d\}\cup \{a,b,c\}|}=\frac{1}{4}\)

兴趣度预测

  • 计算用户\(u\)对邻域用户购买过的项目\(i\)的感兴趣程度\(p(u,i)\)
  • 输入:
    • \(S(u,K)\):和用户\(u\)最相似的\(K\)个用户(\(K\)-近邻)
    • \(\omega_{uv}\):用户\(u\)和用户\(v\)的兴趣相似度
    • \(r_{vi}\):观测到的用户\(v\)对项目\(i\)的兴趣度(有正反馈为1,否则为0)
  • 兴趣度:邻域用户的兴趣度的加权求和
    • \(p(u,i)=\displaystyle\sum_{v\in S(u,K)}\omega_{uv}*r_{vi}\)
  • 例:
    • 邻域:\(S(A,2)=\{C,B\}\)
    • 候选项目集(邻域用户购买过的):\(\{a,c\}\)
    • 计算用户感兴趣程度:\(p(A,a)=\frac{1}{4}+\frac{2}{3}=\frac{11}{12}\)
    • 推荐排序:\(p(A,a)>p(A,c)>p(A,e)\)

基于User-CF的推荐系统

  • 离线预处理
    • 计算用户间的相似度
    • 确定每个用户的邻域(K近邻)
  • 在线推荐:针对当前活跃用户计算推荐列表
    • 确定候选项目集:\(C(u)=\{i|i\notin N(u)\And i\in N(v)\And v\in S(u,K)\}\)
    • 预测兴趣度并生成推荐列表:\(p(u,i)=\sum_{v\in S(u,K)\cap N(i)}\omega_{uv}*r_{vi}\)

用户相似度改进:IUF

  • 逆用户频率(Inverse User Frequency)
    • 基本思想:惩罚热门项目
  • 计算:
    • 惩罚系数:\(f_i=\log\frac{n}{n_i}\)
    • \(n\):总用户数
    • \(n_i\):对项目\(i\)有过正反馈的用户数
    • \(\omega_{uv}=\frac{\sum_{i\in N(u)\cap N(v)}\log\frac{n}{n_i}}{|N(u)\cup N(v)|}\)

User-CF的缺点

  • 很难形成有意义的邻域集合
    • 用户两两之间共同反馈少
    • 仅有的共同反馈项目往往是热门项目
  • 随用户行为数据增加,相似度变化可能很快
    • 离线(offline)算法难以瞬间更新推荐结果

2.3 基于项目的协同过滤

项目相似度

  • \(N(i)\)为点击(或购买)过项目\(i\)用户集
  • \(i\)\(j\)的兴趣相似度
    • Jaccard相似度/余弦相似度(类似User-CF)
    • 条件概率相似度:\(\omega_{ij}=P(j|i)=\frac{|N(i)\cap N(j)|}{|N(i)|}\)
  • 计算:
    • 构建用户-项目倒排表:购买某项目的用户列表
    • 得到项目相似度矩阵、项目邻域表

兴趣度预测

  • 计算用户\(u\)对候选项目\(i\)的感兴趣程度\(p(u,i)\)
  • 输入:
    • \(S(j,K)\):和项目\(j\)最相似的\(K\)个项目
    • \(N(u)\):用户\(u\)有过正反馈的项目集合
    • \(r_{uj}\):观测到的用户\(u\)对项目\(j\)的兴趣度
  • 兴趣度:已反馈的项目的兴趣度的加权求和
    • \(p(u,i)=\displaystyle\sum_{j\in N(u)}I(i\in S(j,K))*\omega_{ij}*r_{uj}\)

基于Item-CF的推荐系统

  • 离线预处理
  • 在线推荐
    • 确定候选项目集:\(C(u)=\{i|i\notin N(u)\And i\in S(j,K)\And j\in N(u)\}\)
    • 预测兴趣度并生成推荐列表:\(p(u,i)=\sum_{j\in N(u)}I(i\in S(j,K))*\omega_{ij}*r_{uj}\)

改进

  • 惩罚活跃用户(Jaccard相似度)
    • 基本思想:越活跃的用户对项目相似度贡献越小
    • 惩罚系数:\(f_u=\log\frac{m}{m_u}\)
      • \(m\):总项目数
      • \(m_u\):用户u有过正反馈的项目数
    • 修正Jaccard相似度:\(\omega_{ij}=\frac{\sum_{u\in N(i)\cap N(j)}\log\frac{m}{m_u}}{|N(i)\cup N(j)|}\)
  • 惩罚热门项目(条件概率相似度)
    • 修正后的条件概率相似度:\(\omega_{ij}=P(j|i)=\frac{|N(i)\cap N(j)|}{|N(i)||N(j)|^\alpha}\)
      • \(\alpha\in[0,1]\)

2.4 基于邻域的评分预测

评分预测

  • 输入:用户显式评分
  • 输出:用户\(u\)对项目\(i\)的期望评分\(\hat{r}_{ui}\)
  • 步骤
    • 收集数据
    • 寻找邻域
    • 计算推荐结果
      • User-CF:\(\hat{r}_{ui}=\frac{\sum_{v\in N_i(u)}\omega_{uv}r_{vi}}{\sum_{v\in N_i(u)}|\omega_{uv}|}\)
        • \(N_i(u)\):对物品i有过评分的与用户u相似的用户v的集合
        • 例(K=2):\(\hat{r}_{Ad}=\frac{3*0.839+2*0.827}{0.839+0.827}\approx2.50\)
      • Item-CF:\(\hat{r}_{ui}=\frac{\sum_{j\in N_u(i)}\omega_{ij}r_{uj}}{\sum_{v\in N_u(i)}|\omega_{ij}|}\)

余弦相似度(用户)

  • \(\omega_{uv}=\frac{\sum_{i\in J_{uv}r_{ui}r_{vi}}}{\sqrt{\sum_{i\in J_u}r_{ui}^2\sum_{j\in J_v}r_{vj}^2}}\)
    • \(J_u\):用户\(u\)有过评分的项目集合
    • \(r_{ui}\):用户\(u\)对项目\(i\)的评分
    • 隐含假设:用户\(u\)对未知评分项目的评分为0
    • 例:\(\omega_{AB}=\frac{5*3+3*1+3*1}{\sqrt{(5^2+3^2+3^2)*(3^2+1^2+1^2+2^2)}}\approx0.827\)
    • 缺点:未考虑到用户评分的相对高低,相似度与预测评分不合理

Pearson相似度(用户)

  • \(\omega_{uv}=\frac{\sum_{i\in J_{uv}}(r_{ui}-\bar{r}_u)(r_{vi}-\bar{r}_v)}{\sqrt{\sum_{i\in J_{uv}}(r_{ui}-\bar{r}_u)^2\sum_{i\in J_{uv}}(r_{vi}-\bar{r}_v)^2}}\)
    • \(J_{uv}\):用户\(u\)\(v\)都有过评分的项目集合
    • \(\bar{r}_u\):用户\(u\)的评分平均值
    • 将用户评分看作随机变量

预测修正

  • User-CF:\(\hat{r}_{ui}=\bar{r}_u+\frac{\sum_{v\in N_i(u)}\omega_{uv}(r_{vi}-\bar{r}_v)}{\sum_{v\in N_i(u)}|\omega_{uv}|}\)
    • 目标用户自身评分平均值+相对预测结果
    • 例:\(\hat{r}_{Ad}=\bar{r}_A+\frac{\sum_{v\in N_d(A)}\omega_{Av}(r_{vd}-\bar{r}_v)}{\sum_{v\in N_d(A)}|\omega_{Av}|}=3.667+\frac{0.996*(2-1.75)}{0.996}\approx3.917\)
  • Item-CF:\(\hat{r}_{ui}=\bar{r}_i+\frac{\sum_{j\in N_u(i)}\omega_{ij}(r_{uj}-\bar{r}_j)}{\sum_{v\in N_u(i)}|\omega_{ij}|}\)

2.5 基于二部图的CF

传统邻域方法的缺点

  • 范围限制:只考虑和用户有过共同评价(或购买)项目的相邻用户
  • 计算空间复杂度较大:需要在内存中保存整个用户-项目反馈(评分)集合(矩阵)
  • 数据稀疏/冷启动:用户一般只会评价(或购买)少量项目

基于二部图的协同过滤

  • 隐式反馈行为数据集:\((u,i)\)二元组集合
  • 表示成(二部)图形式
    • 不相交的两个顶点子集:\(U\)\(I\)(用户集和项目集)
    • 每条边\((u,i)\)关联的两个顶点\(u\)\(i\)属于两个不同的顶点子集(\(u\in U\), \(i\in I\))
  • 推荐类型:Top-N推荐

激活扩散

  • 假设:
    • 用户反馈过的项目都具有用户偏好的某种属性
    • 用户偏好可以在图中的节点间传递
  • 基本思想:根据用户偏好的传递性来挖掘用户潜在偏好信息
  • 标准的协同过滤:路径长度=3,\(U_A\)-\(I_b\)-\(U_B\)-\(I_c\)
  • 扩展路径长度
    • 例:路径长度=5
  • 步骤(给定目标用户):
    • 图扩散:
      • 目标用户节点出发,沿边扩散
      • 直到给定的最大扩散步长
    • 确定候选项目集:
      • 到达过的所有项目\(-\)目标用户有过正反馈的项目
    • 项目排序:
      • 依据(1.相同看2.)
        1. 首次到达步数(升序)
        2. 到达次数(降序)
  • 系统
    • 数据表示:矩阵\(R\)
      • 行用户,列项目
      • 有反馈1,无反馈0
    • 图扩散:\(S^{(2k+1)}=R*(R^T*R)^k\)
      • 矩阵乘法表示
      • 步长一般为奇数(到项目节点)
    • 确定候选项目集:该行非0,且未反馈过
    • 项目排序:根据矩阵乘法结果(到达次数)降序

物质扩散(Mass Diffusion)

  • 假设:
    • 扩散过程中每条边的影响不完全相同
    • 可避免活跃用户/热门项目偏置的问题
  • 基本思想:
    • 将用户的偏好属性表示为节点所拥有的资源
    • 每个节点平均地将资源分享给相邻节点,满足守恒律
  • 步骤(给定目标用户):
    • 资源初始化分配:目标用户有过正反馈的项目节点分配一个资源
    • 资源扩散:根据邻接关系平均分配迭代传递资源
      • \(b_u=\displaystyle\sum_{j=1}^n r_{uj}\frac{s_j}{k(I_j)}\)
        • \(S=(s_1,s_2,......,s_n)\):项目节点资源分配
        • \(k(I_j)\):项目节点\(j\)的出度
        • \(b_u\):用户节点\(u\)获得的资源
    • 生成推荐列表:候选项目按资源拥有量降序
  • 系统
    • 数据表示:矩阵\(R\)
      • \(r_{ui}\begin{cases}1&\text{用户u对项目i有过正反馈}\\0&\text{其他}\\\end{cases}\)
    • 图扩散:\(S^{(k)}=S^{(0)}*(W)^k\)
      • 资源分配初始化:\(S^{(0)}=R\)
    • 转移矩阵\(W\)的计算
      • \(w_{lj}\):一轮迭代(“项目-用户-项目”)从项目节点\(l\)上资源转移到项目\(j\)上的比例
      • \(w_{lj}=\frac{1}{k(I_l)}\sum_{u=1}^m\frac{r_{ul}r_{uj}}{k(U_u)}\)
    • “项目-用户”扩散:每个项目节点平均分配资源给相邻用户节点
      • \(b_u=\sum_{j=1}^n r_{uj}\frac{s_{uj}}{k(I_j)}\)
    • “用户-项目”扩散
      • \(s_{uj}^\prime=\sum_{u=1}^m r_{uj}\frac{b_u}{k(U_u)}=\sum_{l=1}^n s_{ul}w_{lj}\)
    • 排序:根据资源分配矩阵\(S^{(k)}\)该行降序

其他图扩散方法

  • 热扩散(Heat Spreading)
    • 假设:
      • 有恒温热源驱动,不满足守恒律
      • 平均影响:每个节点的热量是其所有相邻节点的平均值
  • 带重启的随机游走
    • 每次迭代以一定概率\(\alpha\)向前随机游走(扩散\(W\)),以概率\((1-\alpha)\)回到初始状态
    • \(S^{(k+1)}=(1-\alpha)S^{(0)}+\alpha S^{(k)}W\)
posted @ 2023-06-26 17:08  hibana049  阅读(49)  评论(0)    收藏  举报