推荐系统

在引入推荐系统这个概念前,我们首先讲述Long Tail现象。对于实体商店而言,由于其货架是有限的,所以要尽可能挑选卖的好的商品摆在货架上。Long Tail是指大部分的商品的popularity没那么高。同理对于线上商店来说,虽然可以摆出很多商品,但推荐给某个用户的商品也是有限的。
推荐系统

基于内容的推荐系统(Content-Based Recommendations)

主要思想:根据用户对打分比较高的产品推荐与这些产品较为相似的产品。例如,对于电影推荐而言,给用户推荐有相同导演、演员的其他电影;对于博客推荐而言,给用户推荐具有相似标题的博客。

产品画像(Item Profiles)的建立

对于产品(item),我们需重构其特征,这个过程叫做Item Profiles。例如,对于某部电影而言,其画像可以由该电影的演员、导演、上映时间、电影类型等组成;对于文本而言,其画像就是某些重要的单词的集合。下面给出如何为文本生成画像(Profile)。
fijf_{ij}:特征ii(term)在文本jj(item)出现的频率
TFij=fijmaxkfikTF_{ij}=\frac{f_{ij}}{max_{k}{f_{ik}}}
说明:除的操作是为了对较长的文件产生折扣的效果
nin_i:包含特征ii(item)的文本的数量
NN:总的文本的数量
IDFi=logNniIDF_i=log\frac{N}{n_i}
TFIDFscoreTF-IDF scorewij=TFijIDFiw_{ij}=TF_{ij}*IDF_{i}
最后选取该文本中TFIDFscoreTF-IDF score较高的单词作为特征向量
对于该算法的解释:TFijTF_{ij}表示的是该单词在文本中出现的频率,但是仅仅把这个频率作为评估该单词是否能成为特征是不合理的,例如,一些常用词:的、是等等,将这些常用词当作特征显然是不合理的,所以还应该结合IDFiIDF_{i}衡量该单词在所有文本中出现的频率的倒数,如果该单词在所有文本中出现频率都较高,说明该单词是常用词,不应该将其当作特征。

用户画像(User Profiles)的建立

结合矩阵UU中用户喜欢的电影,按照某种方式聚合得到用户的画像。例如,产品是电影,Utility Matrix中:11表示该用户喜欢这部电影,空表示该用户不喜欢该电影。在用户UU喜欢的电影中,有20%的电影包含演员 Julia Roberts,所以用户UU的画像中,Julia Roberts的值为0.2。若Utility Matrix中的打分为151-5。应该首先将Utility Matrix中,用户UU的相关项减去平均值以达到正则的目的;然后将处理后的相关项取平均值得到用户UU的画像中,Julia Roberts的值。
推荐系统

基于内容的推荐

给定用户的画像xx、产品的画像ii,计算余弦距离,余弦距离越大,则越应该推荐该产品。
u(x,i)=cos(x,i)=xixiu\left(x,i\right)=cos\left(x,i\right)=\frac{x*i}{||x||*||i||}
总结:

  1. 不需要其他用户的数据
  2. 能够给用户提供个性化的推荐
  3. 能够推荐一些新的不那么流行的产品(item)
  4. 对于新用户无法建立用户画像
  5. 从来不会推荐用户产品画像外的产品
  6. 未结合其他用户来作综合推荐

协同过滤(Collaborative Filtering)

对于用户XX而言,找出与用户XX打分相似的其他用户,然后根据其他用户的打分来估计用户XX对于某些产品(item)的打分。

User-user collaborative filtering

Jaccard距离:在计算距离时,会忽略用户对某个产品的打分,如果该用户对某个产品有打分,则为1;否则,为0
余弦距离:计算距离时,会将用户对未打分的产品的分值置为0
sim(x,y)=cos(rx,ry)=rxryrxrysim\left(x,y\right)=cos\left(r_{x},r_{y}\right)=\frac{r_{x}*r_{y}}{||r_{x}||*||r_{y}||}
Pearson correlation coefficient:sim(x,y)=sSxy(rxsrx)(rysry)sSxy(rxsrx)2sSxy(rysry)2sim\left(x,y\right)=\frac{\sum_{s\in S_{xy}}{\left(r_{xs}-\overline{r_{x}}\right)}\left(r_{ys}-\overline{r_{y}}\right)}{\sqrt{\sum_{s \in S_{xy}}{\left(r_{xs}-\overline{r_{x}}\right)^2}}\sqrt{\sum_{s \in S_{xy}}{\left(r_{ys}-\overline{r_{y}}\right)^2}}}
其中:SxyS_{xy}:用户xx与用户yy均有过打分记录的产品
rx\overline{r_{x}}:用户xx对所有产品打分的均值
推荐系统
预测用户对于某个产品的打分,有以下的一些方法:
rxi=1kyNryir_{xi}=\frac{1}{k}\sum_{y\in N}{r_{yi}}
rxi=yNryisxyyNsxyr_{xi}=\frac{\sum_{y \in N}r_{yi}*s_{xy}}{\sum_{y\in N}s_{xy}}
其中:NN表示与用户xx最为相似的用户的集合
sxy=sim(x,y)s_{xy}=sim\left(x,y\right)

Item-item collaborative filtering

这里讲述的是基于相似用户来估计评分,这里的思路是结合相似的产品来进行评分。

  1. 对于产品(item)ii而言,首先找出与ii最为相似的产品的集合NN
  2. 使用这些相似的产品(item)来估计ii
    rxi=jN(i:x)sijrxjjN(i:x)sijr_{xi}=\frac{\sum_{j \in N\left(i:x\right)}s_{ij}*r_{xj}}{\sum_{j \in N\left(i:x\right)}{s_{ij}}}
    其中:sijs_{ij}:产品(item)iijj的相似性

推荐系统
推荐系统
对于rating的估计,还有以下一种更为常见的方式。
rxi=bxi+jN(i;x)sij(rxjbxj)jN(i;x)sijr_{xi}=b_{xi}+\frac{\sum_{j\in N\left(i;x\right)}s_{ij}*\left(r_{xj}-b_{xj}\right)}{\sum_{j\in N\left(i;x\right)}{s_{ij}}}
其中:bxi=μ+bx+bib_{xi}=\mu+b_{x}+b_{i}
itemitem是电影为例
μ\mu:所有电影的平均打分
bxb_{x}:用户xx对于电影打分的偏差
bib_{i}:电影本身所造成的打分偏差
总结:

  1. 在实际的推荐系统中,item-item的表现效果一般要好于user-user
  2. 在系统中需要足够多的用户来匹配
  3. 不能够推荐之前未被打分的产品
  4. 协同过滤算法往往会推荐一些比较流行的产品,不能提供个性化的推荐

The Netflix Prize Model

前面已经提出了两种常见的推荐算法(基于内容和协同过滤),在这一节,将结合上述提到的推荐算法讲述其在实际场景中的应用。

Modeling Local & Global Effects

对于某个用户对于某部电影的打分,可以分成以下几个部分来看待:1、电影的平均分;2、电影自身的效应;3、用户本身的效应;4、该用户和该电影之间难以预测的效应。例如,电影的平均分为3.7,电影自身的效应为0.5,用户的效应为-0.2,所以可以得到该用户对于电影的baseline为4.0。最后结合该用户不喜欢该电影(-0.2),所以该用户对于该电影的打分为3.8
rxi=bxi+jN(i;x)sij(rxjbxj)jN(i;x)sijr_{xi}=b_{xi}+\frac{\sum_{j\in N\left(i;x\right)}s_{ij}*\left(r_{xj}-b_{xj}\right)}{\sum_{j\in N\left(i;x\right)}{s_{ij}}}
其中:bxi=μ+bx+bib_{xi}=\mu+b_{x}+b_{i}
在上述定义中,权重的是由sijs_{ij}代替,但由于用户之间并不是相互独立的,所以是存在一些问题的,所以将上述定义改写成下面的形式。
rxi=bxi+jN(i;x)wij(rxjbxj)r_{xi}=b_{xi}+\sum_{j\in N\left(i;x\right)}{w_{ij}\left(r_{xj}-b_{xj}\right)}
其中:bxi=μ+bx+bib_{xi}=\mu+b_{x}+b_{i}
wijw_{ij}表示itemitem iijj之间的联系
RMSE=1R(i,x)R(rxirxi)2RMSE=\frac{1}{|R|}\sqrt{\sum_{\left(i,x\right)\in R}{\left(r_{xi}-\overline{r_{xi}}\right)^2}}
SSE=(i,x)R(rxirxi)2SSE=\sum_{\left(i,x\right)\in R}{\left(r_{xi}-\overline{r_{xi}}\right)^2}
可知RMSERMSESSESSE两者的效果是一致的,为了达到求解wijw_{ij},使用梯度下降法来求解。
J(w)=xi(bxi+j(i;x)wij(rxjbxj)rxi)2J\left(w\right)=\sum_{xi}{\left(b_{xi}+\sum_{j\in \left(i;x\right)}{w_{ij}\left(r_{xj}-b_{xj} \right)}-r_{xi}\right)^2}
wJ=J(w)wij=2x,i(bxi+kN(i;x)wik(rxkbxk)rxi)(rxjbxj)\nabla_wJ=\frac{\partial J\left(w\right)}{\partial w_{ij}}=2\sum_{x,i}{\left(b_{xi}+\sum_{k\in N\left(i;x\right)}{w_{ik}\left(r_{xk}-b_{xk}\right)}-r_{xi}\right)\left(r_{xj}-b_{xj}\right)}

潜在因素模型(Latent Factor Models )

推荐系统
不难发现,将其按照两个坐标轴来看待,横坐标表示性别,纵坐标表示严肃或活泼与否,每个人会处在坐标轴中的某个位置。结合SVD分解,来发现其中的潜在因素。
推荐系统
现在想要达到的目标:mini,xR(rxiqipx)2min\sum_{i,x\in R}{\left(r_{xi}-q_{i}*p_{x}\right)^2}。在这里,并不要求矩阵PPQQ的列向量的相互正交的,PP表示的是用户与潜在因素间的矩阵,QQ表示的是电影与潜在因素间的矩阵。

UV分解

由于部分地方表述不清,可以参见其他博客方便理解。
协同过滤推荐算法详解
关于Netflix Prize的总结