使用numpy完成item-cf算法
来源:互联网 发布:百度一下软件 编辑:程序博客网 时间:2024/06/03 06:25
1. Item-cf实现的基本原理
下面以一个实例来展示使用perason相似度计算的item-cf算法
1.1:计算物品相似度(以《寻龙诀》和《小门神》两部电影为例)
Index栏的A,B,C,D,E,F,G为用户,column栏为电影的评分。
距离:A/老炮儿 栏 评分为3.5,即代表A用户对老炮评分为3.5分。
1.2计算Pearson相似度
计算公式:
我们选《寻龙诀》(X)和《小门神》(Y)作为例子,来算一下相似度,则
X=(3.5,5.0,3.0)
Y=(3.0,3.5,2.0)
数字就是评分,因为只有三个人同时看了这两个电影,所以X,Y两个向量都只有三个元素。
求相关系数,这个可以直接通过numpy提供的corrcoef方法计算。
1.3得到相似度表:
相关系数取值为【-1,1】,1表示完全相似,0表示没关系,-1表示完全相反。结合到电影偏好上,如果相关系数为负数,比如《老炮儿》和《唐人街探案》,意思是说,喜欢《老炮儿》的人,存在厌恶《唐人街探案》的倾向。
2. 数据导入MySQL
要实现item-cf,肯定先要将数据导入MySQL,这里使用Navicat for MySQL的导入数据功能(ps:由于实现的是item-cf算法,只需要评论的详细信息,因此仅导入了评论信息,书籍信息使用书籍的id号代替):
设置好格式和字段名后导入结果如下:
3. 利用python实现item-cf算法
3.1得到所需信息的查询
要计算两本书的pearson相似度,需要得到对这两本书都进行过评价的所有用户,以及这些用户对这两本书的评分。
在这里以《火鳳燎原 23》(书id号:3024737)和《火鳳燎原 4》(书id号3024796)为例
可以使用如下语句进行查询得到结果:
SELECT a.author,a.rating,b.rating fromsheet1 a,sheet1 b where a.bookID=3024737 and b.bookID=3024796 and a.uri=b.uriand a.rating <> 0 and b.rating <> 0;
得到的结果为:
(('MajorZiggy',5, 4), ('欧阳杼', 5, 4), ('小肚子✨', 5, 5), ('伽藍紙鳶', 5, 5), ('legolas', 5, 5), ('医遗以癔', 4, 4), ('小八千', 5, 5))
这个tuple中的数据,第一列为评论者,第二列为对《火鳳燎原 23》的评分,第三列为对《火鳳燎原 4》的评分。
整理一下格式后,可以得到两个向量:
[5, 5,5, 5, 5, 4, 5]
[4, 4, 5, 5, 5,4, 5]
分别是不同用户对《火鳳燎原 23》的评分向量和对《火鳳燎原 4》的评分向量
这里有两个注意点:
1. 使用a.uri=b.uri而不用a.name=b.name是因为防止有重名的评论者,所以使用每个评论者独一无二的uri。
2. a.rating<>0和b.rating<>0是因为库中0代表只有评论而没有评分,所以需要去掉。
之后就可以用numpy进行相似度计算了
3.2计算得到两个向量的pearson相似度
之后可以使用Numpy计算两个向量的pearson相似度。
代码如下:
import pymysqlimport numpy as npimport codecsdb=pymysql.connect("localhost","root","","douban",charset='utf8') #连接数据库#查询两本书的评分cursor=db.cursor()cursor.execute("SELECT a.author,a.rating,b.rating from sheet1 a,sheet1 b where a.bookID=3024737 and b.bookID=3024796 and a.uri=b.uri and a.rating <> 0 and b.rating <> 0; ")data=cursor.fetchall()print(data) a=[]b=[]for dat in data: #得到两个向量 a.append(dat[1]) b.append(dat[2])rel=np.corrcoef(a, b) #计算pearson相似度的方法print(rel[0][1]) #pearson相似度file=codecs.open('C:/Users/xuwei/Desktop/corr.txt',mode='a',encoding='utf-8')file.write(str(data))file.close()db.close()
得到这两本书的pearson相似度为0.471404520791
3.3 对所有书计算pearson相似度
运用上述方法,可以对所有书两两计算pearson相似度。
可以采用dict存储某本书与其他所有书的相似度,进行排序后,就可以得到与某本书最相似的书了。代码如下:
import pymysqlimport numpy as npimport codecsf=open("C:/Users/xuwei/Desktop/demo.txt",'r') #读取所有书的id号line=f.readline()list=[]while line: list.append(line.replace('\n','')) line=f.readline()db=pymysql.connect("localhost","root","","douban")for i in list: dict={} for j in list: if i != j: cursor=db.cursor() sql="SELECT a.author,a.rating,b.rating from sheet1 a,sheet1 b where a.bookID={0} and b.bookID={1} and a.uri=b.uri and a.rating <> 0 and b.rating <> 0; ".format(i,j) cursor.execute(sql) data=cursor.fetchall() if len(data)>1: #判断共同评分数量,如果只有一个的话没有办法计算相似度 a=[] b=[] for dat in data: a.append(dat[1]) b.append(dat[2]) rel=np.corrcoef(a, b) #计算相似度 if not np.isnan(rel[0][1]): #判断是否为nan,若不是就存到字典里 dict[j]=rel[0][1] dic=sorted(dict.items(),key=lambda d:d[1],reverse=True) #按相似度由大到小排序 print(dic) file=codecs.open('C:/Users/xuwei/Desktop/corr.txt',mode='a',encoding='utf-8') file.write(i+'\t'+str(dic)+'\n') #写到文件中 file.close() print(i,'write finished')db.close()
- 使用numpy完成item-cf算法
- 基于物品的协同过滤算法(Item-CF)
- 协同过滤user-based CF算法与item-based CF算法对比
- <五>、简单分析基于物品的 CF(Item CF)推荐算法
- item-cf改进
- Python调用C++函数(SWIG,VS2013使用numpy.i完成Numpy与C++数组转换)
- 推荐算法--基于物品协同过滤算法实现(python: Item-CF)
- 使用java完成二分算法
- item-CF item-KNN的区别
- Mahout并行基于物品的协同过滤算法源码分析(Distributed item-based CF)
- 【推荐系统】协同过滤(CF)算法详解,item-base,user-based,SVD,SVD++
- numpy使用
- NumPy使用
- numpy 使用
- numpy使用
- 使用python的numpy库实现PCA算法
- 深度学习算法实践2---线性代数和Numpy的使用
- 深度学习算法实践2---线性代数和Numpy的使用
- 连接池(DBCP和C3P0)
- 控制面板的面板项找不到?
- spark streaming 有趣问题汇总
- 20个高级Java面试题汇总,你要来挑战吗?
- ElasticSearch核心基础之映射
- 使用numpy完成item-cf算法
- 深度学习硬件对比评测:英特尔FPGA和英伟达GPU哪个更好?
- hdfs读写文件核心流程详解巧说
- 数据结构C++作业
- thinkphp5中使用phpmailer实现发送邮件功能 及自己遇到的坑
- CAS in java
- Spring Boot Unit Test
- DA1458x BASS Database的组成结构 -- Battery Service 分析(一)
- Qt--宏