原文在这里自己写Python
写的非常好,很受启发

下一步是做出预测。你已经创建了相似性矩阵:user_similarity和item_similarity,因此,你可以通过为基于用户的CF应用下面的公式做出预测:

你可以将用户k和a之间的相似性看成权重,它乘以相似用户a (校正的平均评分用户)的评分。你需要规范化该值,使打分位于1到5之间,最后,对你尝试预测的用户的平均评分求和。

这里的想法是,某些用户可能会倾向于对所有的电影,总是给予高或低评分。这些用户提供的评分的相对差比绝对评分值更重要。举个例子:假设,用户k对他最喜欢的电影打4星,而对所有其他的好电影打3星。现在假设另一个用户t对他/她喜欢的电影打5星,而对他/她感到无聊的电影打3星。那么这两个用户可能品味非常相似,但对打分系统区别对待。

# encoding=utf-8
import numpy as np
import pandas as pd
header=['user_id','item_id','rating','timestamp']
df=pd.read_csv('E:\\dataset\\ml-100k\\ml-100k\\u.data',sep='\t',names=header)
n_users = df.user_id.unique().shape[0]
n_items = df.item_id.unique().shape[0]
print 'Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items)
from sklearn import cross_validation as cv
train_data, test_data = cv.train_test_split(df, test_size=0.1)
'''第一步是创建用户-产品矩阵。由于你既有测试数据,又有训练数据,那么你需要创建两个矩阵。'''
train_data_matrix = np.zeros((n_users, n_items))
for line in train_data.itertuples():train_data_matrix[line[1]-1, line[2]-1] = line[3]test_data_matrix = np.zeros((n_users, n_items))
for line in test_data.itertuples():test_data_matrix[line[1]-1, line[2]-1] = line[3]
from sklearn.metrics.pairwise import pairwise_distancesuser_similarity = pairwise_distances(train_data_matrix, metric='cosine')
item_similarity = pairwise_distances(train_data_matrix.T, metric='cosine')
print user_similarity
print item_similarity
'''from sklearn.cluster import KMeans
model=KMeans(n_clusters=3)
train_cluster=model.fit(user_similarity)
print train_cluster.cluster_centers_'''
def predict(ratings, similarity,type='user'):#评分矩阵,相似度,类型对象if type=='user':mean_user_rating=ratings.mean(axis=1)#求出用户打分的均值,axis=0表示纵向列取平均值,axis=1表示横向行上求和取均值print "========ratings==========="print ratingsprint "========mean_user_rating==========="print len(mean_user_rating)ratings_diff = (ratings - mean_user_rating[:, np.newaxis])#用户实际评分与他平均评分的差值pred_user = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) / np.array([np.abs(similarity).sum(axis=1)]).T#其中similarity.dot(ratings_diff)是相似度乘上用预测差值,全部使用矩阵print "======用户预测=========="print pred_user[134:135]return pred_userelif type == 'item':#如果是计算项目的相似度预测评分pred_item = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])print "======项目预测=========="print pred_item[134:135]return pred_itemuser_prediction = predict(train_data_matrix, user_similarity, type='user')
item_prediction = predict(train_data_matrix, item_similarity, type='item')
print "======用户预测2=========="
print user_prediction[134:135]from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from math import sqrt
def rmse(prediction, ground_truth):prediction = prediction[ground_truth.nonzero()].flatten()ground_truth = ground_truth[ground_truth.nonzero()].flatten()return sqrt(mean_squared_error(prediction, ground_truth))
print 'User-based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix))
print 'Item-based CF RMSE: ' + str(rmse(item_prediction, test_data_matrix))
def mae(prediction, ground_truth):prediction = prediction[ground_truth.nonzero()].flatten()ground_truth = ground_truth[ground_truth.nonzero()].flatten()return mean_absolute_error(prediction, ground_truth)
print 'User-based CF MAE: ' + str(mae(user_prediction, test_data_matrix))
print 'Item-based CF MAE: ' + str(mae(item_prediction, test_data_matrix))

结果:
Number of users = 943 | Number of movies = 1682
[[ 0.00000000e+00 8.95630250e-01 9.72756397e-01 …, 8.60862780e-01
8.14111912e-01 6.48358820e-01]
[ 8.95630250e-01 0.00000000e+00 9.06897686e-01 …, 8.88742401e-01
8.17974917e-01 9.00341777e-01]
[ 9.72756397e-01 9.06897686e-01 -2.22044605e-16 …, 8.86459080e-01
9.20561034e-01 1.00000000e+00]
‘’‘’‘’

========ratings===========
[[ 5. 0. 4. …, 0. 0. 0.]
[ 0. 0. 0. …, 0. 0. 0.]
[ 0. 0. 0. …, 0. 0. 0.]
…,
[ 5. 0. 0. …, 0. 0. 0.]
[ 0. 0. 0. …, 0. 0. 0.]
[ 0. 5. 0. …, 0. 0. 0.]]
========mean_user_rating===========
943
======用户预测==========
[[ 1.52954421 0.24836017 0.15464074 …, -0.0879848 -0.08752703
-0.08758209]]
======项目预测==========
[[ 0.07952868 0.08000635 0.08850828 …, 0.10135055 0.09788366
0.0972341 ]]
======用户预测2==========
[[ 1.52954421 0.24836017 0.15464074 …, -0.0879848 -0.08752703
-0.08758209]]
User-based CF RMSE: 3.01963228799
Item-based CF RMSE: 3.41041357693
User-based CF MAE: 2.81176080559
Item-based CF MAE: 3.20818123812
可以看到MAE很大,效果不咋滴啊
但是大概的思路明白了,使用矩阵的方法比较简单

Python CF入门实验相关推荐

  1. python 编程入门-实验一 Python程序设计入门

    学号20184307 2019-2020-2 <Python程序设计>实验1报告 课程:<Python程序设计> 班级: 1843 姓名: 章森洋 学号:20184307 实验 ...

  2. python基础教程是什么语言-0编程基础,什么语言也没学过,请问学Python怎样入门?...

    其实Python入门并不难,只要你有足够的自信心,明确学习目标,循序渐进就能不断享受到python带给你创新的乐趣. 大家为什么要学习python呢? 1.python简单易学 python的优势就是 ...

  3. python程序设计报告-20192404 实验一 《Python程序设计》实验报告

    学号 20192404 <Python程序设计>实验一报告 课程:<Python程序设计> 班级: 1924 姓名: 贾智博 学号:20192404 实验教师:王志强 实验日期 ...

  4. python程序设计报告-20192116 实验一《Python程序设计》实验报告

    课程:<Python程序设计> 班级: 1921 姓名: 饶欢 学号:20192116 实验教师:王志强 实验日期:2020年4月11日 必修/选修: 公选课 1.实验内容 1.熟悉Pyt ...

  5. Python爬虫入门(4):Urllib库的高级用法

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  6. 贪吃蛇程序设计报告python_20192116 2019-2020-2 《Python程序设计》实验四报告

    20192116 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1921 姓名: 饶欢 学号:20192116 实验教师: ...

  7. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  8. office高级应用与python综合案例教程_office高级应用与python综合案例实验指导--详细介绍...

    随着社会经济的发展,现代信息技术逐渐改变着人们的工作和生活方式.为使学生掌握办公自动化软件高级应用的技能,了解Python程序基础知识,综合运用办公自动化软件分析和解决实际问题,编者编写了本书. 本书 ...

  9. 【python教程入门学习】学python要多久,0基础学python有多难

    学python要多久,0基础学python有多难,这是很多想学习python语言同学绕不开的问题,都害怕花完钱最终没有应有的回报!对于毫无经验0基础的同学来说学习python什么最重要,方向选对坚持下 ...

最新文章

  1. html焦点试图代码,HTML DOM focus()用法及代码示例
  2. Java 一组温度从摄氏到华氏的转换
  3. 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
  4. BOOST_PP_IS_EMPTY宏相关的测试程序
  5. Hadoop伪分布安装详解(一)
  6. 小甲鱼python课后题简书_Python练习题100道
  7. 14年,50%市场份额,一家中国公司何以在丹麦成功?
  8. linux syslog详解-------未测试
  9. [SinGuLaRiTy] 二分图匈牙利算法
  10. 《设计原本—计算机科学巨匠Frederick P. Brooks的反思》一一第 2 章 工程师怎样进行设计思维―理性模型 2.0...
  11. 注册电气工程师有多难考呢?注册电气工程师通过率是多少
  12. Cobar介绍及配置
  13. SNF开发平台-SNF.CodeGenerator-升级生成BS页面代码-支持视图-数据库配置-快速开发者的利器...
  14. rows是横着的还是cols_rows和cols到底哪个是列哪个是行
  15. java正则表达式多行匹配,正则表达式多行匹配 - Wangle_OP的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. Maximum Profit(C++最大利益简单算法)
  17. oracle数据库的scn,Oracle数据库SCN详解
  18. 这几年已经组织开发或者即将开发我的或与我有关的第7个薪资管理系统、第5个人事管理系统,从中你觉得啥才真正值钱?...
  19. 如何祛痘?美丽时光小编分享自己的战痘经历
  20. 信创操作系统--麒麟Kylin桌面版(项目六 文档处理:输入法、WPS、文本编辑器)

热门文章

  1. Unity 光照阴影烘焙
  2. Javascript错误处理——try...catch
  3. Fabric.js 图形标注
  4. 神经网络与卷积神经网络,神经网络层数的确定
  5. 【生成PDF】Java如何根据前台Echarts图表生成PDF,并下载
  6. fgetc, fgetchar 的区别
  7. “封转开”行情或再现 低仓位封基现套利机会
  8. 目标公司--软件测试--jd补充
  9. 系统辨识和自适应控制
  10. 菜鸟haqima的Java学习之路第一天