推荐算法是计算机专业中的一种算法.就是利用用户的一些行为,通过一些数学算法,推测出用户可能喜欢的东西.
图片展角度:
Collaborative filtering,即协同过滤,最早于1989年提出,直到21世纪才得到产业性的应用。
在微软1998年的关于协同过滤的论文(1)中,将协同过滤分成了两个流派:
(1) 关于Memory-Based的算法
就是利用用户在系统中的操作记录来生成相关的推荐结果的一种方法,主要也分成两种方法:
实验结果也表明,Item-Based的做法比User-Based更有效2。
对于Memory-Based算法,主要有两个步骤 :
(2) 对于Model-Based的算法
使用机器学习中的一些建模算法,在线下对于模型进行预计算,在线上能够快速得出结果。主要使用的算法有:
(3) 最近几年又提出一种新的分类,content-based,是对于item的内容进行分析,从而进行推荐.
(4) 而现阶段,比较优秀的一些应用算法,则是将以上几种方法混合使用.
比较说Google News[3],在它的系统中,使用了一种将Memory-Based与Model-Based两种方法混合的算法来处理。在Google的那篇论文里面,它提到了如何构建一个大型的推荐系统,其中Google的一些高效的基础架构如:BigTable,MapReduce等得到很好的应用.
(5) 对于大多数的项目而言,推荐系统都不可避免地面临以下几个问题[6]:
度量向量之间的相似度方法很多,可以用距离(各种距离)的倒数,向量夹角,Pearson相关系数等
什么是jaccard?
杰卡德相似系数(Jaccard similarity coefficient),也称杰卡德指数(Jaccard Index),是用来衡量两个集合相似度的一种指标。Jaccard相似指数用来度量两个集合之间的相似性,它被定义为两个集合交集的元素个数除以并集的元素个数。
什么是余弦相似度?
余弦相似度,又称为余弦相似性.通过计算两个向量的夹角余弦值来评估他们的相似度.将向量根据坐标值绘制到向量空间中.如最常见的二维空间.求得他们的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征这两个向量的相似性.夹角越小.余弦值越接近于1,它们的方向更加吻合,则越相似.余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越趋近于0,他们的方向更加一致.相应的相似度也越高.最常见的应用就是计算文本相似度.
对于二维空间根据向量点积公式:
\[cos\theta = \frac{a \cdot b}{\parallel a \parallel \parallel b \parallel}\]
假设向量\(a\), \(b\)的坐标分别为\((x_1,y_1)\), \((x_2,y_2)\):
\[cos\theta = \frac{x_1 x_2 + y_1 y_2}{\sqrt{x_1^{2}+y_1^{2}} \times \sqrt{x_2^{2}+y_2^{2}}}\]
假设向量\(a\), \(b\)的坐标分别为\((x_1,x_2, \ldots, x_n)\), \((y_1, y_2, \ldots , y_n)\):
\[cos\theta = \frac{\sum_{1}^{n}(x_i \times y_i)}{\sqrt{\sum^{n}_{1}x_i^{2}} + \sqrt{\sum_{1}^{n}y_i^{2}}}\]
Pearson相关系数:
\begin{equation} \rho_{X,Y}=\frac{cov(X,Y)}{\sigma_{x}\sigma_{y}}=\frac{E((X-\mu_x)(Y-\mu_y))}{\sigma_{x}\sigma_{y}} \end{equation}因为:
\[\mu_{x} = E(X),\] \[\sigma^2_{x} = E(X-\mu_x)^2=E(X^2)-E^2(X)\]
所以Pearson相关系数还可以写成下面形式:
\begin{equation} \rho_{X,Y}=\frac{E(XY)-E(X)E(Y)}{\sqrt{E(X^2)-E^2(X)}\sqrt{E(Y^2)-E^2(Y)}} \end{equation}说明:
| User & Item | \(item_{1}\) | \(\ldots\) | \(item_{n}\) |
|---|---|---|---|
| \(user_{1}\) | \(r_{1,1}\) | \(\ldots\) | \(r_{1,n}\) |
| \(\vdots\) | \(\vdots\) | \(r_{i,j}\) | \(\vdots\) |
| \(user_{m}\) | \(r_{1,m}\) | \(\ldots\) | \(r_{m,n}\) |
(0) 符号说明
(1) 基本思想:
当一个用户 u 需要个性化推荐时, 可以先找到和他兴趣相似的用户群体 U , 然后把 U 喜欢的、并且 u 没有听说过的物品推荐给 u
(2) 两个步骤:
or
(3) 目的:
(3) 发现目标用户兴趣相似的用户集合(群体)
假设:
用户评分数据向量:
\[ \left\{\begin{array}{ll} U_1=(r_{1,1},r_{1,2}, ..., r_{1,n})\\ U_2=(r_{2,1},r_{2,2}, ..., r_{2,n})\\ \ldots\\ U_i=(r_{i,1},r_{i,2}, ..., r_{i,n})\\ \ldots\\ U_j=(r_{j,1},r_{j,2}, ..., r_{j,n})\\ \ldots\\ U_m=(r_{m,1},r_{m,2}, ..., r_{m,n}) \end{array}\right. \]
计算用户 \(x\) 和 \(y\) 之间的相似度:
\[Similarity(x, y) = \frac{|I_{x} \cap I_{y}|}{|I_{x} \cup I_{y}|}\]
\[Similarity(x, y) = \frac{|I_{x} \cap I_{y}|}{\sqrt{|I_{x}| \times |I_{y}|}}\]
利用上面的相似度度量, 可以计算出所有用户之间的相似度. 得到用户相似度矩阵.
(4) 推荐物品
\[r_{u, i} = \sum_{v \in S(u, k) \cap I_{i}}Simlarity(u, v) \times r_{v, i}\]
其中:\(r_{v, i}\)表示用户\(v\) 对\(i\)的喜欢程度, \(v\)为除去目标用户的其他用户. 在一些需要用户给予评分的推荐系统中,则要代入用户评分。在真实的推荐系统中,只要按\(p(u,i)\)得分排序,取前几个物品就可以了.
\begin{equation} r_{u,i}=\bar{r}_{u}+z\sum_{u'\in{U}}{sim(u,u')(r_{u',i}-\bar{r}_{u'})} \end{equation}其中:\(z\)是归一化因子, \(z=\frac{1}{\sum_{u'\in{U}}{sim(u,u')}}\)
说明:
这个预测方法充分考虑了用户一向的评分习惯是偏高还是偏低,因为用户\(u\)的近邻对\(u\)产生影响时已经减去了各自的平均值。 计算用户\(U_{1}\)和\(U_{2}\)的相似度时并不是去拿原始的评分向量去计算,而是只关注他们的评交集\(I_{x,y}\),这是因为一个用户只对很少的物品有过评分,这样用户评分向量是个高度稀疏的向量,采用Pearson相关系数计算两个用户的相似度时很不准。
物品得分数据向量:
\[ \left\{\begin{array}{ll} I_1=(r_{1,1},r_{2,1}, ..., r_{n,1})\\ I_2=(r_{1,2},r_{2,2}, ..., r_{n,2})\\ \ldots\\ I_i=(r_{1,i},r_{2,i}, ..., r_{n,i})\\ \ldots\\ I_j=(r_{1,j},r_{2,j}, ..., r_{n,j})\\ \ldots\\ I_m=(r_{1,m},r_{2,m}, ..., r_{n,m}) \end{array}\right. \]
目的:
假设:
数据向量变换:
每一项减去各个用户评分的均值:
\[ \left\{\begin{array}{ll} I_1=(r_{1,1}-\bar{r}_{1}, r_{2,1}-\bar{r}_{2}, ... , r_{m,1}-\bar{r}_{m})\\ I_2=(r_{1,2}-\bar{r}_{1}, r_{2,2}-\bar{r}_{2}, ... , r_{m,2}-\bar{r}_{m})\\ \ldots\\ I_a=(r_{1,a}-\bar{r}_{1}, r_{2,a}-\bar{r}_{2}, ... , r_{m,a}-\bar{r}_{m})\\ \ldots\\ I_b=(r_{1,b}-\bar{r}_{1}, r_{2,b}-\bar{r}_{2}, ... , r_{m,b}-\bar{r}_{m})\\ \ldots\\ I_m=(r_{1,n}-\bar{r}_{1}, r_{2,m}-\bar{r}_{2}, ... , r_{m,n}-\bar{r}_{m}) \end{array}\right. \]
用户为\(x\), 商品\(i\)和\(j\)间的相似度采用余弦距离计算:
\begin{equation} sim(i,j)=\frac{\sum_x{(r_{x,i}-\bar{r}_{x})(r_{x,j}-\bar{r}_{x})}}{\sqrt{\sum_x{(r_{x,i}-\bar{r}_{x})^2}\sum_x{(r_{x,j}-\bar{r}_{x})^2}}} \end{equation}结论:
\begin{equation} r_{u,i}=\frac{\sum_{i'\in{N}}{sim(i,i')r_{u,i'}}}{\sum_{i'\in{N}}{sim(i,i')}} \end{equation}其中: \(N\)是商品\(i\)的近邻。
说明:
由于物品之间的相似度比较稳定,可以离线先算好,定期更新即可。在电商行业这种算法用的比较多。
所谓的混合算法,主体思路还是基于用户的协同过滤,只是在计算两个用户的相似度时又嵌套了item-based CF思想。
度量用户\(i\)和用户\(j\)相似度更好的方法是: