构建协同过滤推荐系统实战入门-phone(python代码)

zz/2024/3/2 11:16:58

这是非常基础的基于用户的协同过滤的推荐过程,在这个代码中,数据量是很小的,但是代码的过程很全面,新手可以很好的从这出发,熟悉协同过滤的实操过程。

代码来源于在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直接赋给下标2else: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]#设置默认距离0distance=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代码实战课程就也太好了

~~~~~~~~摸索中~~~~~~~~


http://www.ngui.cc/zz/2641722.html

相关文章

一些推荐系统学习时用到的资源

1.讲的很好的机器学习的视频,来源于b站。实战类型的,讲的很清楚也很简单易懂。目前没有找到其他比较好的视频课,所以代码学习的很不牢固。 网址是https://www.bilibili.com/video/BV1rJ411g7Mz?p170 2.停用词表 网址是https://gitee.com/c…

业务需求到功能需求的转换

在平时做需求分析的过程中,总结出了一些转换方法 1.通过数据流图分析,一直到不能再分的功能点为止。 2.将分析出的功能点在进行迭代,直到不能迭代为止。 3.关联性分析,针对每个功能点还要进入和该功能点,还有哪些相关的关联性分析…

自动处理机

设计自动处理机,用来处理可变的规则,如:收费标准,每个地方的收费标准都不一样,那么你只要按照, 自动处理机的规范描述你的收费标准,将描述文件交给自动处理机,自动处理机就可以计算收费标准。 这样收费标…

如何整理业务流程

首先从公司的日常工作流程着手,分析公司的日常工作流程. 通过公司的日常流程分析系统的主要流程线索,就是能将各个子系统串起来的线索, 分析线索不要分析细节,细节在分析出主线以后在展开,要不会漏掉主要功能.

业务架构分析

1.首先要确定正确的业务目标. 2.紧紧围绕业务目标分析有哪些业务模块,先结合公司实际的业务状况展开,一般是按造部门展开, 然后对实际业务状况抽象出业务逻辑架构。 3.分析业务模块有哪些业务功能。 4.对业务功能的执行进行分工,得出业务角色。业务角色就是业务架…

Android框架思考--工具类(图片库选择—glide、Picasso切换)

Android框架思考–工具类(图片库选择—glide、Picasso切换) 我们在设计一个项目框架的时候,除了选定基本的骨架如MVC、MVP等之外,还有诸如网络库的选择、图片处理库的选择,选定一个适合我们项目的库之外,针…

写出语句的四元式序列

(1) (2)

SDUT 3275 LCM的个数(打表!!!打表!!!)

emmmmm最不会做的就是各种因为算法不对然后时间复杂度太大各种TLE的题。。。。。不说废话 Problem Description 对于我们来说求两个数的LCM(最小公倍数)是很容易的事,现在我遇到了一个问题需要大家帮助我来解决这问题,问题是&…

低时间复杂度素数筛选---埃氏筛选(只有模板不讲原理!)

#include <stdio.h> int main(){ int a[1001]; memset(a, 0, sizeof(a)); int i,j; for(i2;i<1000;i) { if(a[i]0) { for(jii;j<1000;ji) a[j]1; } } for(i2;i<1000;i) if(a[i]0) printf("%d ",i); return 0; }

最长公共子序列Lcs (长度和打印)——模板题

给出两个字符串A B&#xff0c;求A与B的最长公共子序列&#xff08;子序列不要求是连续的&#xff09;。 比如两个串为&#xff1a; abcicba abdkscab ab是两个串的子序列&#xff0c;abc也是&#xff0c;abca也是&#xff0c;其中abca是这两个字符串最长的子序列。 输入 …