利用用户行为数据进行推荐

        基于用户行为数据的推荐系统已经非常流行了,今天我们就来介绍三种基本的推荐方法:基于邻域的算法、隐语义模型和基于图的模型。

1. 用户行为数据

        用户行为数据在网站上最简单的存在形式就是日志。用户行为在个性化推荐系统中一般分为两种——显性反馈行为和隐性反馈行为。显性反馈行为包括用户明确表示对物品喜好的行为,比如点击“喜欢”按钮,给出很高的评分等;隐性反馈行为指的是那些不能明确反应用户喜好的行为,最具代表性的就是页面浏览行为。表1展示了显性反馈数据与隐性反馈数据的几个不同点。

表1 显性反馈数据和隐性反馈数据的比较

 显性反馈数据隐性反馈数据
用户兴趣明确不明确
数量较少庞大
存储数据库分布式文件系统
实时读取实时有延迟
正负反馈都有只有正反馈

2. 基于邻域的算法

        基于邻域的方法主要包含基于用户的协同过滤和基于物品的协同过滤两种算法,下面一一进行阐述。

2.1 基于用户的协同过滤算法

        基于用户的协同过滤算法主要包含两个基本步骤:一是找到和目标用户兴趣相投的用户集合,二是找到这个集合中的用户喜欢的,且目标用户没有听过的物品推荐给目标用户。因此该算法的关键是如何计算两个用户的兴趣相似度。

        假设给定用户u和v,令N(u)表示用户u曾经有过正反馈的物品集合,N(v)表示用户v曾经有过正反馈的物品集合,Jaccard公式简单给出两用户相似性的度量:


或者通过余弦相似度计算:


        根据上述给出的公式我们可以计算出任意两个用户的相似度,因此我们可以得到一个二维的用户相似度矩阵。一般计算这个相似性矩阵的时间复杂度为O(|U|^2),但是采用倒排的思想可以提高计算效率。思路大致如下:首先扫描一遍训练数据,建立基于物品的倒排索引;然后根据倒排索引对每一个物品给其关联的用户上加1,最后计算相似度。python伪代码如下:

def UserSimilarity(train):
    # 建立倒排索引
    item_users = dict()
    for user, items in train.items():
        for item in items:
            if item not in item_users:
                item_users[item] = set()
            item_users[item].add(user)
            
    # 计算用户之间的关联
    C = dict() # 统计任两个用户公共正反馈的物品数
    N = dict() # 统计每个用户正反馈的物品数
    for users in item_users.items():
        for user in  users:
            N[user] = N.get(user,0) + 1
            for user2 in users:
                if user == user2:
                    continue
                C[user][user2] = C[user][user2] + 1
    
    # 计算相似性矩阵
    W = dict()
    for user, related_users in C.items():
        for user2, c_uv in related_users.items():
            W[user][user2] = c_uv / math.sqrt(N(user) * N(user2)) 
    
    return W
    

        关于用户相似度计算的改进。上文是采用余弦相似度公式来计算用户之间的兴趣相似度,但是这个公式会遇到这样一个问题:以图书为例,如果两个用户都购买过《新华词典》,但是这并不能说明这两个用户的兴趣相似,因为大部分用户都购买过《新华词典》,但是如果两个用户都购买过《机器学习》这本书,就可以说明他们兴趣相似。换句话说,两个用户对冷门物品采取同样的行为更能说明他们兴趣的相似度。因此,改进后的公式为:


其中,N(i)表示对物品i有正反馈的用户总数。可以看到,该公式通过1/log(1+N(i))惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。

        得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度:


其中,S(u,K)表示和用户u最相似的K个用户的集合,N(i)表示对于物品i有过行为的集合,Wuv表示用户u和用户v的兴趣相似度,Rvi表示用户v对于物品i的感兴趣程度。


2.2 基于物品的协同过滤算法

        基于物品的协同过滤算法也是分为两步,第一步计算物品之间的相似度,第二步根据物品的相似度和用户的历史行为为用户生成推荐列表。

        假定N(i)表示喜欢物品i的用户数,N(j)表示喜欢物品j的用户数,则可以用下面的公式定义物品之间的相似度:


公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。该公式虽然简单,但存在一个问题。当物品j是一个热门物品时,wij就倾向于1,从而造成任何物品都会和热门物品有很大的相似度。为了避免推荐出热门物品,可以改用下面的公式:


该公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。

        同UserCF算法一样,ItemCF算法计算物品之间的相似度也借助了倒排的思想,在得到用品之间的相似度后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:


这里,N(u)表示用户u喜欢的物品的集合,S(j,K)表示物品j最相似的K个物品的集合,wij是物品i与物品j的相似度,rui是用户u对物品i的兴趣度。

       在协同过滤中两个物品产生相似度是因为他们共同出现在很多用户的兴趣列表中,也就是说每个用户的兴趣列表都对物品的相似性做出了贡献。但实际中,每个用户的贡献是不一样的(把所有书都买一遍的用户的贡献应该小于只购买某一类型书籍的用户)。因此,根据用户的活跃度,对物品相似性的公式进行修正:


另外研究表明,如果对ItemCF的相似度矩阵进行最大值归一化,可以有效提高推荐的准确率、覆盖率和多样性。归一化的公式如下:

.


2.3 UserCF和ItemCF的综合比较

 UserCFItemCF
性能

适用于用户较少的场合

如果用户很多,计算用户相似度矩阵的代价很大

适用于物品数明显小于用户数的场合

如果物品很多,计算物品相似度矩阵的代价很大

领域时效性较强,用户个性化兴趣不太明显的领域长尾物品丰富,用户个性化需求强烈的领域
实时性用户有新行为,不一定造成系统结果的立即变化用户有新行为,一定会造成系统结果的变换
冷启动

有新用户对很少的物品产生行为时,不能立即进行个性化推荐,

因为用户相似度是经过一段时间离线进行计算的


新物品上线后,一旦有用户对新物品产生行为,

就可以将新物品推荐给其他兴趣相似的用户

新用户只要对一个物品产生行为,就可以给他进行推荐


但没有办法在不离线更新物品相似度表的情况下,

将新物品推荐给用户

推荐理由  很难提供用户信服的推荐解释利用用户的历史行为给用户做推荐解释,可以令用户比较信服


3. 隐语义模型

3.1 模型解释        

        隐语义分析技术从诞生到今天产生了很多著名的模型和方法,比如pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、矩阵分解(matrix factorization)。这些模型本质上都是相通的,下面简要介绍LFM(latent factor model)在个性化推荐系统中的应用。

        LFM通过以下公式计算用户u对物品i的兴趣:


其中puk度量了用户u的兴趣和第k个隐类的关系,qik度量了第k个隐类与物品i的关系。为了计算这些参数,一般需要一个训练集,对于每一个用户u,训练集里都包含了该用户喜欢的物品和不感兴趣的物品。

        上文提到,推荐系统的用户行为数据一般分为显性反馈数据和隐性反馈数据两种。对于显性反馈数据(比如评分数据),LFM已经可以对评分预测达到很好的精度;但对于隐性反馈数据(只有正样本),需要解决负样本的生成问题。一般认为负样本的生成,应该遵循以下两个原则:

        (1)对每个用户,要保证正负样本的平衡(数目相似);

        (2)对每个用户的负样本采样时,要选取那些热门而用户却没有行为的物品。

        解决好样本问题,就可以进行训练了(一般采用梯度下降法)。


3.2 模型应用

        LFM在实际中很难做到实时推荐(因为需要扫描所有的用户行为数据,反复迭代,需要大量时间,一般在实际应用中一天训练一次),为此雅虎首页推荐提供一个解决方案。

        他们的解决方案分为两个部分。首先,他们利用新闻链接的内容属性(关键词,类别等)得到链接i的内容特征向量yi。其次,他们会实时地收集用户对链接的行为,并且用这些数据得到链接i的隐特征向量qi。最后,他们利用如下公式预测用户u是否会点击链接i :


其中,yi是根据物品内容属性直接生成的,xuk是用户u对内容特征k的兴趣程度,用户向量xu可以根据历史用户行为记录获得,而且每天只需要计算一次。而pu、qi是根据实时拿到的用户最近几小时的行为训练LFM得到的。因此,对于一个新加入的物品i,可以通过第一项估计用户u对物品i的兴趣,然后经过几个小时之后,就可以根据第二项得到更加准确的预测值。


4. 基于图的模型

        用户行为很容易用二分图表示,因此很多图的算法都可以用到推荐系统中。无论哪种算法,都要解决图中顶点的相关性度量这一问题。一般来说,图中顶点的相关性主要取决于以下三个方面:

(1)两个顶点之间的路径数(越多越好);

(2)两个顶点之间路径的长度(越短越好);

(3)两个顶点之间的路径经过的顶点(很少经过出度较大的顶点更好)。

        基于上面3个主要因素,研究人员设计了很多计算图中顶点相关性的方法。下面将介绍一种基于随机游走的PersonalRank算法。

        假设要给用户u进行个性化推荐,可以从用户u对应的节点vu开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从vu节点开始重新游走。如果决定继续游走,那么就从当前结点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终推荐列表中物品的权重就是物品节点的访问概率。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值