自我学习。
目前的弊端在于看了大量文献后却没有相应的代码实战过程,导致很难对论文完全理解。
这是非常基础的基于用户的协同过滤的推荐过程,在这个代码中,数据量是很小的,但是代码的过程很全面,新手可以很好的从这出发,熟悉协同过滤的实操过程。
代码来源于在b站的学习,视频网页https://www.bilibili.com/video/BV1uE411K7WQ?t=2099,视频名字叫Python3.7 构建协同过滤推荐系统,博主名字是刘悦的技术博客,讲的很清楚。
数据由于很少,可以自己输入txt,然后打开。
如下图:
每一类的数据含义是 ‘用户序号,手机品牌型号,评分’。所以数据里一共有三个用户,每个用户有三条评分。
会自己在python里修改txt内容的也可以自己直接在python里输入
#读取数据集
content=[]
with open('D:\LenovoQMDownload\代码学习\协同过滤\phone.txt') as fp:
content=fp.readlines()
print(content)
data结果如下?
#格式化数据集
data={}
for line in content: #循环
line=line.strip().replace('\n','').split(',')#每一行去一下空格,将\n用replace去掉,再按逗号分隔
#把数据塞到data里
if not line[0] in data.keys():
data[line[0]]={line[1]:line[2]}#如果里面的数据没有出现在keys里,那直接用用户id,可读性高点,从下标1直接赋给下标2
else:
data[line[0]][line[1]]=line[2]#否则直接往里塞
print(data)
#计算用户相似度,这里是推荐的核心
from math import *
def Euclid(user1,user2):#计算用户1和用户2 的相似度
#去除两个用户都购买过的手机
user1_data=data[user1]
user2_data=data[user2]
#设置默认距离0
distance=0#距离越小相似度越大
#遍历,找到都购买过的手机
for key in user1_data.keys(): #在user1的key里面遍历
if key in user2_data.keys(): #如果它的某一个key在user2里找到了,说明他们本身是相似的,所以距离应该相加
distance+=pow(float(user1_data[key])-float(user2_data[key]),2)#这里用到欧几里得公式,用pow方法,用user1的值-user2的值,并转为浮点
return 1/(1+sqrt(distance)) #返回时注意颠倒一下,因为距离越小,相似度越高
#测试一下,以用户1 和用户2 为例
print(Euclid('1','2'))
#因为用户1和用户2都买了诺基亚,所以他们两相似度较高,合理(值越低,相似度越高)
?结果:
#测试一下,用户1和用户3
print(Euclid('1','3'))
#两者完全没有买过一样的,相似度没有,为1,合理
?结果:
#计算某个用户和其他用户相似对比对
def top_simliar(user):
res=[]
for userid in data.keys():
#首先排除当前用户
if not userid==user:
simliar=Euclid(user,userid)
res.append((userid,simliar))#需要排序一下,依据相似度
res.sort(key=lambda val:val[1])#指定评分,字段唯一的,指定评分吧
return res
#构建推荐方法
def recommend(user):
#先拿一个相似度最高的用户
top_user=top_simliar(user)[0][0]#top simliar的第一个下标的第一个商品
#然后把相似度最高的购买记录拿出来
items=data[top_user]#
#定义一个推荐列表
recommend_list=[]
#一开始是空的,遍历,倒退进列表里
for item in items.keys():
if item not in data[user].keys():#如果相似用户的物品没有在目标用户的列表里,那就推
recommend_list.append((item,items[item]))
#排序,多个手机按评分排序,分数高的优先级高
recommend_list.sort(key=lambda val:val[1],reverse=True)#和之前不一样,这里是评分高在前面
return recommend_list[:10]#这里是模仿top-N推荐
#测试一下
print(recommend('1'))
结果:
?b站真是最快能学会代码的地方,就是不够系统,每次都得花大把时间找相关的、难度合适的视频。要是有学习推荐系统的python代码实战课程就也太好了
~~~~~~~~摸索中~~~~~~~~
|