完整过程 !!! 的 推荐系统评分预测——SVD与UserCF

注重版权,若要转载烦请附上作者和链接

作者: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=ruir^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,ieui2=u,i(ruik=1Kpukqki)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 } ) pukSSE=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 } pukSSE=puk(eui2)=2euipukeui=2euiqki

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joshua_yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值