前言
搭建智能推荐系统的算法有很多,其中商业实战中用的较多的为协同过滤(collaborative filtering)。
一、协同过滤算法的原理
根据用户群体对产品偏好的数据,发现用户之间的相似性或者物品之间的相似性,并基于这些相似性为用户作推荐。
- 基于用户的协同过滤算法(User-based Collaborative Filtering)
其本质是:寻找相似的用户,进而对用户推荐相似用户关注的产品。
如下表所示,用户1和用户2都给商品A,B,C打了高分,那么可以将用户1和用户2划分在同一个用户群体,此时若用户2还给商品D打了高分,那么就可以将商品D推荐给用户1。
- 基于物品的协同过滤算法(Item-based Collaborative Filtering)
其本质是:根据用户的历史偏好信息,将类似的物品推荐给用户
如下表所示,图书A和图书B都被用户1,2,3购买过(1表示购买,0表示未购买),那么可以认为图书A和图书B具有较强的相似度,即可判断喜欢图书A的用户同样也会喜欢图书B。当用户4购买图书B时,根据图书A和图书B的相似性,可将图书A推荐给用户4。
在商业实战中,大多应用场景偏向于使用基于物品的协同过滤算法。主要有如下两个原因:
原因一:通常用户的数量是非常庞大的(如淘宝数亿的用户群体),而物品的数量相对有限,因此计算不同物品之间的相似度往往比计算不同用户的相似度容易很多。
原因二:用户的喜好较为多变,而物品属性较明确不随时间变化,过去用户对物品的评分长期有效,所以物品间的相似度比较固定,因此可以预先离线计算好物品间的相似度,把结果存在表中,向客户进行推荐时再使用。
二、相似度计算的常用方法
欧氏距离
∑ i = 1 n ( X i ( a ) − X i ( b ) ) 2 \Large \sqrt{\sum_{i=1}^n{(X_i^{(a)}-X_i^{(b)})}^2} i=1∑n(Xi(a)−Xi(b))2
余弦相似度
使用两向量夹角θ的余弦值cosθ来表示两个向量的相似度,称为余弦相似度。余弦相似度的范围是:[-1,1],夹角越小,余弦值越接近于1,两个向量越靠近,两者越相似。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。
余弦相似度公式为:
c
o
s
θ
=
<
a
,
b
>
∣
∣
a
∣
∣
∣
∣
b
∣
∣
\Large cos\theta = \frac{<a,b>}{|| a|||| b||}
cosθ=∣∣a∣∣∣∣b∣∣<a,b>
其中,<a,b>表示的是向量a和向量b的内积,||a||和||b||分别表示向量a和向量b的模(长度)。
例如,向量a=(X1,Y1),向量b=(X2,Y2),代入余弦相似度公式可以得到:
c
o
s
θ
=
X
1
∗
X
2
+
Y
1
∗
Y
2
X
1
2
+
Y
1
2
∗
X
2
2
+
Y
2
2
cos\theta = \frac{X_1*X_2+Y_1*Y_2}{\sqrt{X_1^2+Y_1^2}*\sqrt{X_2^2+Y_2^2}}
cosθ=X12+Y12∗X22+Y22X1∗X2+Y1∗Y2
可以将其推广至n维向量空间:
若向量a=(X1,X2,X3,…,Xn),向量b=(Y1,Y2,Y3,…,Yn),其夹角的余弦值(余弦相似度)可以表示为:
c
o
s
θ
=
x
1
∗
y
1
+
x
2
∗
y
2
+
x
3
∗
y
3
+
.
.
.
+
x
n
∗
y
n
x
1
2
+
x
2
2
+
x
3
2
+
.
.
.
+
x
n
2
∗
y
1
2
+
y
2
2
+
y
3
2
+
.
.
.
+
y
n
2
cos\theta = \frac{x_1*y_1+x_2*y_2+x_3*y_3+...+x_n*y_n}{\sqrt{x_1^2+x_2^2+x_3^2+...+x_n^2}*\sqrt{y_1^2+y_2^2+y_3^2+...+y_n^2}}
cosθ=x12+x22+x32+...+xn2∗y12+y22+y32+...+yn2x1∗y1+x2∗y2+x3∗y3+...+xn∗yn
皮尔逊相关系数
皮尔逊相关系数r是用来描述两个数值型变量间线性相关强弱程度的统计量,r的绝对值越大表明相关性越强。r取值范围为[-1,1],为正代表两个变量存在正相关,为负代表两个变量存在负相关,r=0,说明两个变量之间无线性相关关系。要计算变量X与Y的皮尔逊相关系数,其计算公式如下:
r
=
C
o
v
(
X
,
Y
)
S
X
S
Y
\Large r=\frac{Cov(X,Y)}{S_XS_Y}
r=SXSYCov(X,Y)
其中SX和SY分别为变量X和变量Y的标准差,COV(X,Y)为变量X和变量Y的协方差。