推荐系统小结
什么是推荐系统?
说到推荐系统,我们肯定是要问它是为什么而存在的,即存在的意义是什么。
随着当今技术的飞速发展,数据量也与日俱增,人们越来越感觉在海量数据面前束手无策。正是为了解决信息过载(Information overload)的问题,人们提出了推荐系统(与搜索引擎对应,人们习惯叫推荐系统为推荐引擎)。当我们提到推荐引擎的时候,经常联想到的技术也便是搜索引擎。不必惊讶,因为这两者都是为了解决信息过载而提出的两种不同的技术,一个问题,两个出发点,我更喜欢称它们两者为兄弟,亲近而形象。
兄弟二人有共同的目标,即解决信息过载问题,但具体的做法因人而异。
搜索引擎更倾向于人们有明确的目的,可以将人们对于信息的寻求转换为精确的关键字,然后交给搜索引擎最后返回给用户一系列列表,用户可以对这些返回结果进行反馈,并且是对于用户有主动意识的,但它会有马太效应的问题,即会造成越流行的东西随着搜索过程的迭代会越流行,使得那些越不流行的东西石沉大海。
而推荐引擎更倾向于人们没有明确的目的,或者说他们的目的是模糊的,通俗来讲,用户连自己都不知道他想要什么,这时候正是推荐引擎的用户之地,推荐系统通过用户的历史行为或者用户的兴趣偏好或者用户的人口统计学特征来送给推荐算法,然后推荐系统运用推荐算法来产生用户可能感兴趣的项目列表,同时用户对于搜索引擎是被动的。其中长尾理论(人们只关注曝光率高的项目,而忽略曝光率低的项目)可以很好的解释推荐系统的存在,试验表明位于长尾位置的曝光率低的项目产生的利润不低于只销售曝光率高的项目的利润。推荐系统正好可以给所有项目提供曝光的机会,以此来挖掘长尾项目的潜在利润。
如果说搜索引擎体现着马太效应的话,那么长尾理论则阐述了推荐系统所发挥的价值。
-
马太效应(Matthew Effect),是指好的愈好,坏的愈坏,多的愈多,少的愈少的一种现象。即两极分化现象。
-
长尾理论(The Long Tail)只要产品的存储和流通的渠道足够大,需求不旺或销量不佳的产品所共同占据的市场份额可以和那些少数热销产品所占据的市场份额相匹敌甚至更大,即众多小市场汇聚成可产生与主流相匹敌的市场能量
所属领域
推荐系统是多个领域的交叉研究方向,所以会涉及机器学习以及数据挖掘方面的技巧(推荐系统==》数据挖掘/机器学习==》人工智能)。在这整理了小邬老师上课所介绍的关于主流研究方向的结构图。
会议介绍
在这里主要整理一下上图所涉及到的研究方向相关的会议。
RS(Recommender System):RecSys
IR (Information Retrieval): SIGIR
DM(Data Mining): SIGKDD,ICDM, SDM
ML (Machine Learning): ICML, NIPS
CV (Computer Vision): ICCV, CVPR, ECCV
MM (MultiMedia): ACM MM
DB (Database): CIKM, WIDM
AI (Artificial Intelligence): IJCAI, AAAI
推荐系统实验方法
- 离线方法:从实际系统日志中提取数据,划分训练集测试集训练模型。
优点:不需要有对实际系统控制权,不需要用户参与,速度快,可测试大量算法
缺点:无法计算商业上关心指标。离线实验指标和商业指标存在差距。 - 用户调查:即直接询问用户。优点:可用获取很多体现用户主观感受指标,缺点招募用户代价较大很难组织大规模测试用户,因此测试结果统计意义不大。
- 在线实验:推荐系统上线做AB测试,将它和旧的算法进行比较。(用户分组,不同组采用不同算法).
优点:公平获取不同算法实际在线时性能指标包括商业上关注指标。
缺点:周期长,必须进行长期的实验才能得到比较靠谱的结果。
推荐系统的评测
-
用户满意度:用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标
-
预测准确度:预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力(最重要离线评测指标)
-
评分预测(一般通过均方根误差( RMSE)和平均绝对误差( MAE)计算),rui实际评分
RMSE的定义为:
MAE采用绝对值计算预测误差,它的定义为:
-
TopN推荐(网站在提供推荐服务时,一般是给用户一个个性化的推荐列表TopN推荐的预测准确率一般通过准确率( precision) /召回率( recall)度量)
-
正确率 = 提取出的正确信息条数 / 提取出的信息条数
-
召回率 = 提取出的正确信息条数 / 样本中的信息条数
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
推荐结果的准确率定义为:
有的时候,为了全面评测TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度N,计算出一组准确率/召回率,然后画出准确率/召回率曲线( precision/recall curve)。
-
-
覆盖率(信息熵,基尼系数( Gini Index)):描述一个推荐系统对物品长尾的发掘能力
-
多样性:多样性描述了推荐列表中物品两两之间的不相似性
-
新颖性:指给用户推荐那些他们以前没有听说过的物品
-
惊喜度:惊喜度指如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
-
信任度
-
实时性:因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效性时就将它们推荐给用户。
-
健壮性:一个推荐系统抗击作弊的能力
数据集
可采用的数据集:
适用于传统的推荐任务,提供了3种不同规模的数据,包含用户对电影的评分信息,用户的人口统计学特征以及电影的描述特征。
2、Douban
适用于社会化推荐任务,规模适中,包含用户对电影的评分信息,同时包含用户间的信任社交信息。
3、Epinions
适用于社会化推荐任务,规模较大,包含用户对电影的评分信息,同时包含用户间的信任社交信息,值得注意的是,该数据集同时还包括不信任关系信息。
4、KB4Rec
适用于推荐系统与知识图谱相结合的研究需求,该数据集将推荐数据中的物品链接到大型知识图谱中的实体,为推荐系统的物品提供蕴含丰富语义的结构化知识信息。
基本算法:
协同过滤算法
协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐。也就是常见的“猜你喜欢”,和“购买了该商品的人也喜欢”等功能。它的主要实现由:
●根据和你有共同喜好的人给你推荐
●根据你喜欢的物品给你推荐相似物品
●根据以上条件综合推荐
因此可以得出常用的协同过滤算法分为两种,基于用户的协同过滤算法(user-based collaboratIve filtering),以及基于物品的协同过滤算法(item-based collaborative filtering)。特点可以概括为“人以类聚,物以群分”,并据此进行预测和推荐。
1.基于用户的协同过滤算法(UserCF)
基于用户的协同过滤算法的实现主要需要解决两个问题,一是如何找到和你有相似爱好的人,也就是要计算数据的相似度:
计算相似度需要根据数据特点的不同选择不同的相似度计算方法,有几个常用的计算方法:
(1)杰卡德相似系数(Jaccard similarity coefficient)
其实就是集合的交集除并集
(2)夹角余弦(Cosine)
在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:
两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦:
即
(3)其余方法,例如欧式距离、曼哈顿距离等相似性度量方法可以点此了解
userCF算法会给用户推荐和他兴趣最相似的k个用户喜欢的物品,如下公式计算用户u对物品i的感兴趣程度:
其中S(u,K)表示和用户u最为相似的k个用户,N(i)表示和物品i产生行为的用户列表。Wuv表示用户u和用户v的相似度。rvi表示用户v对物品i的兴趣,因为使用的是单一行为的隐反馈,故所有rvi=1.
找到与目标用户最相邻的K个用户
我们在寻找有有相同爱好的人的时候,可能会找到许多个,例如几百个人都喜欢A商品,但是这几百个人里,可能还有几十个人与你同时还喜欢B商品,他们的相似度就更高,我们通常设定一个数K,取计算相似度最高的K个人称为最相邻的K个用户,作为推荐的来源群体。
这里存在一个小问题,就是当用户数据量十分巨大的时候,在所有人之中找到K个基友花的时间可能会比较长,而且实际中大部分的用户是和你没有什么关系的,所以在这里需要用到倒排表
所谓倒排表,就是比如你喜欢的商品有A、B、C,那就分别以ABC为行名,列出喜欢这些商品的人都有哪些,其他的人就必定与你没有什么相似度了,从这些人里计算相似度,找到K个人
通过这K个人推荐商品
我们假设找到的人的喜好程度如下
A | B | C | D | |
---|---|---|---|---|
你 | √ | √ | √ | |
甲 | √ | √ | √ | |
乙 | √ | √ |
倒排表
A | 你 | 甲 |
---|---|---|
B | 你 | 甲 |
C | 你 | 乙 |
D | 甲 | 乙 |
前面计算用户间兴趣相似度使用的是余弦相似度,该公式过于粗糙,需要改进该公式。
以图书为例,如果两个用户都曾经买过《新华字典》,这丝毫不能说明他们兴趣相似,因为绝大多数中国人小时候都买过《新华字典》。但如果两个用户都买过《数据挖掘导论》,那可以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。换句话说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。因此,John S. Breese在论文中提出了如下公式,根据用户行为计算用户的兴趣相似度:
其中,N(i)表示用户u,v共同感兴趣的物品的个数。该公式通过惩罚了用户u,v共同兴趣商品中热门商品对他们相似度的影响。
讲上述公式记为UserCF-IIF算法
2.基于物品的协同过滤(ItemCF)
ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通过分析用户的行为记录来计算用户的相似度。该算法认为物品A和物品B相似的依据是因为喜欢物品A的用户也喜欢物品B。
基于物品的协同过滤算法实现步骤:
1、计算物品之间的相似度
2、根据物品的相似度和用户的历史行为记录给用户生成推荐列表
下面我们一起来看一下这两部是如何实现的:
一、计算物品之间的相似度
通过查询一下资料,ItemCF的物品相似度计算模型如下:
公式中|N(i)|表示喜欢物品i的用户数,|N(j)|表示喜欢物品j的用户数, |N(i)∩N(j)|表示同时喜欢物品i和物品j的用户数。从上面的公式我们可以看出物品i和物品j相似是因为他们共同别很多的用户喜欢,相似度越高表示同时喜欢他们的用户数越多。
下面举例讲解一下相似度的计算过程:
假设用户A对物品a,b,d有过评价,用户B对物品b,c,e有过评价,如下图:
A : a b d
B : b c e
C : c d
D : b c d
E : a d
根据上面用户的行为构建:用户——物品倒排表:例如:物品a有用户A和E做过评价。
a : A E
b : A B D
c : B C D
d : A C D E
e : B
根据上面的倒排表我们可以构建一个相似度矩阵:
图 1.1 计算物品的相似度
图中最左边的是用户输入的用户行为记录,每一行代表用户感兴趣的物品集合,然后对每个物品集合,我们将里面的物品两两加一,得到一个矩阵。最终将这些矩阵进行相加得到上面的C矩阵。其中Ci记录了同时喜欢物品i和j的用户数。这样我们就得到了物品之间的相似度矩阵W。
二、根据物品的相似度和用户的历史行为记录给用户生成推荐列表
ItemCF通过下面的公式计算用户u对一个物品j的兴趣:
这里的N(u)代表用户喜欢的物品的集合,S(j,k)是和物品j最相似的的k个物品的集合,wij是物品j和i的相似度,r_ui代表用户u对物品i的兴趣。该公式的含义是,和用户历史上最感兴趣的物品月相似的物品,越有可能在用户的推荐列表中获得比较高的排名。
下面是查阅资料找到的一些优化方法:
(1)、用户活跃度对物品相似度的影响
即认为活跃用户对物品相似度的贡献应该小于不活跃的用户,所以增加一个IUF(Inverse User Frequence)参数来修正物品相似度的计算公式:
用这种相似度计算的ItemCF被记为ItemCF-IUF。
ItemCF-IUF在准确率和召回率两个指标上和ItemCF相近,但它明显提高了推荐结果的覆盖率,降低了推荐结果的流行度,从这个意义上说,ItemCF-IUF确实改进了ItemCF的综合性能。
(2)、物品相似度的归一化
Karypis在研究中发现如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确度。其研究表明,如果已经得到了物品相似度矩阵w,那么可用如下公式得到归一化之后的相似度矩阵w’:
最终结果表明,归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。用这种相似度计算的ItemCF被记为ItemCF-Norm。
部分代码实现:
#-*- coding: utf-8 -*-
'''
Created on 2015-06-22
@author: Lockvictor
'''
import sys
import random
import math
import os
from ope