利用 SVD 实现协同过滤推荐算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用 SVD 实现协同过滤推荐算法相关的知识,希望对你有一定的参考价值。

参考技术A

奇异值分解(Singular Value Decomposition,以下简称SVD)
是在机器学习领域广泛应用的算法,它不光可以用于 降维算法中的特征分解 ,还可以用于 推荐系统 ,以及自然语言处理等领域。

优点: 简化数据,去除噪声,提高算法的结果。
缺点: 数据的转换可能难以理解。

应用领域: 推荐引擎(协同过滤、相似度计算)、图像压缩等。

SVD定义: 如果我们求出了矩阵A的n个特征值λ1≤λ2≤...≤λn,以及这n个特征值所对应的特征向量w1,w2,...wn,如果这n个特征向量线性无关,那么矩阵A就可以用下式的特征分解表示:A=WΣW−1,其中W是这n个特征向量所张成的n×n维矩阵,而Σ为这n个特征值为主对角线的n×n维矩阵。一般我们会把W的这n个特征向量标准化,即满足||wi||2=1, 或者wiTwi=1,此时W的n个特征向量为标准正交基,满WTW=I,即WT=W−1, 也就是说W为酉矩阵。要进行特征分解,矩阵A必须为方阵。那么如果A不是方阵,则用到SVD。

矩阵A的SVD为:A=UΣVT,其中U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵,即满足UTU=I,VTV=I。

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。

因此SVD 也是一种强大的降维工具 ,可以利用 SVD 来逼近矩阵并从中获得主要的特征。通过保留矩阵的 80%~90% 的能量,就可以得到重用的特征并去除噪声。

推荐系统 是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程。
主要有以下几种推荐算法:
基于内容的推荐(用到自然语言处理), 协同过滤(主流) ,基于规则推荐(基于最多用户点击,最多用户浏览等),混合推荐(类似集成算法,投票决定),基于人口统计信息的推荐(根据用户基本信息)

协同过滤推荐分为三种类型。 第一种是基于用户(user-based)的协同过滤(需要在线找用户和用户之间的相似度关系),第二种是基于项目(item-based)的协同过滤(基于项目的协同过滤可以离线找物品和物品之间的相似度关系), 第三种是基于模型(model based)的协同过滤(用户和物品,主流)。

一般在推荐系统中,数据往往是使用 用户-物品 矩阵来表示的。 用户对其接触过的物品进行评分,评分表示了用户对于物品的喜爱程度,分数越高,表示用户越喜欢这个物品。而这个矩阵往往是稀疏的,空白项是用户还未接触到的物品,推荐系统的任务则是选择其中的部分物品推荐给用户。

对于这个 用户-物品 矩阵,用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。

具体基于模型的方法有:
用关联算法做协同过滤(Apriori算法、FP Tree算法)
用聚类算法做协同过滤(针对基于用户或者基于模型,Kmeans,DBSCAN)
用分类算法做协同过滤(设定评分阈值,高于推荐,低于不推荐,逻辑回归和朴素贝叶斯,解释性很强)
用回归算法做协同过滤(Ridge回归,回归树)
用矩阵分解做协同过滤(由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而用户物品评分矩阵是一个典型的稀疏矩阵,主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。这些算法和传统SVD的最大区别是不再要求将矩阵分解为UΣVT的形式,而变是两个低秩矩阵PTQ的乘积形式。)
用神经网络做协同过滤(限制玻尔兹曼机RBM)

在 Python 的 numpy 中,linalg已经实现了SVD

ML之CF:基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例

ML之CF:基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例

目录

基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例

 # 1、定义数据集

# 3、模型训练与推理

# 3.1、切分数据集:将数据集分为训练集和测试集

# 3.2、文本数据集再处理

# 构建用户-电影评分矩阵

# 3.3、计算用户之间的相似度:余弦相似度

# 3.4、模型评估:计算准确率和召回率

# 3.5、模型推理:为用户1推荐电影


相关文章
ML之CF:基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例
ML之CF:基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例实现代码

基于MovieLens电影评分数据集利用基于用户协同过滤算法(余弦相似度)实现对用户进行Top5电影推荐案例

 # 1、定义数据集

userIdmovieIdratingtimestamp
114964982703
134964981247
164964982224
1475964983815
1505964982931
1703964982400
11015964980868
11104964982176
11515964984041
11575964984100

movieIdtitlegenres
1Toy Story (1995)Adventure|Animation|Children|Comedy|Fantasy
2Jumanji (1995)Adventure|Children|Fantasy
3Grumpier Old Men (1995)Comedy|Romance
4Waiting to Exhale (1995)Comedy|Drama|Romance
5Father of the Bride Part II (1995)Comedy
6Heat (1995)Action|Crime|Thriller
7Sabrina (1995)Comedy|Romance
8Tom and Huck (1995)Adventure|Children
9Sudden Death (1995)Action
10GoldenEye (1995)Action|Adventure|Thriller
11American President, The (1995)Comedy|Drama|Romance
        userId  movieId  rating   timestamp
0            1        1     4.0   964982703
1            1        3     4.0   964981247
2            1        6     4.0   964982224
3            1       47     5.0   964983815
4            1       50     5.0   964982931
...        ...      ...     ...         ...
100831     610   166534     4.0  1493848402
100832     610   168248     5.0  1493850091
100833     610   168250     5.0  1494273047
100834     610   168252     5.0  1493846352
100835     610   170875     3.0  1493846415

[100836 rows x 4 columns]

# 3、模型训练与推理

# 3.1、切分数据集:将数据集分为训练集和测试集

# 3.2、文本数据集再处理

# 构建用户-电影评分矩阵

train_matrix 
 movieId  1       2       3       4       ...  193583  193585  193587  193609
userId                                   ...                                
1           4.0     NaN     4.0     NaN  ...     NaN     NaN     NaN     NaN
2           NaN     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
3           NaN     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
4           NaN     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
5           NaN     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
...         ...     ...     ...     ...  ...     ...     ...     ...     ...
606         2.5     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
607         4.0     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
608         2.5     2.0     NaN     NaN  ...     NaN     NaN     NaN     NaN
609         3.0     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN
610         NaN     NaN     NaN     NaN  ...     NaN     NaN     NaN     NaN

[610 rows x 8975 columns]

# 3.3、计算用户之间的相似度:余弦相似度

user_similarity 
 userId 1   2   3   4   5   6   7   8   9    ... 602 603 604 605 606 607 608 609 610
userId                                      ...                                    
1        1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
2        1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
3        1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
4        1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
5        1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
...     ..  ..  ..  ..  ..  ..  ..  ..  ..  ...  ..  ..  ..  ..  ..  ..  ..  ..  ..
606      1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
607      1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
608      1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
609      1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1
610      1   1   1   1   1   1   1   1   1  ...   1   1   1   1   1   1   1   1   1

[610 rows x 610 columns]

# 3.4、模型评估:计算准确率和召回率

     userId  movieId  rating
618     408   138036     5.0
123       1     2459     5.0
650     409     1234     5.0
162       1     3273     5.0
163       1     3386     5.0
precision: 0.026973684210526316
recall: 0.004065846886156287

# 3.5、模型推理:为用户1推荐电影

     userId  movieId  rating
618     408   138036     5.0
123       1     2459     5.0
650     409     1234     5.0
162       1     3273     5.0
163       1     3386     5.0
precision: 0.026973684210526316
recall: 0.004065846886156287
     userId  movieId  rating
460     405    32587     5.0
715     409     3814     5.0
286     410     3855     5.0
288     410     3910     5.0
487     406    56949     5.0

以上是关于利用 SVD 实现协同过滤推荐算法的主要内容,如果未能解决你的问题,请参考以下文章

基于协同过滤的推荐算法与代码实现

基于学习排序的并行协同过滤推荐算法

协同过滤推荐算法

推荐算法:协同过滤中的 交替最小二乘法

抖音头条为什么这么火?揭秘推荐系统原理之协同过滤算法

基于物品的协同过滤