当前位置:   article > 正文

python协同过滤算法实现电影推荐(附源码)_协同过滤算法python代码

协同过滤算法python代码

数据集请点赞收藏关注后评论区留言并且私信博主要 

本例中使用得是著名得电影数据集MovieLens-100数据集

MoviesLens数据集是实现和测试电影推荐最常用得数据集之一,包含943个用户为精选得1682部电影给出得100000个电影评分

主要文件如下1:u.data 2:u.item 3:u.user

1:查看用户/电影排名信息得代码如下

  1. import pandas as pd
  2. heads=['user_id','item_id','rating','timestamp']
  3. ratings=pd.read_csv(r'u.data',sep='\t',names=heads)
  4. print(ratings)
  5. print("用户数量",len(ratings))

 2:查看导入的电影数据表

 代码如下

  1. import pandas as pd
  2. u_cols=['user_id','age','sex','occupation','zip_code']
  3. users=pd.read_csv(r'u.data',sep='|',names=u_cols,encoding='latin-1')
  4. print(users)
  5. r_cols=['user_id','movie_id','rating','unix_timestamp']
  6. ratings=pd.read_csv(r'u.data',sep='\t',names=r_cols,encoding='latin-1')
  7. print(ratings)
  8. m_cols=['movie_id','title','release_data','video_release_data','imdb_url']
  9. movies=pd.read_csv(r'u.item',sep='|',names=m_cols,usecols=range(5),encoding='latin-1')
  10. print(movies)

 3:用协同过滤推荐算法进行电影推荐

 

 误差评估如下

全部代码如下 

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.metrics.pairwise import pairwise_distances
  4. np.set_printoptions(suppress=True) # 取消科学计数法输出
  5. pd.set_option('display.max_rows', None) # 展示所有行
  6. pd.set_option('display.max_columns', None) # 展示所有列
  7. def predict(scoredata,similarity,type='user'):
  8. #基于物品得推荐
  9. if type=='item':
  10. predt_mat=scoredata.dot(similarity)/np.array([np.abs(similarity).sum(axis=1)])
  11. elif type=='user':
  12. #计算用户评分值 减少用户评分高低习惯影响
  13. user_meanscorse=scoredata.mean(axis=1)
  14. score_diff=(scoredata-user_meanscorse.reshape(-1,1))
  15. predt_mat=user_meanscorse.reshape(-1,1)+similarity.dot(score_diff)/np.array([np.abs(similarity).sum(axis=1)]).T
  16. return predt_mat
  17. #读取数据
  18. print('step 1 读取数据')
  19. r_cols=['user_id','movie_id','rating','unix_timestamp']
  20. scoredata=pd.read_csv(r'u.data',sep='\t',names=r_cols,encoding='latin-1')
  21. print('数据形状',scoredata.shape)
  22. #生成用户-物品评分矩阵
  23. print('step2 生成 用户物品评分矩阵')
  24. n_users=943
  25. n_items=1682
  26. data_matrix=np.zeros((n_users,n_items))
  27. for line in range(np.shape(scoredata)[0]):
  28. row=scoredata['user_id'][line]-1
  29. col=scoredata['movie_id'][line]-1
  30. score=scoredata['rating'][line]
  31. data_matrix[row,col]=score
  32. print('用户物品矩阵形状',data_matrix.shape)
  33. #计算相似度
  34. print('step3 计算相似度')
  35. user_similaritry=pairwise_distances(data_matrix,metric='cosine')
  36. item_similarity=pairwise_distances(data_matrix.T,metric='cosine')
  37. print('user similarity',user_similaritry.shape)
  38. print('item similartity',item_similarity.shape)
  39. #进行相似度进行预测
  40. print('step4 预测')
  41. user_prediction=predict(data_matrix,user_similaritry,type='user')
  42. item_perdiction=predict(data_matrix,item_similarity,type='item')
  43. #显示推荐结果
  44. print('step 5 显示推荐结果')
  45. print('----------------')
  46. print('ubcf预测形状',user_prediction.shape)
  47. print('real answer\n',data_matrix[:5,5])
  48. print('预测结果\n',user_prediction)
  49. print('ibcf预测形状',item_perdiction.shape)
  50. print('real answer\n',data_matrix[:5,:5])
  51. print('预测结果\n',item_perdiction)
  52. #性能评估
  53. print('step 6 性能评估')
  54. from sklearn.metrics import mean_squared_error
  55. from math import sqrt
  56. def rmse(predct,realNum):
  57. predct=predct[realNum.nonzero()].flatten()
  58. realNum=realNum[realNum.nonzero()].flatten()
  59. return sqrt(mean_squared_error(predct,realNum))
  60. print('u-base mse=',str(rmse(user_prediction,data_matrix)))
  61. print('m-based mse=',str(rmse(item_perdiction,data_matrix)))

数据集请点赞收藏关注后私信博主要 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/198569
推荐阅读
相关标签
  

闽ICP备14008679号