python寻找相似用户_基于用户相似性的协同过滤——Python实现

2023-10-31

#coding:utf-8

importrandom,mathfrom operator importitemgetterclassUserBasedCF:def __init__(self,trainDataFile=None,testDataFile=None,splitor='\t'):if trainDataFile!=None:

self.train=self.loadData(trainDataFile, splitor)if testDataFile!=None:

self.test=self.loadData(testDataFile, splitor)

self.simiMatrix={}defsetData(self,train,test):

self.train=train

self.test=testdef loadData(self,dataFile,splitor='\t'):

data={}for line inopen(dataFile):

user,item,record,_=line.split()

data.setdefault(user,{})

data[user][item]=recordreturndatadef recallAndPrecision(self,peersCount,topN=10):

hit=0

recall=0

precision=0for user inself.train.keys():

itemOfuser=self.test.get(user,{})

recItems=self.recommend(user,peersCount,topN)for item,pui inrecItems.items():if item initemOfuser:

hit+=1recall+=len(itemOfuser)

precision+=topN#print 'Recall:%s hit:%s allRatings:%s'%(hit/(recall*1.0),hit,precision)

return (hit / (recall * 1.0),hit / (precision * 1.0))def coverage(self,peersCount,topN=10):

recommend_items=set()

all_items=set()for user inself.train.keys():for item inself.train[user].keys():

all_items.add(item)

rank=self.recommend(user,peersCount,topN)for item,pui inrank.items():

recommend_items.add(item)return len(recommend_items)/(len(all_items)*1.0)def popularity(self,peersCount,topN=10):

item_popularity=dict()for user,items inself.train.items():for item initems.keys():if item not initem_popularity:

item_popularity[item]=1item_popularity[item]+=1ret=0

n=0for user inself.train.keys():

rank=self.recommend(user,peersCount,topN)for item,pui inrank.items():

ret+=math.log(1+item_popularity[item])

n+=1

return ret/(n*1.0)defcalUserSimilarity(self):

item_users=dict()for u,ratings inself.train.items():for i inratings.keys():

item_users.setdefault(i,set())

item_users[i].add(u)#calculate co-rated items between users

coRatedCount=dict()

itemCountOfUser=dict()for item,users initem_users.items():for u inusers:

itemCountOfUser.setdefault(u,0)

itemCountOfUser[u]+=1

for v inusers:if u==v:continuecoRatedCount.setdefault(u,{})

coRatedCount[u].setdefault(v,0)

coRatedCount[u][v]+=1/math.log(1+len(users))

userSimiMatrix=dict()for u,related_users incoRatedCount.items():

userSimiMatrix.setdefault(u,{})for v,cuv inrelated_users.items():

userSimiMatrix[u][v]=cuv/math.sqrt(itemCountOfUser[u]*itemCountOfUser[v])

self.simiMatrix=userSimiMatrixdef recommend(self,userU,peersCount,topN=10):

recItems=dict()

interacted_items=self.train[userU]'''prepare the user similarity matrix first'''

if notself.simiMatrix:

self.calUserSimilarity()for userV,simiUV in sorted(self.simiMatrix[userU].items(),key=itemgetter(1),reverse=True)[0:peersCount]:for item,ratingV4I inself.train[userV].items():if item ininteracted_items:continue

if item not inrecItems:

recItems[item]=0

recItems[item]+=simiUV*float(ratingV4I)#transform 4 stars into score 0.8

'''if len(recItems)==topN:

return recItems'''

return dict(sorted(recItems.items(),key = lambda x :x[1],reverse =True)[0:topN])deftestUserBasedCF():

cf=UserBasedCF(trainDataFile=r'E:\ResearchAndPapers\DataSet\ml-100k\u3.base',testDataFile=r'E:\ResearchAndPapers\DataSet\ml-100k\u3.test')#cf.calUserSimilarity()

print("%3s%15s%15s%15s%15s" % ('K',"precision",'recall','coverage','popularity'))for k in [5,10,20,40,80,160]:

recall,precision= cf.recallAndPrecision(peersCount =k)

coverage= cf.coverage(peersCount =k)

popularity= cf.popularity(peersCount =k)print("%3d%14.2f%%%14.2f%%%14.2f%%%15.2f" % (k,precision * 100,recall * 100,coverage * 100,popularity))def SplitData(wholeData,M,k,seed,splitor='\t'):

test={}

train={}

random.seed(seed)for line inwholeData:

user,item,score,time=line.strip().split(splitor)if random.randint(0,M)==k:

test.setdefault(user,{})

test[user][item]=scoreelse:

train.setdefault(user,{})

train[user][item]=scorereturntrain,testdeftestUserBasedCF2():

wholeData=open(r'E:\ResearchAndPapers\DataSet\ml-1m\ratings.dat')

train,test=SplitData(wholeData, 8, 5, 10, splitor='::')

cf=UserBasedCF()

cf.setData(train, test)#cf=UserBasedCF(trainDataFile=r'E:\ResearchAndPapers\DataSet\ml-100k\u5.base',testDataFile=r'E:\ResearchAndPapers\DataSet\ml-100k\u5.test')

#cf.calUserSimilarity()

print("%3s%15s%15s%15s%15s" % ('K',"precision",'recall','coverage','popularity'))for k in [5,10,20,40,80,160]:

recall,precision= cf.recallAndPrecision(peersCount =k)

coverage= cf.coverage(peersCount =k)

popularity= cf.popularity(peersCount =k)print("%3d%14.2f%%%14.2f%%%14.2f%%%15.2f" % (k,precision * 100,recall * 100,coverage * 100,popularity))if __name__=="__main__":

testUserBasedCF()#testUserBasedCF2()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python寻找相似用户_基于用户相似性的协同过滤——Python实现 的相关文章

随机推荐

  • [PPPOE]报文交互分析

    1 简介 PPPoE PPP Over Ethernet 协议是在点到点链路上承载网络层数据包的一种链路层协议 由于它能够提供用户验证 易于扩充 并且支持同 异步通信 因而获得广泛应用 PPPoE主要协议标准 RFC2516 图 PPPOE
  • 字母顺序排序

    这周做题的时候遇到了一些困难 当时一直程序并没有报错但就是不知道哪错了 后来通过问同学 终于知道哪错了 其实有的时候哪怕你多加了一个等于号 而以至于程序达不到你需要的效果 也是有的 所以一定不要让数组运行时少一次 否则有可能到后面就出错了
  • python自动化:系统凭据的获取与添加

    在自动化流程开发中 我们经常会遇到输入帐号 密码的情况 帐号明文还可以 但是密码不想展示给他人 但是不想自己去手动输入怎么办 基于以上情况我们可以使用windows自带的凭据管理器进行密码存储 其实我们经常用的git也存储在这里 首先搜索
  • shader里的uv是什么

    shader里的uv是什么 前言 先看一段shadertoy大牛写的代码 vec3 getPixel in vec2 coord float time vec2 uv coord iResolution xy uv uv 2 0 1 0 u
  • 考研数学基础30讲

    基础30讲 第1讲 高等数学预备知识 一 函数的概念与特性 1 函数 2 反函数 3 复合函数 4 函数的四种特性 第1讲 高等数学预备知识 一 函数的概念与特性 1 函数 设x与y是两个变量 D是一个给定的数集 若对于每个值x in D
  • JavaScript中的设计原则

    文章目录 一 单一职责原则 1 运用了单一职责 SRP 的设计模式 2 何时应该分离职责 3 优缺点 二 最少知识原则 1 运用了最少知识原则的设计模式 三 开放 封闭原则 1 运用了开放 封闭原则的设计模式 2 接受第一次愚弄 三 接口和
  • 1010 Radix (25 分)

    题目 题目链接 题解 二分 数学 先说几点注意事项 开 LL 最高进制不是35 可以更高 枚举可能的进制时存在爆LL的情况 整体思路 先计算出知道进制的那个数对应的十进制数 二分进制 找到某个进制使得另一个数对应的十进制数与已知的十进制数相
  • 异步信号的去抖电路及同步电路

    异步输入的问题 如果电路有异步信号 就可能使电路进入亚稳态 因为异步信号可能处于时钟信号建立时间以内 即是输出不确定的状态 去抖电路 异步信号如果是外部的机械输入 比如键盘等 输入信号就会产生机械性地振荡 因此首先需要对此类异步信号加一个去
  • 计算机网络-网络层

    网络层 1 前言 2 网络层的作用 3 网络层数据交换 4 网络层协议及报文格式 5 ARP与RARP 6 国际控制报文协议ICMP 1 前言 网络层介于传输层和数据链路层之间 其主要作用是实现两个网络系统之间的数据透明传送 具体包括路由选
  • openpyxl空值填充、分列、单元格百分比格式显示

    还是之前的日报 处理一个xlsx文件 需求描述如下 不多说 上代码 import openpyxl as op import time lxwb i1 op load workbook 文件路径 5GR I1 15个对象属性空值核对 s x
  • 【计量统计】计量经济学导论常见公式原理及习题解答

    关键词 Stata 计量经济学 习题解答 一 简单二元回归模型 y b 0 b 1
  • 电脑计算机推荐笔记本电脑,十佳办公笔记本电脑排名,性价比高的笔记本电脑推荐...

    商务人士人手必备一台办公笔记本 这样在需要的时候 随时都能办公 当然选择笔记本最重要的是性能好 要方便携带 这里有十大最优质的办公笔记本推荐 足够高的性价比 方便你随身携带随时办公 成为一位优秀的商务人士 1 华硕灵耀S4300FN 这款笔
  • 云孚科技受邀参加第二十二届中国计算语言学大会(CCL 2023)

    云孚科技 CCL 2023 中国计算语言学大会 2023年8月3日 8月6日 第二十二届中国计算语言学大会 CCL 2023 在哈尔滨市成功举行 本次大会由中国中文信息学会主办 哈尔滨工业大学承办 涵盖计算语言学领域最新技术和动向 为与会专
  • 中小型企业网络规划设计方案_实战:企业网络系统规划与设计与事项

    某大中型企业 有多个部门 财务部 人事部 销售部 工程部 同部门之间采用二层交换网络相连 不同部门之间采用VLAN路由方式互访 企业有一台内部web服务器 承载着内部网站 方便员工了解公司的即时信息 局域网路由器启用多种路由协议 静态路由
  • 禁止缩放meta标签

    转载于 https www cnblogs com LiuJL p 10977907 html
  • [1149]RabbitMQ CPU 占用过高优化

    文章目录 背景 问题排查 error logger 问题 erlang 调度器问题 总结 背景 服务器上搭建的 RabbitMQ 在并发量不是很大的情况下 CPU 占用竟然达到了 40 左右 这种情况第一感觉是不科学的 推测应该是使用不当或
  • 电脑上编辑文件打字时页面乱跳解决方法

    问题描述 在网页上编写文章 执行复制 粘贴或者换行等操作时 会出现页面滑动的情况 而光标在编辑的文案中的位置却没变 原因分析 设置了鼠标灵敏度 解决方案 步骤1 打开控制面板 步骤2 在右上方输入鼠标或点击硬件与声音 点击鼠标 步骤3 在鼠
  • 离散数学4_第5章关系与函数__关系矩阵

    关系矩阵的 定义 注意这里 m n阶的矩阵 是指m 行 n列的 矩阵 如果行 列相等 称为方阵
  • textarea 光标位置相关

    textarea cursor postion 兼容 i8 通过 本案例的对于文本域的处理以后就可以 扩展使用了 功能 本文主要的内容是介绍了 在文本域中 光标的位置获取 被选中文本的位置获取 start end 以及在光标位置插入文本 或
  • python寻找相似用户_基于用户相似性的协同过滤——Python实现

    coding utf 8 importrandom mathfrom operator importitemgetterclassUserBasedCF def init self trainDataFile None testDataFi