当前位置: 首页 > 后端技术 > Python

推荐系统入门笔记4:item-based推荐算法的实现

时间:2023-03-26 01:26:13 Python

1.实现思路准备测试数据计算item相似度,使用jaccard计算相似度得到每个item对应的相似item,得到最终的推荐数据2.代码实现1.准备测试数据users=['User1','User2','User3','User4','User5',]items=['ItemA','ItemB','ItemC','ItemD','ItemE']数据集=[[1,0,1,1,0],[1,0,0,1,1],[1,0,1,0,0],[0,1,0,1,1],[1,1,1,0,1],]df=pd.DataFrame(datasets,columns=items,index=users)2.计算项目相似度items_similar=1-pairwise_distances(df.values.T,metric='jaccard')items_similar=pd.DataFrame(items_similar,columns=项目,索引=项目)3。获取每一项对应的相似项topN_items={}foriinitems_similar.index:_df=items_similar.loc[i].drop([i])_df_sorted=_df.sort_values(ascending=False)topN_items[i]=list(_df_sorted[:2].index)print(topN_items)运行结果{'ItemA':['ItemC','ItemE'],'ItemB':['ItemE','ItemD'],'ItemC':['ItemA','ItemB'],'ItemD':['ItemE','ItemA'],'ItemE':['ItemB','ItemD']}4.获取df.index中user的最后一条推荐数据rs_results={}:user_item=df.loc[user].replace(0,np.nan).dropna().indexrs_result=set()foriteminuser_item:rs_result=rs_result.union(topN_items[item])rs_result-=set(df.loc[user].replace(0,np.nan).dropna().index)rs_results[user]=rs_resultprint(rs_results)推荐结果{'User1':{'ItemB','ItemE'},'User2':{'ItemB','ItemC'},'User3':{'ItemB','ItemE'},'User4':{'ItemA'},'User5':{'ItemD'}}完整代码importpandasaspdfromsklearn.metricsimportjaccard_scorefromsklearn.metrics.pairwiseimportpairwise_distancesimportnumpyasnpusers=['User1','User2','User3','User4','User5',]items=['ItemA','ItemB','ItemC','ItemD','ItemE']数据集=[[1,0,1,1,0],[1,0,0,1,1],[1,0,1,0,0],[0,1,0,1,1],[1,1,1,0,1],]df=pd.DataFrame(datasets,columns=items,index=users)#print(df)items_similar=1-pairwise_distances(df.values.T,metric='jaccard')items_similar=pd.DataFrame(items_similar,columns=items,index=items)topN_items={}foriinitems_similar.index:_df=items_similar.loc[i].drop([i])_df_sorted=_df.sort_values(ascending=False)topN_items[i]=list(_df_sorted[:2].index)print(topN_items)rs_results={}对于df.index中的用户:user_item=df.loc[user].replace(0,np.nan).dropna().indexrs_result=set()对于user_item中的项目:rs_result=rs_result.union(topN_items[item])rs_result-=set(df.loc[user].replace(0,np.nan).dropna().index)rs_results[user]=rs_resultprint(rs_results){'User1':{'ItemB','ItemE'},'User2':{'ItemB','ItemC'},'User3':{'ItemB','ItemE'},'User4':{'ItemA'},'User5':{'ItemD'}}