SVD
参考 https://www.zybuluo.com/rianusr/note/1195225
1 推荐系统概述
1.1 项目安排
1.2 三大协同过滤
1.3 项目开发工具
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 导入小规模的库数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('ml-100k/u.data',sep='\t',names=['user_id','item_id','rating','timestamp'])
data.head()
3.2 数据探索及发现
# 数据信息查看
data.info()
# 数据描述
data.describe()
data.user_id.nunique() # nunique() --> 返回不重复user_id的个数,统计用户的个数
data.item_id.nunique() # 统计被评价电影的个数
>> 943
>> 1682
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分类聚合
# 统计每个物品对应的用户数
item_id_usercnt = train_data.groupby('item_id').count().user_id
item_id_usercnt[:5]
b. 直方图展示
# 展示分类聚合结果
plt.hist(item_id_usercnt.values)
plt.show()
c. 查看十分位数
# 分别查看每一物品对应的用户的十分位数(十分位数、二十分位数...一百分位数)
item_id_usercnt.quantile(q=np.arange(0,1.1,0.1))
d. 物品对应用户数量数据查看发现
约有30%左右的物品对应的用户数少于10个,对这部分物品计算与其他物品的相似度不会太准确
3.3.2 查看每个用户对应物品的数量
a. 根据user_id分类聚合
# 统计每个用户对应的物品数
user_id_itemcnt = train_data.groupby('user_id').count().item_id
user_id_itemcnt[:5]
b. 直方图展示
# 展示分类聚合结果
plt.hist(user_id_itemcnt.values)
plt.show()
c. 查看十分位数
# 分别查看每一用户对应的物品的十分位数(十分位数、二十分位数...一百分位数)
user_id_itemcnt.quantile(q=np.arange(0,1.1,0.1))
d. 物品对应用户数量数据查看发现
从每个用户对应的物品数量至少为20个的情况来看,基于用户相似度的准确度会比基于物品要好
3.4 构建用户-物品矩阵
3.4.1 获取矩阵行数m、列数n
# 通过nunique()方法分别获得user_id、item_id的去重计数
m_users = train_data.user_id.nunique() #
n_items = train_data.item_id.nunique()
3.4.2 创建一个全是0的m*n的矩阵并向矩阵中填充对应数据
user_item_matrix