基于群成员贡献值的群推荐系统(MC-GR

简介

目标:通过计算群成员重要程度等级,提出考虑群成员贡献值的推荐模型。

方法1,应用可分离非负矩阵特征值(SNMF)技术来分析群成员贡献值,提出成员贡献值分数模型。

      2,提出基于曼哈顿距离的局部平均分模型。

      3,融合模型,提出基于群成员贡献的推荐方法。

 

 

引入

群推荐系统

定义:必须实时分析群成员偏好,并给出满足所有群成员的推荐。

类型1,兴趣稳定群:因兴趣而建群,群成员自主选择加入,这样的话推荐的时候直接缩小了范围,因为某个时间段内他们的兴趣是趋同的。比如豆瓣早起读书小组,小组成员积极的组成这个小组,群成员可以直接获得所有成员推荐的书,所以你可以给他们推荐读诗歌还是散文都没问题。

      2,兴趣随机群:随机建群。很可能群成员兴趣是相冲突的,比如有一个群是大家都去现场听了湖南台跨年演唱会而被动的成为一个团体,其他演唱会的推荐就不能简单的根据成员单次参加这场演唱会来确定了,你给他们这个群组推荐什么就得斟酌再三了。

 

过去1,基于评分信息,可是评分稀疏或群组过大。

2,解决方法是引入附加信息(标签,文本,社交信息)描述互动或者性格来计算复杂的个人偏好。

3,问题是应用领域没有普遍接受的附加信息?;兴趣随机群也没机会获取成员附加信息。

 

兴趣随机群

主要问题:群成员兴趣冲突,群越大越难建模并给出折中推荐。

解决方法:计算群成员在群内的分量,并根据有代表性的成员的偏好给群组类型建模。

方法缺陷:计算有代表性的群成员依然需要附加信息。

 

本推荐系统

目标:只用已有评分,研究出最大化满足兴趣随机群的推荐。

方法:通过子矩阵计算成员分量,这样解决了评分数据稀疏问题。

步骤:1,成员贡献分(MCS)模型。

      2,基于曼哈顿距离的局部平均分(MLA)模型。通过估算缩减矩阵的评分(该矩阵来自目标项目的一系列近邻项目评分)解决肥尾问题。

贡献:1,提出MC-GR系统。该系统只用了评分信息来做推荐,没有用其他附加信息。

      2,提出MCS模型。MCS根据子矩阵计算群成员贡献,应用了可分离非负矩阵特征(SNMF)识别哪个成员具有代表性,并计算该成员对群组是什么类型的的相应贡献。      

 

文献回顾

基于协同过滤的个人推荐

基于用户:推荐相似用户喜好的项目。spacer.gif

基于项目:推荐自己过去喜好的项目。spacer.gif

 

群组推荐

spacer.gif 

类型:1,聚合个人偏好的群推荐。通过聚合群内每个人的个人偏好来表示群体的偏好,以此来给伪用户简介建模,然后通过伪用户简介来生成群推荐。

      2,聚合个人推荐的群推荐。首先生成给群内每个成员的个性化推荐,然后聚合每个推荐来生成群推荐。

      3,前者稍微优于后者。但是前者有个问题是群成员的爱好不总是一样的,要是给群简介建模来代表群内所有成员的偏好的话就会引起偏好冲突。

 

建立群简介

方法

1共识法:公平,平均。

2多数法:少数服从多数,投票数多者胜。

3边界法:最小化不快,最大化快乐。

4专治法:最受重视成员决策。

少数服从多数是聚合个人推荐方法,其他三个都是聚合个人偏好来建立群简介。

 

关键问题:

      1,共同兴趣------------设计原则------------->最大化满意度。

      2,兴趣冲突带来的失望--------------设计原则--------->最小化失落感。

      共识法,多数法,专治法被广泛用来使满意度最大化;边界法被用来使失落感最小化。以上方法都需要设置阈值将不满足需求的用户明确排除出去。

 

公式:

G-------->Group

u-------->user

w-------->weight

spacer.gif 

spacer.gif是用户u的权重向量,不同权重代表建立群简介的方法不同。比如spacer.gif每人权重一样就是共识法;而一个人的权重是1,其他人权重是0,就是专治法。

 

前人改善计算权重的问题都需要一些额外信息,比如社交关系,文本,标签,领域知识,或者互动信息,如果群组没有这些信息那些方法就不好使了,而且要是是兴趣随机群可能结果更糟糕。

 

矩阵分解(MF

在这里MF是指评分矩阵R被分解成用户矩阵UVR`=UVR`R的差值叫做恢复误差,旨在减小误差生成更精准的预测。在群组推荐系统中,通常缺失大量评分内容,导致给群组简介构建合适模型变得困难。

 

前人使用奇异值分解(SVD)分解评分矩阵,并通过聚合分解的用户简介矩阵给群组矩阵建模。但是这个方法遇到两个问题。一个是给组群简介建模时会策略选择问题:传统矩阵分解没有固定解决方案,因为分解结果很容易受到初始值和矩阵更新原则影响,因此不可能建立一个稳定且唯一的评分简介。另一个是问题是当遇到高维稀疏数据时高计算代价低质量问题,这使得这个解决方案在实际推荐场景中变得不太实际。

 

 

基于群成员贡献值的群推荐系统(MC-GR

spacer.gif 

1,生成群概要:论文认为群成员应该根据他们的典型等级分配不同权重。因此引入一个概念来估计每个成员的代表等级,并提出成员贡献分(MCS)模型来量化成员的代表等级,然后用这个分数生成群概要。最后这个群组概要作为单个推荐方法的输入用来生成群组推荐。

2,生成推荐:论文认为针对某个目标项目的局部平均分可以减轻胖尾评分导致的低精度问题。提出基于曼哈顿距离的局部平均分模型,这个模型首先用曼哈顿距离识别哪些项目是目标项目的相关项目,这些相关项目组成了一个缩减的项目集,然后计算这个局部项目集的平均分。最后用第一步生成的群概要和刚才计算出来的局部平均分,通过前面提到的聚合个人推荐的方法和群预测的前K名推荐的项目来预测群组评分。

 

生成群简介

这个部分需要用群简介来表示整个群体的偏好。对于一个复杂的兴趣随机的群组来说,更有影响力的用户的偏好肯定要比其他普通用户的偏好考虑的多一些。但是有个问题是,具有代表性的用户难以识别,比如遇到评分稀疏的数据集的时候怎么识别用户代表呢。

为了解决这个问题。论文做了以下两件事:首先,构造一个用户和项目的矩阵,这里不是考虑整个项目空间的向量,而是给矩阵部分取样,这样在每个局部矩阵中每个用户都对项目作出了评分,根据这个局部矩阵可以精确估算哪个用户是用户代表。然后,在给这个矩阵多次取样后,可以计算出多个局部矩阵的用户代表,通过对所有代表用户兴趣聚合后可以得到整个矩阵的用户代表。

论文的MCS模型包括以上的取样,聚合两个步骤。

所以前面的建立群简介的公式就可以变成:

spacer.gif------------>spacer.gif

因此生成群简介在论文中一共分成了以下三步:

1,计算取样贡献值。

传统上来说,群成员对群概要的贡献与系统采用哪种建立群简介的策略有关。比如说,如果采用最小化失落感策略,那么给每个项目最低评分的成员就会被选出来构建群简介。但是有个问题是,如果评分数据稀疏的话,大量缺失数据使得很难根据某种特定策略生成群简介。如下图所示:

spacer.gif 

可以看到就目前的评分来看自然的沙滩项目分特别高,可是每个项目的未知评分使得生成的群简介变得不那么可信,我们要是单单凭已有数据就说这个群的偏好是自然体验而不是运动,就不太合适了。解决这个问题的方法是预测成员对每个项目的评分来填补矩阵,然后再建立群简介。

 

本论文也可以解决这个问题,但本论文没有考虑某个具体群简介生成策略,而是直接关注具有代表性的群成员。一个抽取出来的局部矩阵样本包括一个评分矩阵的映射和相应的没有缺失项目评分的成员。当没有缺失评分的时候,就可以精确选出代表成员。

 

spacer.gif--------->matrix-------->原矩阵

spacer.gif--------->item sample-------->选择出来的项目样本(样本内的项目是等概论随机取出的)。

spacer.gif----------->users sample-------->选择出来的成员样本(剔除评分缺失的成员)。

spacer.gif--------->matrix sample---------->局部评分矩阵样本(没有缺失评分值。横轴是刚才选择出来的项目样本,竖轴是刚才选择出来的成员,用原矩阵评分数据的映射构造这个局部评分数据。画图表示:用table1举例,就是先选项目beachdivingcycling,然后选了前四个成员,剔除第二、第三个成员,最后的矩阵就是横轴是刚才选出的三个项目,竖轴就是第一和第四个成员,这样整个局部评分矩阵都是完整的)。然后这个局部评分矩阵就是MCS模型的输入,以此计算选择出来的成员spacer.gif中谁是代表成员。

 

直观上来看,如果一个成员的偏好和其他成员的偏好高度关联或者直接可以用其他成员的偏好表示,那么他的喜好就不具有代表性(比如我喜欢打球,我对象喜欢运动,那我们的爱好就是有关的,而且打球就是一种运动,也就是所谓的我的爱好直接可以用我对象的爱好表示,我的爱好就没有代表性)。

将所有成员的简介作为高维向量的数据,就可以选择有限个顶点集来定义一个凸壳,而凸壳上的其他数据都可以被线性表示。而顶点(即偏好)就比凸壳上其他偏好更具有代表性。

这就是本论文提出“成员贡献分”概念来描述成员代表等级的提议动机。这样的话,计算成员代表性的问题就变成了识别凸壳顶点的偏好集的问题了。

获得spacer.gif后,在MCS模型中运用可分离的非负矩阵分解(SNMF)找到顶点。相比传统矩阵分解技术,SNMF保证结果唯一且稳定并且能保证某个特定矩阵的代表等级,这意味着矩阵分解不受初始值影响。除此之外,SNMF很容易能拓展到更大的群组,因为只考虑成员评分的话它具有很好的可扩展性。

SNMF可以保证稳定结果和代表等级。

spacer.gif中的SNMF可以定义为:spacer.gif

spacer.gif----------------->basic matrix------>基础矩阵。(包括spacer.gif中的几行数据,这几行数据可以用来恢复spacer.gif而且用起来比用其他行恢复结果更精确。基础矩阵里有简介的成员可以被视为代表成员)

spacer.gif------------->代表成员集,这个集合的成员都来自spacer.gif

MCS计算每个成员的代表偏好的公式:spacer.gif

也就是说只要是成员代表的话就给他1分的贡献分,如果不是成员代表就没有贡献分。

 

2,给每个成员聚合MCSs

   注意到样本的项目是整体项目的一部分,并且成员都是评分完整的成员,所以成员是没有覆盖整个矩阵的。整个项目空间中群成员的代表等级可以通过聚合所有样本的成员贡献分结果预测出来。

理论上讲,所有可能的样本必须能精确的估计成员贡献。然而实际上,考虑到一个群的评分矩阵可以映射出无限个样本,因此在有限的时间内很难完成这个工作。为了解决这个问题,只选择了一个群组的一部分映射作为样本来计算MCS

I------------->item----------------->整个项目空间

spacer.gif------------->ith sampling------------>i个样本

spacer.gif------------>item involved in spacer.gif------------->i个样本里的项目

spacer.gif------------>user involved in spacer.gif--------------->i个样本里的成员

每个成员u的贡献分MCS(无论spacer.gif中的成员在不在组G内):spacer.gif

这个公式就是说如果成员u在群组里而且还是成员代表就给他1分,如果成员不是成员代表或者不在这个群组里就给他0分。

那么我们怎么判断一个成员是不是成员代表呢?这里引入了SNMF的方法来计算谁是代表成员:

spacer.gif 

spacer.gif 

 

现在我们要做的就是,对于所有的组内的成员,把每一个样本的组内成员对任一个项目的贡献分融合到一个贡献分中:

spacer.gif 

spacer.gif--------->一个被评过分的项目(哪怕只是被一个成员评过一次分)

spacer.gif-------------->所有子集的数量。

 

最终结果spacer.gif

 

3,根据贡献分生成群简介

    spacer.gif归一化代表用户权重

spacer.gif一共有Ig个项目

spacer.gif------->群简介,每一维都表示一个被评过分的项目

群对项目iitem i)的评分:spacer.gif

 

生成推荐

生成群简介后,就用已知的群组项目评分来估计未知的群组评分。论文采用PCC的相似度计算来识别群组的近邻组,并采用曼哈顿距离来计算局部群组的平均分,把以上两个方法结合起来用于基于用户的协同推荐来预测未知群组评分。

 

1,计算组员和非组员的简介相似度

g--------->grouppseudo user--------------->伪用户(即被看做某个用户的整个组,刚才已经计算出了一整个组对分别某几个项目的评分了,所以刚才计算的一个群组的评分向量spacer.gif可以看做这个伪用户的偏好)

u --------->non-group users----------->非组员(没有分组的系统的用户)

spacer.gif----------->非组成员u评过分的项目集

基于伪用户和非组成员共同评分的皮尔森系数:

spacer.gif 

最后得出的结果范围会是[-1,1],数字越大说明两个用户越相似。

 

2,计算群组局部平均分

采用基于近邻用户的协同过滤可能遇到用户评分的肥尾分布问题,也就是说许多评分很可能会离伪用户平均评分很远。比如说某个用户基本上给所有项目都是两三分,但唯独健身器材给分就基本都是五分,但是用来预测这个用户对其他健身器材的时候,可能因为他对大部分项目的分都很低导致计算项目平均分的时候偏低,最后哪怕结合相似用户对那个健身器材的评分,最后计算出来的预测分还是很低。

spacer.gif 

没有经过处理的普通基于用户的协同过滤预测评分的公式,常常用来计算未知评分,但是他很难预测肥尾目标项目的评分,因为太多不相关的项目用来计算平均分了。这个公式的意思就是,在整个用户领域里,想要预测的用户评分会线性逼近近邻用户评分。

MLA模型旨在寻找目标项目的局部近似项目,并且计算用户对这些针对目标项目的近似项目的平均分。这个模型可以减轻肥尾问题,因为他不要求要预测的项目评分必须在评分密集区域,这样的话落在稀疏区域(通常就是肥尾)的未知评分就可以更精确的预测出来。

MLA模型根据目标项目周边局部项目平均分,而不是计算整个项目空间的项目平均分,来估计伪用户的局部平均分。目标项目的周边项目是通过曼哈顿距离来评级的,在这里他们用了曼哈顿距离用来计算两个项目的相关性,因为曼哈顿距离根据绝对绝对评分差距来计算相关性,所以它对肥尾问题敏感。本论文选了高度相关的项目的评分来计算局部平均分。

 

spacer.gifspacer.gif-------->共同的K个用户对目标项目i的评分矩阵和对非目标项目j的评分矩阵。

spacer.gifspacer.gif---------->同一用户p对目标项目i和非目标项目j的评分差。

spacer.gif----------->目标项目i和非目标项目j的曼哈顿距离

这里有个问题是不同系统评分不统一,有些评分是1~5,有些又是1~10,所以在计算关系时必须标准化spacer.gif。本文根据三种不同的系统将可能的评分差分成了三个相关等级。评分差值0~评分最大值-评分最小值,那就直接粗暴的把评分差等分成三份:spacer.gif显然,如果spacer.gif越接近0,则同一个用户P评分过的目标项目i和目标项目j越相关。那我们定义一个函数来表示相关性等级:

spacer.gif 

所以目标项目i和非目标项目j的曼哈顿距离为:

spacer.gifspacer.gif的值域为[0,k]。如果用户数目k不同的话曼哈顿距离的量级就不同了。

所以把曼哈顿距离归一化作为最终项目ij的关系:

spacer.gif 

T--------->threshhold------------->决定ij距离够不够近,用户u对非目标项目j的评分spacer.gif能不能用来计算群组G对项目i的平均分。

最终群组G对项目i的局部平均分spacer.gif可以通过计算所有和项目i相关的项目j的平均分获得:

spacer.gif 

 

3,预测群组对项目的评分

论文用的是基于用户的协同过滤公式,通过带权加和项目与相似近邻的的平均分的偏差值计算未知群组评分:

spacer.gif 

spacer.gif----------->为未知群组G对项目i的评分,并且spacer.gif项目i不在被评分过的项目spacer.gif内,项目i未被评过分。

spacer.gif----------->通过曼哈顿距离计算出来的群组G的局部平均分,其中离伪用户距离近的近邻用户是通过皮尔森系数计算相似度得出来的。

v----------->活跃用户u的其中一位近邻用户

spacer.gif------------>用户v的平均评分

最后推荐系统将选择预测评分最高的前k个项目做推荐。

spacer.gif 

实验及结果分析

数据集和预处理

用的是movielensJester的数据集。movielens相当于咱们的豆瓣电影,是一个电影推荐系统,可以帮助用户找到想看的电影,他用的主要是里面的用户评分,Jester数据集是三个从某个笑话推荐系统爬下来的笑话评分数据。选择用户的时候只选择那些给1535个笑话打过分的用户用来做计算,避免群简介包含了所有的项目,包含完了就就没法做推荐了。

spacer.gif 

数据被分成训练集和测试集。因为项目已经被群成员评过分而且不会再推荐给群成员了,一个比较小的测试集可能测试集中只能找到比较少的可推荐项目,最终导致评估质量偏差。所以他们随机把数据平均分成两份,分别用来做数据集和测试集。

因为这些评分数据都是用来评估个人推荐系统偏好的用户个人评分,没有真正的分组关系,所以他们就提出了分组协议和合适的度量。

 

分组协议

他们提出来的模型其实可以适用于各种群推荐,但是他们这里就专注于有高度偏好冲突的兴趣随机群组的推荐。分组的时候必须有两个重要特征:

1,群组大小。群组越大,越难生成群简介。之前做群推荐的方法都是相对小的群,大都少于10个人,这样的话群内成员的意见就不容易发生冲突,很容易达成统一。他们的实验一开始用的是5个人一组,后来每次增加5个人,一直增加到每组30个人来评估他们的报告的可行性。

2,组内成员的关系。组内成员完全没有关系互不了解的话更容易引起兴趣冲突问题,所以他们随机抽取了一些用户组成一个群组,用来解决现实生活中兴趣随机的群组问题,比如一群搭乘同一架飞机的乘客组成的群组。

对于每个特定的群组大小,也就是上面说的5,10,15,20,25,30个人的一个组,随机生成了1000个组,然后用这1000个小组的平均度量给出最后的结果。比如说,为了测试个10人小组的表现,他们随机的选了一半的数据用来做训练集,另一半用来做测试集。所有测试数据中的成员都可以用来组成某个群组,为了避免被选择的成员的评分都在训练集里从而不能在通过测试数据来衡量的情况,他们从这些成员中随机选出10个人来组群。这里就是要计算出这个群组的spacer.gifspacer.gif重复这个过程1000次,也就是重复选出了100010人的小组,来获得spacer.gifspacer.gif的平均值来作为10个人的小组的最终结果。

spacer.gif 

上图是LM,AVG,AM和论文提出的MCSMC-GR方法的nDCG结果,可以看出无论是加上计算局部平均分的步骤还是不加,结果都比其他方法好,而且加上了这个方法后无论是稀疏数据集还是后面群组人数逐渐增加到30人,表现都好于没加计算局部平均分的方法。最后那个图是Jester的数据集,群组越大群组简介就覆盖到更多的项目,未知评分也越来越小,所以最后值接近1了。然后接下来作者说的话完全题文不符。。。

spacer.gif 

不过值得注意的是,比较起来nDCG的图是一路走高的,F的图是一路走低的,这是因为nDCG测量的是推荐的相对等级不同,F测量的是预测和真实评分的不同,人越多预测的越准的意思。

spacer.gif 

从上图可以看出来参数不同对模型的F值影响不大。

spacer.gif 

从上图可以看出来加了局部平均分的模型比不加还是好很多的。上面的0.2,0.3是前面的T值,大致上看设置参数对模型影响不算大,但是数据稀疏时还是有一定差距的。