推荐系统

推荐系统之基于邻域的算法---协同过滤算法

倖福魔咒の 提交于 2019-12-03 04:10:54
基于邻域的协同过滤主要分为两类,基于用户的协同过滤和基于物品的协同过滤。前者给用户推荐和他兴趣相似的其他用户喜欢的物品,后者则是推荐和他之前喜欢过的物品相似的物品。 基于用户的协同过滤算法 这里介绍基于用户的协同过滤,从定义来说,可以分为以下两步进行: 找到和目标用户兴趣相似的用户集合 找和这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户 计算用户相似度的基本算法: (1)Jaccard 公式 (2)余弦相似度: 得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品,下面的公式表示用户u对物品i的感兴趣程度: 其中S(u,K)包含和用户u兴趣最相近的K个用户,N(i)是对物品i有过行为的用户集合,w uv 是用户u和用户v的兴趣相似度,r vi 代表用户v对物品i的兴趣,在这种情况下r vi =1 可以建立物品到用户的倒查表,对每个物品都保存对该物品产生过行为的用户列表, 可以给上图中的A推荐,选取K=3,用户A对物品c,e没有过行为,因此可以把这两个物品推荐给用户A,用户A对物品c,e的兴趣是: 改进: 上边的算法是有问题的,比如两个人都买过《新华字典》这本书,但这丝毫不能说明他们两个兴趣相似,因为大多数人都买过这本书,如果两个用户都买过《数据挖掘导论》,那可以认为两个人的兴趣比较相似,因为只要研究数据挖掘的人才会买这本书

推荐系统学习之评测指标

﹥>﹥吖頭↗ 提交于 2019-12-03 04:10:35
1.处理数据集:将用户行为数据集按照均匀分布随机分成M份,挑选一份作为测试集,剩下的M-1份作为训练集 import random def splitData(data,M,k,seed): test={} train={} random.seed(seed) for user,item in data: if random.randint(0,M)==k: test.append([user.item]) else: train.append([user.item]) return test,train 2.评测指标 ①准确率和召回率 对用户u推荐N个物品(记为R(u)),令用户u在测试集上喜欢的物品的集合为T(u),召回率和准确率可以用来评测推荐算法的精度,计算公式为 def Recall(train,test,N): hit=0 all=0 for user in train.keys(): Tu=test[user] rank=GetRecommendation(user,N) for item,pui in rank: if item in Tu: hit+=1 all+=len(Tu) return hit/(all*1.0) def Precision(train,test,N): hit=0 all=0 for user in train.keys(): Tu

图推荐-基于随机游走的personrank算法

六月ゝ 毕业季﹏ 提交于 2019-12-03 04:10:24
转自 http://blog.csdn.net/sinat_33741547/article/details/53002524 一 基本概念 基于图的模型是推荐系统中相当重要的一种方法,以下内容的基本思想是将用户行为数据表示为一系列的二元组,每一个二元组(u,i)代表用户u对物品i产生过行为,这样便可以将这个数据集表示为一个二分图。 假设我们有以下的数据集,只考虑用户喜不喜欢该物品而不考虑用户对物品的喜欢程度, 其中用户user=[A,B,C],物品item=[a,b,c],用户和物品有以下的关系: 上述便是一个典型的二分图,我们用G(V,E)来表示,其中V为用户user和物品item组成的顶点集即[A,B,C,a,b,c],而E则代表每一个二元组(u,i)之间对应的边e(u,i),我们这里不考虑用户对物品的喜爱程度,即默认喜爱则e=1,不喜爱则e=0。 那么我们如何使用上述的二分图模型进行物品的推荐呢?根据用户与物品的相关性,对于相关性高的顶点有如下的定义: (1)两个顶点之间有很多路径相连 (2)连接两个顶点之间的路径长度都比较短 (3)连接两个顶点之间的路径不会经过度比较大的顶点 上面有一个概念需要理解,度,顶点的度是指和该顶点相关联的边数。 基于上述的定义,我们这里使用基于随机游走的PersonalRank 算法 来计算,那么这个算法是什么意思呢? 在解释之前

推荐系统之冷启动问题

风流意气都作罢 提交于 2019-12-03 04:09:33
推荐系统之冷启动问题 转自http://blog.csdn.net/zhangjunjie789/article/details/51379127 如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统,就是冷启动问题。 冷启动问题主要分为三类: (1) 用户冷启动:如何给新用户做个性化推荐的问题,新用户刚使用网站的时候,系统并没有他的行为数据; (2) 物品冷启动:解决如何将新的物品推荐给可能对它感兴趣的用户; (3) 系统冷启动:如何在新开发网站设计个性化推荐系统,此时网站上用户很少,用户行为也少,只有一些商品的信息。 冷启动的主要解决方案: (1) 提供非个性化推荐:如热门排行榜推荐,等到用户数据收集到一定程度时,切换到个性化推荐; 用户的注册信息分为3种:   1)人口统计学信息:年龄、性别、职业、民族、学历和居住地等;典型代表是Bruce Krulwich开发的Lifestyle Finder   2)用户兴趣的描述:有些网站要求用户填写;   3)从其他网站导入的用户站外行为数据。 有两个推荐系统数据集包含了人口统计学信息:BookCrossing数据集和Lastfm数据集。 利用的用户人口统计学特征越多,越能准确地预测用户兴趣。 (2) 利用用户注册信息:如性别,年龄,做粗粒度的个性化; 基于注册信息的个性化推荐流程:   1)

推荐系统之隐语义模型LFM

会有一股神秘感。 提交于 2019-12-03 04:09:32
LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型。那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣相似的用户,之后再根据计算出来的用户喜欢的物品给目标用户推荐物品。 而ItemCF,我们可以根据目标用户喜欢的物品,寻找和这些物品相似的物品,再推荐给用户。 我们还有一种方法,先对所有的物品进行分类,再根据用户的兴趣分类给用户推荐该分类中的物品,LFM就是用来实现这种方法。 如果要实现最后一种方法,需要解决以下的问题: 给物品分类 确定用户兴趣属于哪些类及感兴趣程度 对于用户感兴趣的类,如何推荐物品给用户 对分类,很容易想到人工对物品进行分类,但是人工分类是一种很主观的事情,比如一部电影用户可能因为这是喜剧片去看了,但也可能因为他是周星驰主演的看了,也有可能因为这是一部属于西游类型的电影,不同的人可以得到不同的分类。 而且对于物品分类的粒度很难控制,究竟需要把物品细分到个程度,比如一本线性代数,可以分类到数学中,也可以分类到高等数学,甚至根据线性代数主要适用的领域再一次细分,但对于非专业领域的人来说,想要对这样的物品进行小粒度细分无疑是一件费力不讨好的事情。 而且一个物品属于某个类,但是这个物品相比其他物品,是否更加符合这个类呢?这也是很难人工确定的事情。解决这个问题,就需要隐语义模型

推荐系统发展综述

匿名 (未验证) 提交于 2019-12-03 00:37:01
1. 引言 随着信息技术和互联网技术的发展,人们从信息匮乏时代步入了信息过载时代,在这种时代背景下,人们越来越难从大量的信息中找到自身感兴趣的信息,信息也越来越难展示给可能对它感兴趣的用户,而推荐系统的任务就是连接用户和信息,创造价值。 设想用户想买一本《Recommender Systems An Introduction》,用户只需要走进一家书店,寻找这本书即可。通过互联网,用户可以打开当当,在搜索框中输入书名,然后就可以找到用户想要购买的书籍,这两种方式都需要用户有明确的目的,如购买《Recommender Systems An Introduction》或某一类别的书籍。 但是,当用户没有明确目标时,比如寻找感兴趣的音乐,用户只能通过一些预先设定的类别或标签去寻找他可能感兴趣的音乐,但面对如此之多音乐,用户很难在短时间内找出真正感兴趣的音乐。这时就需要一个自动化的工具,来分析用户曾经收听的音乐,进而寻找出用户可能感兴趣的音乐推荐给用户,这就是个性化推荐系统的工作。 作为一种信息过滤系统,推荐系统具有以下两个最显著的特性: (1)主动化。从用户角度考虑,门户网站和搜索引擎都是解决信息过载的有效方式,但它们都需要用户提供明确需求,当用户无法准确描述自己的需求时,这两种方式就无法为用户提供精确的服务了。而推荐系统不需要用户提供明确的需求,而是通过分析用户和物品的数据

推荐系统实践 代码实现

匿名 (未验证) 提交于 2019-12-03 00:22:01
import random import math from operator import itemgetter def Splitdata(data, M, k, seed): test = dict() train = dict() random.seed(seed) for user, item in data: rdm = random.randint(0, M) if rdm == k: if user not in test: test[user] = set() test[user].add(item) # test.append([user, item]) else: if user not in train: train[user] = set() train[user].add(item) # train.append([user, item]) return train, test def Recall(train, test, N, K): hit = 0 all = 0 W = UserSimilarity(train) for user in train.keys(): if user in test: tu = test[user] rank = Recommend(user, train, W, K) rk = sorted(rank.items(

推荐系统简介

匿名 (未验证) 提交于 2019-12-03 00:05:01
一、推荐系统的目的 让 用户 更快更好的获取到自己需要的内容 让 内容 更快更好的推送到喜欢它的用户手中 让 网站( 平台)更有效的保留用户资源 二、推荐系统的基本思想 利用用户和物品的特征信息,给用户推荐那些具有用户喜欢的特征的物品。 利用用户喜欢过的物品,给用户推荐与他喜欢过的物品相似的物品。 利用和用户相似的其他用户,给用户推荐那些和他们兴趣爱好相似的其他用户喜欢的物品 三、推荐系统分类 1、根据实时性分类 离线推荐 实时推荐 2、根据推荐原则分类 基于相似度的推荐 基于知识的推荐 基于模型的推荐 3、根据数据源分类 基于人口统计学的推荐 基于内容的推荐 基于协同过滤的推荐 四、推荐算法简介 1、基于人口统计学的推荐 2、基于内容的推荐: 利用用户评价过的物品的内容特征 3、基于 协同过滤 的推荐 基于 近邻 的协同过滤 基于用户(User-CF) 基于物品(Item-CF) 基于 模型 的协同过滤 奇异值分解(SVD) 潜在语义分析(LSA) 支撑向量机(SVM) 5、混合推荐 实际网站的推荐系统往往都不是单纯只采用了某一种推荐机制和策略,往往是将多个方法混合在一起,从而达到更好的推荐效果。比较流行的组合方法有: 加权混合:用 线性公式 (linear formula)将几种不同的推荐按照一定权重组合起来, 具体权重的值需要在测试数据集上反复实验 ,从而达到最好的推荐效果

推荐系统起手式-几种简单推荐模型(基于内容的推荐)

匿名 (未验证) 提交于 2019-12-03 00:05:01
一.基于内容的推荐 所谓基于内容信息的推荐系统,其实就是用特征(Feature)来表示用户、物品以及用户和物品的交互,从而能够把推荐问题转换成为监督学习任务。把推荐系统完全定义为监督学习任务,需要有这么几个步骤。 第一,就是我们已经提到的,需要把所有用户、物品的各种信号用特征来表示。这里面往往牵涉非常复杂和繁琐的特征工程,也就是看如何能够把不同的信息通过特征表达出来。 第二,就是每一个监督任务都需要面临的问题,如何构造一个目标函数,来描述当前的场景。可以说,这是最难的一个部分,也是和基于流行度和基于相似度的推荐系统的最大区别。 二.用户特征信息 用户向量化后的结果,就是 User Profile,俗称“用户画像”。对于用户来说,最基础、最首要的肯定是用户的基本特性,包括性别、年龄、地理位置。这三大信息其实可以涵盖用户特性工程中非常大的一块内容。这里不仅是最基本的这三个特性的值,还有围绕这三个特性发展出来的三大种类的特性。比如,不同性别在文章点击率上的差异,不同年龄层在商品购买上的差异,不同地理位置对不同影视作品的喜好等,这些都是根据这三个特性发展出来的更多的特性。然后,我们可以为用户进行画像(Profiling)。有显式的用户画像,比如用户自己定义的喜好,或者用户自己认为不愿意看到的物品或者类别。但是在大多数情况下,用户都不会为我们提供那么精准的回馈信息

最近在部署推荐系统环境时,遇到一个很奇葩都问题

匿名 (未验证) 提交于 2019-12-02 23:57:01
问题描述: ../anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/_multiprocessing_helpers.py:38: UserWarning: [Errno 13] Permission denied. joblib will operate in serial mode warnings.warn('%s. joblib will operate in serial mode' % (e,)) Segmentation fault 没错,发生了段错误,使用gdb 跟踪信息,也没找到,也就是无法使用多进程,只能串行. 解决方案: ls -ld /dev/shm sudo chmod 777 /dev/shm 来源:博客园 作者: 龚细军 链接:https://www.cnblogs.com/gongxijun/p/11454844.html