基于用户的协同过滤

最近在看推荐系统。主要是看《智能web算法》和《推荐系统实战》这两本书。《智能web算法》中推荐系统只花一个章节来讲。《推荐系统实战》整本书都是在讲推荐的内容。有兴趣的朋友可以看看。在此慢慢写下笔记与诸位来宾交流交流

推荐系统应用广泛。推荐的方式也多种多样。比较常用的有三种方式。1.社会化推荐;2.协同过滤推荐;3.基于内容的推荐。而协同过滤推荐又可以分为基于用户的协同过滤推荐(UserCF)和基于物品的协同过滤推荐(ItemCF)。本文写的是基于用户的协同过滤。

首先来看看基于用户的协同过滤的总体思想:

假如我有一个音乐网站。用户A进来了。作为拥有"智能"的应用。我当然不能让A在一大堆音乐中慢慢去听来看哪首好听哪首不好听(这里有个前提,用户A没有明确的目的,这是搜索引擎跟推荐系统的一个不同点)。所以我就向A推荐一些音乐。怎么推荐。一个方案就是我根据数据去预测A没有评分过的歌曲的可能评分。然后根据预测进行一个排名。把TopN的音乐推荐给A。那么,我们接下来要解决的问题是怎么预测的事。基于用户的协同过滤是通过和A相似的用户来进行预测。假如说B,C,D是A的相似用户,也称邻居。那可以根据B,C,D来预测A没听过的歌曲的评分。思想是利用B,C,D的相似度和歌曲的评分来做加权平均数。得到的就是预测评分。下面举个数据例子来看看。

有相似度向量

B  C  D

A  0.8 0.6     0.7

有A的未评分歌曲的列表M1,M2,M3和B,C,D对M1,M2,M3的评分。预测A对M1,M2,M3的评分

  M1  M2  M3  Degree

B  4     2           2.5  0.8

C    3.5       3           3.5  0.6

D    4.3       1.5        5     0.7

A  ?    ?    ?    1

填好表就行了。

(A,M1)= 4*0.8+3.5*0.6+4.3*0.7。其他的同理。得到A对M1,M2,M3的预测评分。

总结一下过程:

①找邻居

②加权平均预测

上面还有个问题没有解决,那就是相似度的问题。相似度往往跟距离挂钩。相似度可以用欧式距离来算,也有一个雅可比相似度的概念

欧式距离:从数学的角度来讲。求平面执教坐标系或者空间坐标系上任意两点的距离大家都懂求。上升到更高维的角度也是一样的道理。

假如有用户A和用户B分别都对M1,M2,M3。。。Mi进行评分。那我们可以构建两个向量来求都是距离,构建向量如下:

A(x1,y1,z1,....)

B(x2,y2,z2,....)

ODistance = √(x1-x2)²+(y1-y2)²+....;

距离有了,那相似度怎么算。距离越远就越不相似。用智能web里面的话说,距离和相似度是互反的。那就转换一下。用1/ODistance+1作为相似度。+1的目的有两个,一个是防止ODistance为0。另外一个是我个人观点,是为了保证相似度的范围不超过1。通常用欧式距离表示相似度问题不是很大(作者说的,本人项目经验不足)。但有时也有问题。数据相差很大,同时数据项也相差很大的情况下。项数平方和累加已经弥补项数少的平方和了。这样说有点抽象。还是用数字来举例子。

A,B,C三个用户。A和B都对M1进行评分了,评分分别是1,4。A和C都对M2,M3,M4评分了,评分分别是1,2;1,2;1,2。和明显A和C更相似。但是算一算。A和B的相似度和A跟C的相似度是一样的。这就是我说的数据相差很大(1,4),同时项数也相差很大(一项项对比三项),即使你评分相差很大(1-4对比1-2)。那算出来的也有可能相似度一样。这里的很大是相对来说的。毕竟评分就五个等级。既然到这里那就消除项数这个因素带来的差异。在除以一个项数就好了。

上面说的是欧式距离的过程,还有一个雅可比相似度,这个不求距离,公式也很好理解,A 交 B/A 并 B;

假设说A,B是用户,A交B表示A跟B一致评分的音乐的个数(分数是一样的才算一致评分),A并B表示A和B所有评分的音乐的个数(重复算一个)。至于证明,本人不懂证明,也不太懂为什么这个算出来的就是相似度。但是这个方法用的也比较多,至少两本书都有用这个方法找邻居。这里我们又遇到一个要解决的问题。怎么算A交B,又怎么算A并B。智能web里面作者是利用矩阵来算。确实也能算。而且矩阵也不太大。5*5就ok了。

假设A和B对六个音乐进行评分(不一定都两个都评了六首歌),如下

A(2,4,3,1,1)

B(2,3,1,5,1)

通过肉眼可以看出A交B为2,A并B为5。反应到矩阵上规则是这样子的,以A,B分别为横坐标和纵坐标。在5*5的矩阵上对应的坐标上+1。(5*5矩阵初始化为0)。对角线和相加得到A交B,总数相加得到A并B

  1  2  3  4  5  

1  1            1 

2    1

3  1

4        1

5                       

这样得到了相似度了,这也就解决了找邻居的问题

下一个问题是求加权平均数的预测的问题。这个是要找出A未评分的音乐,用他的TopN邻居来预测,前面写过表来说明了,这里不再赘述。

至于大数据的处理问题,如果有对hadoop下的开发比较熟悉的朋友或许可以试一试,本人hadoop的项目经验不足。只是理解一些基本原理和基本实现过程而已。可能开学会做类似的项目。

---------------------------------------------------------------------------------------------------

后记:

本人想自己实践去开发一个简单的推荐系统,个人利用老师项目之余的业余实践开发。这两天也尽量将分析报告发出来(正勤快练习写文档的能力),到时加链接,有这方面经验的朋友希望多多指教。如果有想找人做类似项目的老大哥本人也非常愿意当个打杂的学习学习。

时间: 2024-10-15 18:18:47

基于用户的协同过滤的相关文章

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

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

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

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,但是还是参加阿里大数据竞赛的第一季三月份的时候实验就完成了,硬生生是拖到了十一假期,自己也是醉了...找工作不是很顺利,希望写点东西回顾一下知识,然后再攒点人品吧,只能如此了. 一.问题背景 二.基于用户的协同过滤算法介绍 三.数据结构和实验过程设计 四.代码 一.问题背景 首先介绍一下问题的背景,现在我有四个月的用户.品牌数据<user,brand>,即用户在这四个月中的某一天购买了某个品牌(当然为了简化算法模型,将购买时间省去,后面再说).即现在有这四个月的数据

(数据挖掘-入门)基于用户的协同过滤之最近邻

主要内容: 1.什么是基于用户的协同过滤 2.python实现 1.什么是基于用户协同过滤: 协同过滤:Collaborative Filtering,一般用于推荐系统,如京东,亚马逊等电商网站上的“购买该物品的用户还喜欢/购买”之类的栏目都是根据协同过滤推荐出来的. 基于用户的协同过滤:User-based CF,通过不同用户对item(物品)的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐. 这里介绍一种最简单的过滤方法:最近邻,即找到与某用户最相似的用户,将该用户喜欢的物品(而某

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

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

基于用户的协同过滤算法

基于用户的协同过滤算法-参考<推荐系统实践>一书,作者:项亮 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

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

协同过滤是推荐算法中最基本的算法,主要分为基于用户的协同过滤算法和基于物品的协同过滤算法. 这篇文章主要介绍基于用户的协同过滤算法,简单来说,要给用户u作推荐,那么只要找出那些和u之前的行为类似的用户,即和u比较像的用户,把他们的行为推荐给用户u即可.所以基于用户的系统过滤算法包括两个步骤:1)找到和目标用户兴趣相似的用户集合  2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 第一步的关键点在于计算用户之间的相似度,相似度一般通过Jaccard公式或者余弦相似度即可求

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

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