基于用户行为分析的推荐算法
文章目录
- 基于用户行为分析的推荐算法
- 用户行为数据简介
- 用户行为分析
- 用户活跃度和物品流行度的分布
- 用户活跃度和物品流行度的关系
- 实验设计和算法测评
- 数据集
- 实验设计
- 评测指标
- 基于领域的算法
- 基于用户的协同过滤算法
- 源代码实现
基于用户行为分析的推荐算法
这种算法称为协同过滤算法,协同过滤是指用户可以齐心协力,通过不断的和网站互动,使自己的推荐列表能够过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。
用户行为数据简介
用户行为数据最简单的存在形式是日志。很多互联网业务会把原始日志按照用户行为汇总成为会话日志(session log),其中每个会话代表一次用户行为和对应的服务,如展示日志,点击日志。
用户行为在个性化推荐系统中一般分为显性反馈行为(explicit feedback)和隐性反馈行为(implicit feedback)。explicit feedback包括用户明确表示对物品的喜好的行为。implicit feedback 是指那些不能明确反应用户喜好的行为。与explicit feedback相比,隐性反馈虽然不明确,但是数量庞大。
显性反馈数据 | 隐性反馈数据 | |
---|---|---|
用户兴趣 | 明确 | 不明确 |
数量 | 很少 | 庞大 |
存储 | 数据库 | 分布式文件系统 |
实时读取 | 实时 | 有延迟 |
正负反馈 | 都有 | 只有正反馈 |
用户行为分析
在利用用户行为数据设计推荐算法之前,首先需要对用户行为数据进行分析,了解数据中蕴含的一般规律,这样才能对算法的设计起到指导作用。以下用户行为数据的普遍规律。
用户活跃度和物品流行度的分布
互联网上很多数据分布都满足power Law也称长尾分布。
f(x)=αxkf(x)=\alpha x^kf(x)=αxk
研究发现,用户行为数据也满足power law分布,fi(k)f_i (k)fi(k)为被k个用户产生行为的物品数,fu(k)f_u(k)fu(k)为对k个物品产生行为的用户数。即
fi(k)=αikiβf_i(k)=\alpha_i k^\beta_ifi(k)=αikiβfu(k)=αukuβf_u(k)=\alpha_u k^\beta_ufu(k)=αukuβ
用户活跃度和物品流行度的关系
根据这个规律可以发现,用户越活跃,越倾向于冷门物品。
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法提出了很多方法,如:基于领域的方法,隐语义模型、基于图的随机游走算法等。应用最广泛的是:
- 基于用户的协同过滤算法 这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品
- 基于物品的协同过滤算法 这种算法给用户推荐和他之前喜欢的物品相似的物品
实验设计和算法测评
数据集
采用GroupLens提供的MovieLens数据集,该数据集包含3个不同版本,选用中等大小的数据集,包含6000多用户对4000多部电影的100万条评分。该数据集是一个评分数据集。着重研究隐反馈数据集中的TopN推荐问题,因此忽略数据集中的评分纪录。TopN的推荐任务是预测用户会不会给某部电影评分,而不是预测用户在准备对电影评分的前提下给电影评多少分。
实验设计
首先,将用户行为数据集均匀随机分成M份(M=8),挑选一份作为测试集,其余的作为训练集。在训练集上建立用户兴趣模型,并在测试集上对用户行为进行预测,统计相应的评测指标。为了保证评测指标并不是过拟合的结果,需要进行M次试验,并且每次都使用不同的测试集。然后取M次试验的评测指标的平均值作为最终的评测指标。
下面代码为将用户评分文件中的数据分成训练集合测试集的过程。
def get_datas(input_file,M,k,seed) : #将用户评分文件中的数据分成训练集合测试集"""get rating informationArgs: input_file:user rating fileM: 数据分成的份数k: 实验选取的测试集seed: 随机种子Return: two listsone:train datasanother:test datas"""if not os.path.exists(input_file) :return [],[]linenum = 0train_data = []test_data = []fp = open(input_file)random.seed(seed)for line in fp :if linenum == 0 :linenum += 1continue item = line.strip().split(',')if len(item) < 4:continueif random.randint(0,M) == k :test_data.append([item[0],item[1],item[2]])else :train_data.append([item[0],item[1],item[2]])fp.close()return train_data,test_data
这里,每次选取不同的k和相同的随机种子seed,进行M次实验就可以得到M个不同的训练集和测试集,然后分别进行实验,用M次实验的平均值作为最后的评测指标。这样做主要就是为了防止某次实验结果是过拟合的结果(overf itting)。
评测指标
- 准确率/召回率
对用户u推荐N个物品,记为(R(u)R(u)R(u)),令用户在测试集上喜欢的物品集合为(T(u)T(u)T(u)),然后通过准确率/召回率评测推荐算法的精度:
recall=∑u∣R(u)andT(u)∑u∣T(u)∣recall=\frac{\sum_u |R(u) and T(u)}{\sum_u |T(u)|} recall=∑u∣T(u)∣∑u∣R(u)andT(u)
precision=∑u∣R(u)andT(u)∑u∣R(u)∣precision=\frac{\sum_u |R(u) and T(u)}{\sum_u |R(u)|} precision=∑u∣R(u)∣∑u∣R(u)andT(u)
召回率描述有多少比例的用户-物品评分纪录包含在最终的推荐列表中,而准确率描述最终的推荐列表中有多少比例是发生过的用户-评分纪录。 - 覆盖率
覆盖率反映推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。
Coverage=⋃u∈UR(u)ICoverage=\frac{\bigcup_{u\in U}R(u) }{I}Coverage=I⋃u∈UR(u) - 新颖度
用推荐列表中的物品的平均流行度度量推荐结果的新颖度,如果推荐出的物品都很热门,说明推荐的新颖度较低,否则说明推荐结果比较新颖。
基于领域的算法
基于用户的协同过滤算法
基于用户的协同过滤算法就是将兴趣相同的人喜欢的物品推荐给你。
包括两个步骤:
- 找到和目标用户兴趣相同的用户集合
- 找到这个集合中的用户喜欢的,且目标用户没有听过的物品推荐给目标用户
步骤1的关键就是计算两个用户的兴趣相似度。这里,主要利用行为的相似度计算兴趣的相似度。给定用户uuu和vvv,令N(u)N(u)N(u)为用户uuu曾经有过正反馈的物品集合,令N(v)N(v)N(v)为用户vvv曾经有过正反馈的物品集合。计算方法有两种:
- jaccard公式 :Wuv=∣N(u)⋂N(v)∣∣N(u)⋃N(v)∣W_{uv}=\frac{|N(u)\bigcap N(v)|}{|N(u)\bigcup N(v)|}Wuv=∣N(u)⋃N(v)∣∣N(u)⋂N(v)∣
- 通过余弦相似度计算 :Wuv=∣N(u)⋂N(v)∣∣N(u)∣∣N(v)∣W_{uv}=\frac{|N(u)\bigcap N(v)|}{\sqrt{|N(u)||N(v)|}}Wuv=∣N(u)∣∣N(v)∣∣N(u)⋂N(v)∣
源代码实现
import os
import math
import numpy as np
import random
NumOfMovies = 9000
NumOfUsers = 700def get_data(file):"""读取数据"""if not os.path.exists(file):return {}fp = open(file)data = {}linenum = 0for line in fp:if linenum == 0:linenum += 1continueline = line.split(',')userid,itemid = int(line[0]),int(line[1])if userid not in data:data[userid] = []data[userid].append(itemid)fp.close()return datadef split_data(data,M,k,seed):#将数据划分成为测试集和训练集test = {}train = {}random.seed(seed)for user,items in data.items():for i in items:if random.randint(0,M) == k:if user not in test:test[user] =[]test[user].append(i)else:if user not in train:train[user] = []train[user].append(i)return train,testdef UserSimilarity(train):#得到用户相似集合W#建立电影用户倒排表item_user = {}for u,items in train.items():for i in items:if i not in item_user:item_user[i] = []item_user[i].append(u)#计算C[u][v]即u和v共同观看的电影数C = {}N = np.zeros([NumOfUsers],dtype = np.int32)user_related = {}for i,users in item_user.items():for u in users:N[u] += 1if u not in C:C[u] = {}for v in users:if u == v:continueif v not in C[u]:C[u][v] = 0C[u][v] += (1/math.log(1+len(users)))if u not in user_related:user_related[u] = []user_related[u].append(v)#求用户相似矩阵WW = np.zeros([NumOfUsers,NumOfUsers],dtype = np.float)for u,users in C.items():for v in users:W[u][v] += C[u][v] / math.sqrt(N[u] * N[v])return W ,user_relateddef recommend(User,train,K,N,W,user_related):#通过相似矩阵W给用户产生推荐recordk_user = {}rank ={}for v in user_related[User]:k_user[v] = W[User][v]k_user = sorted(k_user.items(),key = lambda x:x[1],reverse = True)[:K]for v,w in k_user:for item in train[v] :if item in train[User]:continueif item not in rank:rank[item] = 0rank[item] += wrank = sorted(rank.items(),key = lambda x:x[1],reverse = True)[:N]return rankdef Recall(train,test,N,k,W,user_related):#计算召回率hit = 0totla = 0for user in train:tu =test[user]rank = recommend(user,train,k,N,W,user_related)for item in rank :if item[0] in tu :hit += 1totla += len(tu)return hit/(totla*1.0)def Precision(train,test,N,k,W,user_related):#计算召回率hit = 0totla = 0for user in train:tu =test[user]rank = recommend(user,train,k,N,W,user_related)for item in rank :if item[0] in tu :hit += 1totla += len(rank)return hit/(totla*1.0)if __name__ == "__main__":data = get_data(r"F:\个性化推荐算法\UserCF\data\ratings.csv")train,test = split_data(data,2,1,1)del dataW,user_relatde = UserSimilarity(train)recall = Recall(train,test,10,10,W,user_relatde)precision = Precision(train,test,10,10,W,user_relatde)print(recall,precision)
注:以上参考《推荐系统实践》一书
基于用户行为分析的推荐算法相关推荐
- 基于用户行为特征的推荐算法
简述:基于用户行为分析的推荐算法是个性化推荐系统的重要算法,也被称为协同过滤算法,即通过用户与网站不断互动,来不断过滤自己感兴趣的物品. 基础概念 用户行为分类 按照反馈的明确性分 显性反馈行为: 用 ...
- 基于用户的协同过滤推荐算法原理和实现分析
本文转载自nieson 基于用户的协同过滤推荐算法原理和实现 在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 ...
- 协同过滤算法_基于用户的协同过滤推荐算法原理和实现
(给算法爱好者加星标,修炼编程内功) 来源:Create Chen's Blog https://www.cnblogs.com/technology/p/4467895.html 在推荐系统众多方法 ...
- python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...
在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...
- 基于用户的协同过滤推荐算法原理和实现
在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...
- (一)基于用户的协同过滤推荐算法原理和实现
在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...
- mysql数据推荐算法_Java+Mysql实现简单在线电影、音乐、图书推荐系统 基于用户的协同过滤推荐算法实现 源代码下载...
# Java+Mysql实现简单在线电影.音乐.图书等推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,tomca ...
- Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架
Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...
- Python实现基于用户的协同过滤推荐算法构建电影推荐系统
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 基于用户的协同过滤推荐(User-based CF)的原理假设: ...
最新文章
- Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
- c# 图片加图片水印、文字水印和图片文字水印
- python3 多维数组 NumPy ndarray 简介
- 汉军Hundre考勤数据库数据表分析总结
- java_IO总结(一)
- java对象转JSON JS取JSON数据
- 在Linux添加网卡,Centos(RHEL) 6 添加网卡的方法
- iOS xcode4 编译环境
- matlab怎样定义全局变量,Matlab如何定义公共变量
- 好消息!!超任模拟器被我移植到MOTO E680i上了!!
- 第一部分 移动终端芯片概述
- 【浏览器修改请求头】该地址不支持在浏览器打开,如需访问, 请使用微信扫描下方二维码
- JAVA开发---微信文章留言功能实现
- 小白入门spring——IOC依赖注入
- 网络安全需要看什么书?(网安工程师)?
- Nuxt - 自定义页面布局,<Nuxt /> 个性化多套模板(一个项目内既要有用户正常浏览的普通页面,又要存在后台管理系统布局的页面)
- spring mysql_eclipse中spring访问mysql的简易实现-阿里云开发者社区
- word页眉页码目录
- 使用Verilog语言实现时间计数器
- 艾永亮:漫谈挖掘用户真实需求的五要素