协同过滤算法

目录

1.协同过滤算法的原理

2.相似度的计算

3.具体Python实现


1.协同过滤算法的原理

​ 根据用户群体对产品偏好的数据,发现用户之间的相似性或者物品之间的相似性,并基于这些相似性为用户作推荐。

  • 基于用户的协同过滤算法(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。

2.相似度的计算

​ 无论是基于用户还是基于物品的协同过滤算法,其本质都是寻找数据之间的相似度。本节介绍计算相似度的三种常见方法:

  • 欧式距离

$$ \Large \sqrt{\sum_{i=1}^n{(X_i^{(a)}-X_i^{(b)})}^2} $$

  • 余弦相似度

​ 使用两向量夹角θ的余弦值cosθ来表示两个向量的相似度,称为余弦相似度。余弦相似度的范围是:[-1,1],夹角越小,余弦值越接近于1,两个向量越靠近,两者越相似。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。

余弦相似度公式为: $$ \Large cos\theta = \frac{<a,b>}{|| a|||| b||} $$​ 其中,<a,b>表示的是向量a和向量b的内积,||a||和||b||分别表示向量a和向量b的模(长度)。

例如,向量a=(X1,Y1),向量b=(X2,Y2),代入余弦相似度公式可以得到: $$ cos\theta = \frac{X_1X_2+Y_1Y_2}{\sqrt{X_1^2+Y_1^2}*\sqrt{X_2^2+Y_2^2}} $$​ 可以将其推广至n维向量空间:

​ 若向量a=(X1,X2,X3,...,Xn),向量b=(Y1,Y2,Y3,...,Yn),其夹角的余弦值(余弦相似度)可以表示为:

$$ cos\theta = \frac{x_1y_1+x_2y_2+x_3y_3+...+x_ny_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}} $$

  • 皮尔逊相关系数

​ 皮尔逊相关系数r是用来描述两个数值型变量间线性相关强弱程度的统计量,r的绝对值越大表明相关性越强。r取值范围为[-1,1],为正代表两个变量存在正相关,为负代表两个变量存在负相关,r=0,说明两个变量之间无线性相关关系。要计算变量X与Y的皮尔逊相关系数,其计算公式如下:

$$ \Large r=\frac{Cov(X,Y)}{S_XS_Y} $$ 其中SX和SY分别为变量X和变量Y的标准差,COV(X,Y)为变量X和变量Y的协方差。

3.具体Python实现
  • 欧式距离的Python实现

利用numpy库的norm可以间接地计算两个向量的欧氏距离

import pandas as pd
df = pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns=['用户1', '用户2', '用户3'], index=['物品A', '物品B', '物品C'])
import numpy as np
dist = np.linalg.norm(df.iloc[0] - df.iloc[1])
  • 余弦相似度的Python实现

通过sklearn的cosine_similarity函数实现余弦相似度的计算

import pandas as pd
df = pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns=['用户1', '用户2', '用户3'], index=['物品A', '物品B', '物品C'])
from sklearn.metrics.pairwise import cosine_similarity
# 对两两样本之间(此处是物品之间)做余弦相似度矩阵
item_similarity = cosine_similarity(df)
pd.DataFrame(item_similarity, columns=['物品A', '物品B', '物品C'], index=['物品A', '物品B', '物品C'])
  • 皮尔逊相关系数的Python实现

通过scipy库中的pearsonr函数实现皮尔逊相关系数的计算

只需给它两个数组或列表(X,Y),它就能返回两个数值(r,P):

相关系数r值在[-1,1]之间,为正数则表示正相关,负数则表示负相关,绝对值越大相关性越高;

P值是显著性,与皮尔逊相关显著性检验有关,P<0.05时表示相关显著,即指变量X和Y之间真的存在相关性,而不是因为偶然因素引起的。

from scipy.stats import pearsonr
X = [1, 3, 5, 7, 9]
Y = [9, 8, 6, 4, 2]
corr = pearsonr(X, Y)
print("皮尔逊相关系数r的值为:",corr[0],"显著性水平P值为:",corr[1])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值