注重版权,若要转载烦请附上作者和链接
作者:Joshua_yi
链接:https://blog.csdn.net/weixin_44984664/article/details/106874505
文章目录
说明:完整代码与数据集均可在我的github获取
https://github.com/Joshua-li-yi/recommendation_system
此blog仅为菜鸡小编的一次大数据计算与应用课程作业,若有不正确的地方,或有待改进的点,还请大佬们指正🙏🙏🙏
一、问题描述
利用所学算法预测出测试集中每位用户对于给定商品的打分值,并对于预测结果进行误差分析
二、环境介绍
1、 语言:Python
2、 项目管理工具:git
4、Python运行环境:google colab
,,surprise
,
三、数据集基础分析
1、数据集说明及格式:
train.txt 用于训练模型
<user id>|<numbers of rating items>
<item id> <score>
test.txt 用于验证模型
<user id>|<numbers of rating items>
<item id>
itemAttribute.txt 用于训练模型(可选)
<item id>|<attribute_1>|<attribute_2>('None' means this item is not belong to any of attribute_1/2)
2、数据集统计信息
(1)训练集
用户数量:19835
商品数量:455309
评分数量:5001507
min|max item id:0|6249600
min|max user id:0|19834
min|max rating score: 0|100
(2)测试集
用户数量:19835
min|max item id:34|624958
min|max user id:0|19834
待评价数量:119010
(3)商品集
商品数量:507172
min|max item id: 0|624960
min|max attribute1: 0|624934
min|max attribute2: 0|624951
mean attribute1: 288394.873765
mean attribute2: 272492.800332
std attribute1: 193840.412811
std attribute2: 197227.095516
attribute1 none: 42240
attribute2 none: 63485
商品属性两个都为None的数量:117789
四、实验原理
1、SVD算法
存在一个评分矩阵A,每行代表一个user,每列代表一个item,其中的元素表示user对item的打分,空表示user未对item打分,也就是我们需要预测的值,可以知道,矩阵A是一个极其稀疏的矩阵。 矩阵A可分解为矩阵乘积:
R U × I = P U × K Q K × I R _ { U \times I } = P _ { U \times K } Q _ { K \times I } RU×I=PU×KQK×I
U表示用户数,I表示商品数。然后就是利用R中的已知评分训练P和Q使得P和Q相乘的结果最好地拟合已知的评分,那么未知的评分也就可以用P的某一行乘上Q的某一列得到了:
r ^ u i = p u T q i \hat { r } _ { u i } = p _ { u } ^ { T } q _ { i } r^ui=puTqi
这是预测用户u对商品i的评分,它等于P矩阵的第u行乘上Q矩阵的第i列。这时需要通过已知评分训练得到P和Q的具体数值,假设已知的评分为: r u i r _ { u i } rui
则真实值与预测值的误差为:
e u i = r u i − r ^ u i e _ { u i } = r _ { u i } - \hat { r } _ { u i } eui=rui−r^ui
继而可以计算出总的误差平方和:
S S E = ∑ u , i e u i 2 = ∑ u , i ( r u i − ∑ k = 1 K p u k q k i ) 2 SSE = \sum _ { u , i } e _ { u i } ^ { 2 } = \sum _ { u , i } ( r _ { u i } - \sum _ { k = 1 } ^ { K } p _ { u k } q _ { k i } ) ^ { 2 } SSE=u,i∑eui2=u,i∑(rui−k=1∑Kpukqki)2
只要通过训练把SSE降到最小,那么P、Q就能最好地拟合R了。 利用梯度下降法可以求得SSE在Puk变量(也就是P矩阵的第u行第k列的值)处的梯度:
∂ ∂ p u k S S E = ∂ ∂ p u k ( e u i 2 ) \frac { \partial } { \partial p _ { u k } } S S E = \frac { \partial } { \partial p _ { u k } } ( e _ { u i } ^ { 2 } ) ∂puk∂SSE=∂puk∂(eui2)
求导后有:
∂ ∂ p u k S S E = ∂ ∂ p u k ( e u i 2 ) = 2 e u i ∂ ∂ p u k e u i = − 2 e u i q k i \frac { \partial } { \partial p _ { u k } } S S E = \frac { \partial } { \partial p _ { u k } } ( e _ { u i } ^ { 2 } ) = 2 e _ { u i } \frac { \partial } { \partial p _ { u k } } e _ { u i } = - 2 e _ { u i } q _ { k i } ∂puk∂SSE=∂puk∂(eui2)=2eui∂puk∂eui=−2euiqki