电影推荐系统---协同过滤算法(SVD,NMF)

SVD

参考 https://www.zybuluo.com/rianusr/note/1195225

1 推荐系统概述

01推荐系统概述.png-26.4kB

 

1.1 项目安排

02项目安排.png-42.9kB 
03数据观察.png-30.1kB

 

1.2 三大协同过滤

04基于物品的协同过滤推荐.png-40.5kB05基于用户的协同过滤推荐.png-40.4kB06基于SVD协同过滤推荐.png-32.1kB

 

1.3 项目开发工具

基于SVD协同过滤推荐系统.png-38.1kB

 

2 Movielens数据集简介

  • MovieLens是推荐系统常用的数据集; 
    MovieLens数据集中,用户对自己看过的电影进行评分,分值为1~5; 
    MovieLens包括两个不同大小的库,适用于不同规模的算法; 
    ·小规模的库事943个独立用户对1682部电影做的10000次评分的数据; 
    ·大规模的库事6040个独立用户对3900部电影做的100万次评分的数据;

数据集下载地址:http://files.grouplens.org/datasets/movielens/ml-100k.zip

 

3 数据探索

 

3.1 导入小规模的库数据

 
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. data=pd.read_csv('ml-100k/u.data',sep='\t',names=['user_id','item_id','rating','timestamp'])
  5. data.head()

image_1ch29t0md1oee1nbi1ls8jua1g0nl.png-11.6kB

 

3.2 数据探索及发现

 
  1. # 数据信息查看
  2. data.info()

image_1ch29ug7468d11hp13uf1k2c1dl612.png-12.5kB

 
  1. # 数据描述
  2. data.describe()

image_1ch2a07k11v2o1osk11o4mij1r9s1f.png-24.4kB

 
  1. data.user_id.nunique() # nunique() --> 返回不重复user_id的个数,统计用户的个数
  2. data.item_id.nunique() # 统计被评价电影的个数
>> 943
>> 1682
 
  1. data.duplicated(subset=['user_id','item_id']).sum() # 查看user_id与item_id是否有重复的情况
>> 0

从导入的数据可以看出,user_id共有943个,item_id共有1682个,与数据对于的user_id及item_id的编号刚好是1~943和1~1682,可见数据已经清洗好的,不需要重新处理 
然后将数据集拆分为训练集和测试集,分别进行处理 
且user_id与item_id均不存在重复的情况,数据可以直接使用。

 

3.3 数据检查

 
3.3.1 查看每个物品对应用户的数量
 
a. 根据item_id分类聚合
 
  1. # 统计每个物品对应的用户数
  2. item_id_usercnt = train_data.groupby('item_id').count().user_id
  3. item_id_usercnt[:5]

image_1ch2ae5eamae1s89pmt1oq51q2v1s.png-5.1kB

 
b. 直方图展示
 
  1. # 展示分类聚合结果
  2. plt.hist(item_id_usercnt.values)
  3. plt.show()

image_1ch2ag9v5aiht0d1fd713gscl329.png-13.8kB

 
c. 查看十分位数
 
  1. # 分别查看每一物品对应的用户的十分位数(十分位数、二十分位数...一百分位数)
  2. item_id_usercnt.quantile(q=np.arange(0,1.1,0.1))

image_1ch2ai6blqin1kiudd5p65vum2m.png-8.4kB

 
d. 物品对应用户数量数据查看发现

约有30%左右的物品对应的用户数少于10个,对这部分物品计算与其他物品的相似度不会太准确

 
3.3.2 查看每个用户对应物品的数量
 
a. 根据user_id分类聚合
 
  1. # 统计每个用户对应的物品数
  2. user_id_itemcnt = train_data.groupby('user_id').count().item_id
  3. user_id_itemcnt[:5]

image_1ch2chhe811241a288qi3fmjbc3g.png-5.1kB

 
b. 直方图展示
 
  1. # 展示分类聚合结果
  2. plt.hist(user_id_itemcnt.values)
  3. plt.show()

image_1ch2aqhaifp31nhc1llj1djmb1j33.png-12.2kB

 
c. 查看十分位数
 
  1. # 分别查看每一用户对应的物品的十分位数(十分位数、二十分位数...一百分位数)
  2. user_id_itemcnt.quantile(q=np.arange(0,1.1,0.1))

image_1ch2cjcu6hsq1879ll898eem3t.png-8.5kB

 
d. 物品对应用户数量数据查看发现

从每个用户对应的物品数量至少为20个的情况来看,基于用户相似度的准确度会比基于物品要好

 

3.4 构建用户-物品矩阵

 
3.4.1 获取矩阵行数m、列数n
 
  1. # 通过nunique()方法分别获得user_id、item_id的去重计数
  2. m_users = train_data.user_id.nunique() #
  3. n_items = train_data.item_id.nunique()
 
3.4.2 创建一个全是0的m*n的矩阵并向矩阵中填充对应数据
 
  1. user_item_matrix
  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值