<div style="font-size:16px;">
<p>SVD</p>
<p>1 推荐系统概述</p>
<p>1.1 项目安排</p>
<p>1.2 三大协同过滤</p>
<p>1.3 项目开发工具</p>
<p>2 Movielens数据集简介</p>
<p>MovieLens是推荐系统常用的数据集;</p>
<p>MovieLens数据集中,用户对自己看过的电影进行评分,分值为1~5;</p>
<p>MovieLens包括两个不同大小的库,适用于不同规模的算法;</p>
<p>·小规模的库事943个独立用户对1682部电影做的10000次评分的数据;</p>
<p>·大规模的库事6040个独立用户对3900部电影做的100万次评分的数据;</p>
<p>3 数据探索</p>
<p>3.1 导入小规模的库数据</p>
<p>importnumpy asnp</p>
<p>importpandas aspd</p>
<p>importmatplotlib.pyplot asplt</p>
<p>data=pd.read_csv('ml-100k/u.data',sep='\t',names=['user_id','item_id','rating','timestamp'])</p>
<p>data.head()</p>
<p>3.2 数据探索及发现</p>
<p># 数据信息查看</p>
<p>data.info()</p>
<p># 数据描述</p>
<p>data.describe()</p>
<p>data.user_id.nunique()# nunique() --> 返回不重复user_id的个数,统计用户的个数</p>
<p>data.item_id.nunique()# 统计被评价电影的个数</p>
<p>>> 943</p>
<p>>> 1682</p>
<p>data.duplicated(subset=['user_id','item_id']).sum()# 查看user_id与item_id是否有重复的情况</p>
<p>>> 0</p>
<p>从导入的数据可以看出,user_id共有943个,item_id共有1682个,与数据对于的user_id及item_id的编号刚好是1~943和1~1682,可见数据已经清洗好的,不需要重新处理</p>
<p>然后将数据集拆分为训练集和测试集,分别进行处理</p>
<p>且user_id与item_id均不存在重复的情况,数据可以直接使用。</p>
<p>3.3 数据检查</p>
<p>3.3.1 查看每个物品对应用户的数量</p>
<p>a. 根据item_id分类聚合</p>
<p># 统计每个物品对应的用户数</p>
<p>item_id_usercnt =train_data.groupby('item_id').count().user_id</p>
<p>item_id_usercnt[:5]</p>
<p>b. 直方图展示</p>
<p># 展示分类聚合结果</p>
<p>plt.hist(item_id_usercnt.values)</p>
<p>plt.show()</p>
<p>c. 查看十分位数</p>
<p># 分别查看每一物品对应的用户的十分位数(十分位数、二十分位数...一百分位数)</p>
<p>item_id_usercnt.quantile(q=np.arange(0,1.1,0.1))</p>
<p>d. 物品对应用户数量数据查看发现</p>
<p>约有30%左右的物品对应的用户数少于10个,对这部分物品计算与其他物品的相似度不会太准确</p>
<p>3.3.2 查看每个用户对应物品的数量</p>
<p>a. 根据user_id分类聚合</p>
<p># 统计每个用户对应的物品数</p>
<p>user_id_itemcnt =train_data.groupby('user_id').count().item_id</p>
<p>user_id_itemcnt[:5]</p>
<p>b. 直方图展示</p>
<p># 展示分类聚合结果</p>
<p>plt.hist(user_id_itemcnt.values)</p>
<p>plt.show()</p>
<p>c. 查看十分位数</p>
<p># 分别查看每一用户对应的物品的十分位数(十分位数、二十分位数...一百分位数)</p>
<p>user_id_itemcnt.quantile(q=np.arange(0,1.1,0.1))</p>
<p>d. 物品对应用户数量数据查看发现</p>
<p>从每个用户对应的物品数量至少为20个的情况来看,基于用户相似度的准确度会比基于物品要好</p>
<p>3.4 构建用户-物品矩阵</p>
<p>3.4.1 获取矩阵行数m、列数n</p>
<p># 通过nunique()方法分别获得user_id、item_id的去重计数</p>
<p>m_users =train_data.user_id.nunique()#</p>
<p>n_items =train_data.item_id.nunique()</p>
<p>3.4.2 创建一个全是0的m*n的矩阵并向矩阵中填充对应数据</p>
<p>user_item_matrix =np.zeros((m_users,n_items))# 创建一个全是0的m*n的矩阵</p>
<p>'''</p>
<p>itertuples() 将每一行转换为对应的元组,且数据一一对应</p>
<p>for line in data.head().itertuples():</p>
<p>print(line)</p>
<p>>> Pandas(Index=0, user_id=196, item_id=242, rating=3, timestamp=881250949)</p>
<p>>> Pandas(Index=1, user_id=186, item_id=302, rating=3, timestamp=891717742)</p>
<p>>> Pandas(Index=2, user_id=22, item_id=377, rating=1, timestamp=878887116)</p>
<p>>> Pandas(Index=3, user_id=244, item_id=51, rating=2, timestamp=880606923)</p>
<p>>> Pandas(Index=4, user_id=166, item_id=346, rating=1, timestamp=886397596)</p>
<p>'''</p>
<p>forline indata.itertuples():</p>
<p>user_item_matrix[line[1]-1,line[2]-1]=line[3]</p>
<p>'''</p>
<p>因为user_id 和 item_id都是从1开始编号的,而矩阵的索引是从零开始</p>
<p>data数据的第二列为user_id,第三列为item_id,第三列则为对应user对item的评分</p>
<p>'''</p>
<p>user_item_matrix #展示一下用户物品矩阵</p>
<p>3.4.3 查看用户-物品矩阵的稀疏性</p>
<p># 统计矩阵中非0值的个数与矩阵总元素个数的比值,保留3位小数</p>
<p>sparsity =round(len(user_item_matrix.nonzero()[1])/float(m_users*n_items),3)</p>
<p>sparsity</p>
<p>>> 0.063</p>
<p>发现:用户- |
|