推荐算法之基于用户的协同过滤算法

协同过滤是推荐算法中最基本的算法,主要分为基于用户的协同过滤算法和基于物品的协同过滤算法。

这篇文章主要介绍基于用户的协同过滤算法,简单来说,要给用户u作推荐,那么只要找出那些和u之前的行为类似的用户,即和u比较像的用户,把他们的行为推荐给用户u即可。所以基于用户的系统过滤算法包括两个步骤:1)找到和目标用户兴趣相似的用户集合  2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

第一步的关键点在于计算用户之间的相似度,相似度一般通过Jaccard公式或者余弦相似度即可求得,及计算共有行为所占的比重(具体式子google就行,csdn插入公式不方便。。。),所以目前而言,计算用户相似度的复杂度是O(N*N), N为用户数量,在用户数比较大的网站中不实用,比如亚马逊用户数量肯定N>100000,那么这样的复杂度是不可接受的。

第一步时间复杂度的改进方法:因为很多用户间其实相似度是为0的,如果看成是一个N*N的矩阵的话,肯定是个稀疏矩阵,那么我们其实没有必要浪费计算量在这些0上。我们可以建立物品到用户的倒查表,及可以根据物品找到所有对该物品有过行为的用户,然后遍历各物品,对一个物品然后找到对该物品有过行为的用户,然后计算这些用户间的行为相似度(共有行为+1,同时计算这些用户的行为数),最后计算两用户间的公有行为占各自行为的比重。

第一步计算相似度的改进方法:举个例子:如果两人都买过《新华辞典》,并不能说明这两人想像,因为这本书基本上人人都会买,而如果这两人都买过《机器学习》,那么我们可以肯定,这两人在这方面有相同的兴趣爱好,也就是说,越是对冷门物品有同样的行为,就越说明用户的相似性,即在计算用户相似性的时候,需要降低热门物品的影响(通过计算流行度来实现,然后用1/N(i)来计算公共行为比重,N(i)表示流行度,这样,流行度高的物品所占比重就比较低)

第二步则比较简单,选出K个和用户u最相似的用户,把他们喜欢过的物品并且用户u没有喜欢过的物品推荐给u即可。这里面K的选择非常重要。K越大,推荐的结果就越热门,流行度就越高,同时覆盖率越低,因为基本推荐的都是流行的物品.

第二步评分预测改进方法:一般来说并不是所有第二步中的物品都会推荐给用户,因为这样的物品还是非常多的,一般来说我们会选择topN, 选用户可能最感兴趣的N个商品。那么要选择前N个商品,肯定是根据评分来进行排序,这样便会遇到一个问题,不同人的评分基点不同,比如A评分基点在4,好看的电影评5分,不好看的评3分,但是B基点是2,好看的评3分,不好看的评1分,这样的话直接根据评分来计算是不精确的,改进方法是计算用户在基点上的评分,如A对好看的电影给了(5-4)分,对不好看的电影给了(3-4)分,B对好看的电影给了(3-2)分,对不好看的电影给了(1-2)分,这样来看其实两者对电影的评价是类似的,而在计算需推荐用户对电影的评分时,只需要计算邻域的均值加上该用户的基点(一般用平均值来算)

基于用户的协同过滤算法在实际应用得比较少,一方面是因为用户多了,算法的复杂度还是很高,另一方面是这样的推荐很难给出推荐理由,故一般工业界都选择基于物品的协同过滤算法。

推荐算法之基于用户的协同过滤算法

时间: 2024-10-25 15:18:06

推荐算法之基于用户的协同过滤算法的相关文章

推荐算法之基于用户的协同过滤

基于用户的的协同过滤算法是推荐统统最古老的算法,简称UserCF.该算法的诞生一定程度上标志着推荐系统的诞生.本文将对UserCF算法原理进行讲解,并且基于Movielens数据集给出实现代码供大家交流学习. 基本原理 在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,先找到和他相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有听说过的物品推荐给用户A.这种方法就称为基于用户的协同过滤算法.该算法主要包括两个步骤: 找到和目标用户兴趣相似的用户集合 找到这个集合中用户喜欢的且目标用户没

Mahout实现基于用户的协同过滤算法

Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序中用到的数据都存在MySQL数据库中,计算结果也存在MySQL中的对应用户表中. package com.mahout.helloworlddemo; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.

基于用户的协同过滤算法(UserCF)

基于用户的协同过滤算法: 找到和目标用户相似的用户集合 找到这个集合中用户喜欢的但目标用户没有听过的物品 #encoding: utf-8 from Similarity import Person from Sort import select_sort file=open('user_bookmark','r') filew=open('user_bookRecommend','w') #加载训练集 trainSet={} while True: line=file.readline().s

基于用户的协同过滤算法

基于用户的协同过滤算法-参考<推荐系统实践>一书,作者:项亮 1 import random 2 import math 3 class UserBasedCF: 4 def __init__(self,datafile = None): 5 self.datafile = datafile 6 self.readData() 7 self.splitData(3,47) 8 def readData(self,datafile = None): 9 """ 10

推荐算法之基于物品的协同过滤算法

基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品. 基于物品的协同过滤算法主要分为两步: 1)计算物品之间的相似度. 2)依据物品的相似度和用户的历史行为给用户生成推荐列表. 第一步的关键点在于计算物品之间的相似度,这里并不採用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是用户的兴趣爱好通常是比較确定的,不easy变,那么当一个用户对两个物品都喜欢的时候,我们往往能够觉得这两个物品

spark基于用户的协同过滤算法与坑点,提交job

承接上文: http://blog.csdn.net/wangqi880/article/details/52875524 对了,每台机子的防火墙要关闭哈,不然spark集群启动不起来 前一次,已经把spark的分布式集群布置好了,今天写一个简单的案例来运行.会写一些关于spark的推荐的东西,这里主要有4点,1基于用户协同过滤,2基于物品协同过滤,3基于模型的协同过滤,4基于关联规则的推荐(fp_growth),只写核心代码啊. 基于spark用户协同过滤算法的实现 1用户协同过滤算法 1.1

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是推荐系统领域最著名的算法. 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人. 基本思想 俗话说"物以类聚.人以群分",拿看电影这个例子来说,如果你喜欢<蝙蝠侠>.<碟中谍>.&l

基于用户的协同过滤推荐算法

什么是推荐算法 推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地. 最开始,所以我们在网上找资料,都是进yahoo,然后分门别类的点进去,找到你想要的东西,这是一个人工过程,到后来,我们用google,直接搜索自 己需要的内容,这些都可以比较精准的找到你想要的东西,但是,如果我自己都不知道自己要找什么肿么办?最典型的例子就是,如果我打开豆瓣找电影,或者我去 买说,我实际上不知道我想要买什么或者看

基于用户和基于物品的协同过滤算法的比较

首先回顾一下,协同过滤算法主要有两种,一种是基于用户的协同过滤算法(UserCF),另一种是基于物品的协同过滤算法(ItemCF). 基于用户的协同过滤算法主要有两步: 1)找到和目标用户兴趣相似的用户集合 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 基于物品的协同过滤算法主要有两步: 1)计算物品之间的相似度. 2)根据物品的相似度和用户的历史行为给用户生成推荐列表. 由此可以看出UserCF是推荐用户所在兴趣小组中的热点,更注重社会化,而ItemCF则是根据用