使用皮尔逊相关系数实现推荐系统
1. 什么是皮尔逊相关系数?
皮尔逊相关系数(Pearson Correlation Coefficient)是一种常用的统计量,用来衡量两个变量之间的线性相关性。它的取值范围是从 -1 到 1:
- 1 表示完全正相关:两个变量同时增大或同时减小。
- -1 表示完全负相关:一个变量增大,另一个变量减小。
- 0 表示不相关:两个变量之间没有明显的线性关系。
在推荐系统中,皮尔逊相关系数通常用于物品-物品协同过滤(item-based collaborative filtering),用于衡量两个物品的相似度。通过对用户评分数据的分析,可以根据用户对相似物品的评分来推荐他们可能感兴趣的其他物品。
2. 皮尔逊相关系数公式
对于两个变量 X X X 和 Y Y Y,皮尔逊相关系数的计算公式如下:
r
=
∑
(
X
−
X
ˉ
)
(
Y
−
Y
ˉ
)
∑
(
X
−
X
ˉ
)
2
∑
(
Y
−
Y
ˉ
)
2
r = \frac{\sum (X - \bar{X})(Y - \bar{Y})}{\sqrt{\sum (X - \bar{X})^2} \sqrt{\sum (Y - \bar{Y})^2}}
r=∑(X−Xˉ)2∑(Y−Yˉ)2∑(X−Xˉ)(Y−Yˉ)
其中:
- X X X 和 Y Y Y 是两个变量(在推荐系统中,通常是两个物品的用户评分)。
- X ˉ \bar{X} Xˉ 和 Y ˉ \bar{Y} Yˉ 是 X X X 和 Y Y Y 的均值。
通过计算物品之间的相关性,我们可以找到与某个物品最相似的其他物品,从而为用户进行推荐。
3. 皮尔逊相关系数在推荐系统中的应用
在基于物品的协同过滤推荐系统中,皮尔逊相关系数常用于衡量两个物品的相似度。假设有一个用户-物品评分矩阵,如下所示:
用户ID | 电影A | 电影B | 电影C |
---|---|---|---|
用户1 | 5 | 3 | 2 |
用户2 | 4 | 2 | 3 |
用户3 | 3 | 1 | 5 |
用户4 | 4 | 2 | 3 |
用户5 | 5 | 3 | 1 |
如果我们想要为某个用户推荐与电影A相似的电影,可以通过计算电影A与其他电影的皮尔逊相关系数,找到最相似的电影。
4. 计算皮尔逊相关系数的步骤
我们以计算电影A和电影B之间的相似度为例,来介绍如何计算皮尔逊相关系数:
1. 提取电影A和电影B的评分:
用户ID | 电影A | 电影B |
---|---|---|
用户1 | 5 | 3 |
用户2 | 4 | 2 |
用户3 | 3 | 1 |
用户4 | 4 | 2 |
用户5 | 5 | 3 |
2. 计算电影A和电影B的均值:
- 电影A的平均评分: ( 5 + 4 + 3 + 4 + 5 ) / 5 = 4.2 (5 + 4 + 3 + 4 + 5) / 5 = 4.2 (5+4+3+4+5)/5=4.2
- 电影B的平均评分: ( 3 + 2 + 1 + 2 + 3 ) / 5 = 2.2 (3 + 2 + 1 + 2 + 3) / 5 = 2.2 (3+2+1+2+3)/5=2.2
3. 计算偏离均值后的评分:
用户ID | 电影A的偏离值( X − X ˉ X - \bar{X} X−Xˉ) | 电影B的偏离值( Y − Y ˉ Y - \bar{Y} Y−Yˉ) |
---|---|---|
用户1 | 5 − 4.2 = 0.8 5 - 4.2 = 0.8 5−4.2=0.8 | 3 − 2.2 = 0.8 3 - 2.2 = 0.8 3−2.2=0.8 |
用户2 | 4 − 4.2 = − 0.2 4 - 4.2 = -0.2 4−4.2=−0.2 | 2 − 2.2 = − 0.2 2 - 2.2 = -0.2 2−2.2=−0.2 |
用户3 | 3 − 4.2 = − 1.2 3 - 4.2 = -1.2 3−4.2=−1.2 | 1 − 2.2 = − 1.2 1 - 2.2 = -1.2 1−2.2=−1.2 |
用户4 | 4 − 4.2 = − 0.2 4 - 4.2 = -0.2 4−4.2=−0.2 | 2 − 2.2 = − 0.2 2 - 2.2 = -0.2 2−2.2=−0.2 |
用户5 | 5 − 4.2 = 0.8 5 - 4.2 = 0.8 5−4.2=0.8 | 3 − 2.2 = 0.8 3 - 2.2 = 0.8 3−2.2=0.8 |
4. 计算皮尔逊相关系数:
-
计算分子:
( 0.8 × 0.8 ) + ( − 0.2 × − 0.2 ) + ( − 1.2 × − 1.2 ) + ( − 0.2 × − 0.2 ) + ( 0.8 × 0.8 ) = 2.8 (0.8 \times 0.8) + (-0.2 \times -0.2) + (-1.2 \times -1.2) + (-0.2 \times -0.2) + (0.8 \times 0.8) = 2.8 (0.8×0.8)+(−0.2×−0.2)+(−1.2×−1.2)+(−0.2×−0.2)+(0.8×0.8)=2.8 -
计算电影A和电影B的偏离平方和的平方根:
0. 8 2 + ( − 0.2 ) 2 + ( − 1.2 ) 2 + ( − 0.2 ) 2 + 0. 8 2 = 2.8 ≈ 1.673 \sqrt{0.8^2 + (-0.2)^2 + (-1.2)^2 + (-0.2)^2 + 0.8^2} = \sqrt{2.8} \approx 1.673 0.82+(−0.2)2+(−1.2)2+(−0.2)2+0.82=2.8≈1.673 -
皮尔逊相关系数为:
r = 2.8 1.673 × 1.673 = 2.8 2.8 = 1.0 r = \frac{2.8}{1.673 \times 1.673} = \frac{2.8}{2.8} = 1.0 r=1.673×1.6732.8=2.82.8=1.0
这表示电影A和电影B之间的评分完全正相关,相关系数为1.0,因此用户对这两部电影的评分模式非常相似。
5. 计算电影A和电影C的皮尔逊相关系数
接下来,我们继续计算电影A和电影C之间的皮尔逊相关系数。
1. 提取电影A和电影C的评分:
用户ID | 电影A | 电影C |
---|---|---|
用户1 | 5 | 2 |
用户2 | 4 | 3 |
用户3 | 3 | 5 |
用户4 | 4 | 3 |
用户5 | 5 | 1 |
2. 计算电影A和电影C的均值:
- 电影A的平均评分: ( 5 + 4 + 3 + 4 + 5 ) / 5 = 4.2 (5 + 4 + 3 + 4 + 5) / 5 = 4.2 (5+4+3+4+5)/5=4.2
- 电影C的平均评分: ( 2 + 3 + 5 + 3 + 1 ) / 5 = 2.8 (2 + 3 + 5 + 3 + 1) / 5 = 2.8 (2+3+5+3+1)/5=2.8
3. 计算偏离均值后的评分:
用户ID | 电影A的偏离值( X − X ˉ X - \bar{X} X−Xˉ) | 电影C的偏离值( Y − Y ˉ Y - \bar{Y} Y−Yˉ) |
---|---|---|
用户1 | 5 − 4.2 = 0.8 5 - 4.2 = 0.8 5−4.2=0.8 | 2 − 2.8 = − 0.8 2 - 2.8 = -0.8 2−2.8=−0.8 |
用户2 | 4 − 4.2 = − 0.2 4 - 4.2 = -0.2 4−4.2=−0.2 | 3 − 2.8 = 0.2 3 - 2.8 = 0.2 3−2.8=0.2 |
用户3 | 3 − 4.2 = − 1.2 3 - 4.2 = -1.2 3−4.2=−1.2 | 5 − 2.8 = 2.2 5 - 2.8 = 2.2 5−2.8=2.2 |
用户4 | 4 − 4.2 = − 0.2 4 - 4.2 = -0.2 4−4.2=−0.2 | 3 − 2.8 = 0.2 3 - 2.8 = 0.2 3−2.8=0.2 |
用户5 | 5 − 4.2 = 0.8 5 - 4.2 = 0.8 5−4.2=0.8 | 1 − 2.8 = − 1.8 1 - 2.8 = -1.8 1−2.8=−1.8 |
4. 计算皮尔逊相关系数:
-
计算分子:
( 0.8 × − 0.8 ) + ( − 0.2 × 0.2 ) + ( − 1.2 × 2.2 ) + ( − 0.2 × 0.2 ) + ( 0.8 × − 1.8 ) = − 0.64 − 0.04 − 2.64 − 0.04 − 1.44 = − 4.8 (0.8 \times -0.8) + (-0.2 \times 0.2) + (-1.2 \times 2.2) + (-0.2 \times 0.2) + (0.8 \times -1.8) = -0.64 - 0.04 - 2.64 - 0.04 - 1.44 = -4.8 (0.8×−0.8)+(−0.2×0.2)+(−1.2×2.2)+(−0.2×0.2)+(0.8×−1.8)=−0.64−0.04−2.64−0.04−1.44=−4.8 -
计算电影A和电影C的偏离平方和的平方根:
-
对于电影A:
0. 8 2 + ( − 0.2 ) 2 + ( − 1.2 ) 2 + ( − 0.2 ) 2 + 0. 8 2 = 2.8 ≈ 1.673 \sqrt{0.8^2 + (-0.2)^2 + (-1.2)^2 + (-0.2)^2 + 0.8^2} = \sqrt{2.8} \approx 1.673 0.82+(−0.2)2+(−1.2)2+(−0.2)2+0.82=2.8≈1.673 -
对于电影C:
( − 0.8 ) 2 + 0. 2 2 + 2. 2 2 + 0. 2 2 + ( − 1.8 ) 2 = 8.32 ≈ 2.884 \sqrt{(-0.8)^2 + 0.2^2 + 2.2^2 + 0.2^2 + (-1.8)^2} = \sqrt{8.32} \approx 2.884 (−0.8)2+0.22+2.22+0.22+(−1.8)2=8.32≈2.884
-
-
皮尔逊相关系数为:
r = − 4.8 1.673 × 2.884 = − 4.8 4.825 ≈ − 0.995 r = \frac{-4.8}{1.673 \times 2.884} = \frac{-4.8}{4.825} \approx -0.995 r=1.673×2.884−4.8=4.825−4.8≈−0.995
这表示电影A和电影C之间的评分呈现出强负相关,相关系数接近 -1.0。因此,用户对这两部电影的评分模式是完全相反的。
6. 使用 Pandas 计算皮尔逊相关系数
在实际应用中,推荐系统通常会有大量的用户和物品数据。我们可以使用 Pandas 的 corr()
函数快速计算皮尔逊相关系数。以下是一个示例代码:
import pandas as pd
# 创建用户-物品评分矩阵
data = {
'userId': [1, 2, 3, 4, 5],
'movieA': [5, 4, 3, 4, 5],
'movieB': [3, 2, 1, 2, 3],
'movieC': [2, 3, 5, 3, 1]
}
df = pd.DataFrame(data)
# 计算电影A和电影B的皮尔逊相关系数
correlation_AB = df['movieA'].corr(df['movieB'], method='pearson')
print(f"电影A和电影B的皮尔逊相关系数: {correlation_AB}")
# 计算电影A和电影C的皮尔逊相关系数
correlation_AC = df['movieA'].corr(df['movieC'], method='pearson')
print(f"电影A和电影C的皮尔逊相关系数: {correlation_AC}")
输出结果:
电影A和电影B的皮尔逊相关系数: 1.0
电影A和电影C的皮尔逊相关系数: -0.995
通过上述代码,我们可以快速计算电影A和电影B、电影A和电影C之间的相似度,进而为用户推荐与其评分高的电影类似或不同的电影。
7. 结论
皮尔逊相关系数是一种有效的工具,可以帮助推荐系统找到相似的物品。在基于物品的协同过滤中,通过计算物品之间的相关系数,可以为用户推荐与他们喜好相似或不相似的物品。结合 Pandas 和其他数据分析工具,皮尔逊相关系数可以快速、准确地应用于大规模推荐系统中。