Advertisement

《推荐系统实践》第二章 利用用户行为数据

阅读量:

2.1 用户行为数据简介

在电子商务网站中行为主要包括网页浏览、购买、点击、评分和评论等。

用户的使用行为在个性化推荐系统中主要分为两类:显性反馈行为(explicit feedback)与隐性反馈行为(implicit feedback)。显性反馈行为涉及用户明确表达对物品的喜爱之情的行为。隐性反馈行为指的是那些无法直接反映用户喜好情况的行为。最典型的隐性反馈行为即为页面浏览行为。

根据是否直接表达偏好这一维度划分后, 用户行为数据可按是否直接表达偏好分为显性和隐性的两种类型;从方向上来看, 正反指向与负反指向分别代表了用户的喜好倾向:前者表明用户喜欢该物品, 后者则表明用户不喜欢该物品;在显性的方向上容易辨别出用户的喜好倾向, 而在隐性的方向上判定起来则较为困难

用户的某个行为具体包括以下几个方面:产生该行为的用户及其所处的环境、行为的具体内容、行为所依据的规则以及该行为产生的结果。

以下列举了具有代表性的几种数据集:

2.2 用户行为分析

2.2.1 用户活跃度和物品流行度的分布

定义fu(k)为参与k个物品的用户数量,并定义fi(k)为与k个用户有过交互的对象数量。由此可见,fu(k)和fi(k)均遵循长尾分布模式。

物品的流行度指对物品产生过行为的用户总数。

用户的活跃度为用户产生过行为的物品总数。

不管是物品的流行度还是用户的活跃度,都近似于长尾分布。

2.2.2 用户活跃度和物品流行度的关系

普遍认为,在线网民中新网民的比例较高。这是因为他们对网络环境不熟悉,在访问内容时往往受限于网络平台的规定。例如,在某些情况下他们可能只能访问到特定类型的资源而无法自由探索其他内容

用户越活跃,越倾向于浏览冷门的物品。

以用户行为数据为基础设计的推荐系统通常被归类为协同过滤系统。学术界对协同过滤方法展开了深入研究,并提出了一系列相关技术包括基于邻域的技术、隐因子模型以及图遍历方法等。在这些方法中 standout 的便是基于邻域的技术,在工业界也得到了广泛的应用。其中基于邻域的方法主要包括以下两种实现方式。

基于用户体验的协同过滤机制:这种算法为用户提供与他兴趣相似的其他用户的商品推荐。

基于物品的协同过滤算法:该算法为用户提供基于其之前互动过的物品所具有的相似兴趣特性的其他商品作为推荐

2.3 实验设计和算法评测

2.3.1 数据集

MovieLens数据集,https://grouplens.org/datasets/movielens/

2.3.2 实验设计

本节介绍的协同过滤算法离线实验通常遵循以下步骤:随后,在本章中采用均匀分布的方式将用户的互动数据划分为M个子集(其中设定M=8)。选择其中一个子集作为测试组,并使用其余M-1个子集构成训练数据。基于收集到的训练数据信息构建用户的兴趣模型,并利用测试组的数据对用户的潜在行为进行推测。计算相应的性能评估指标。为了防止评估结果因过拟合而失去实际意义,请确保上述过程重复进行共M次,并每次选取不同的子集作为测试组。最后计算所有实验结果的平均值以获得最终性能评估标准。

2.3.3 评测指标

对用户u提供的N个物品(表示为R(u)),在测试集中被用户u标记喜欢的物品构成集合T(u),接着采用精确率与召回率作为评估指标来衡量推荐系统的性能。

召回率用于衡量有多少比例的用户—物品评分记录存在于最终的推荐列表中;而准确率则衡量有多少比例的这些记录已经在推荐列表中存在。

覆盖率为高则表明推荐算法具备了较高的潜力来挖掘长尾资源,并且能够成功地将这些资源精准地推荐给目标用户。

作为衡量推荐结果新颖程度的标准指标,使用推荐列表中物品的平均热度来评估其新奇程度。若所推选的商品较为火爆,则该方案的实际新颖性较低;反之,则表明该类商品在整体评价中的表现较为突出。

复制代码
 def Popularity(train, test, N):

    
     item_popularity = dict()
    
     for user, items in train.items():
    
     for item in items.keys()
    
         if item not in item_popularity:
    
             item_popularity[item] = 0
    
         item_popularity[item] += 1
    
     ret = 0
    
     n = 0
    
     for user in train.keys():
    
     rank = GetRecommendation(user, N)
    
     for item, pui in rank:
    
         ret += math.log(1 + item_popularity[item])
    
         n += 1
    
     ret /= n * 1.0
    
     return ret

2.4 基于邻域的算法

根据邻居的算法分为两大类:一类是基于用户的协同过滤方法;另一类是基于物品的协同过滤方法。

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

1. 基础算法

在一个在线个性化推荐系统中存在这样的情况:当一个用户A需要个性化推荐时可以通过寻找与他具有共同兴趣的其他用户来确定目标群体 然后将那些被这些相似用户的喜好所吸引但尚未被A了解的商品进行介绍 这种方法通常被称为基于用户的协同过滤算法

基于用户的协同过滤算法主要包括两个步骤。

(1) 找到和目标用户兴趣相似的用户集合。

本系统旨在识别出该集合中受到用户欢迎的所有物品,并根据目标用户的特定需求筛选出尚未被其了解的关键产品进行推荐。

步骤(1)的核心在于计算两个用户的兴趣相似度。协同过滤算法主要依据行为间的相似度来推断兴趣间的相似度。

给定两个用户u和v,在考虑他们各自的偏好时

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

以余弦相似度为例,实现该相似度可以利用如下的伪码:

复制代码
 def UserSimilarity(train):

    
     W = dict()
    
     for u in train.keys():
    
     for v in train.keys():
    
         if u == v:
    
             continue
    
         W[u][v] = len(train[u] & train[v])
    
         W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)
    
     return W

该方法的时间复杂度为O(|U|^2),在用户数量极大的情况下运行效率显著下降。为此,我们首先需要计算出

|Nap N|eq 0

的用户对(u,v),然后再对这种情况除以分母

qrt{|N||N|}

为了实现这一目标, 我们可以首先构建一个基于倒排表的数据模型, 该模型用于记录每个物品所关联的所有产生过相关行为的用户信息。随后, 我们将遍历每个物品对应用户的列表, 并对每对不同的用户提供方程组中的变量进行计数, 最终能够确定任意两个非零相关的用户提供方程组中的变量。

复制代码
 def UserSimilarity(train):

    
     # build inverse table for item_users
    
     item_users = dict()
    
     for u, items in train.items():
    
     for i in items.keys():
    
         if i not in item_users:
    
             item_users[i] = set()
    
         item_users[i].add(u)
    
     #calculate co-rated items between users
    
     C = dict()
    
     N = dict()
    
     for i, users in item_users.items():
    
     for u in users:
    
         N[u] += 1
    
         for v in users:
    
             if u == v:
    
                 continue
    
             C[u][v] += 1
    
     #calculate finial similarity matrix W
    
     W = dict()
    
     for u, related_users in C.items():
    
     for v, cuv in related_users.items():
    
         W[u][v] = cuv / math.sqrt(N[u] * N[v])
    
     return W

通过计算用户间的兴趣相似度后

复制代码
 def Recommend(user, train, W):

    
     rank = dict()
    
     interacted_items = train[user]
    
     for v, wuv in sorted(W[u].items, key=itemgetter(1), reverse=True)[0:K]:
    
     for i, rvi in train[v].items:
    
         if i in interacted_items:
    
             #we should filter items user interacted before
    
             continue
    
         rank[i] += wuv * rvi
    
     return rank

参数K是UserCF中的一个重要参数;它的调整会对推荐算法的各项指标产生显著的影响。

准确率和召回率是推荐系统的评估标准(准确率和召回率),它们并不呈现参数K的非线性相关关系

(2)流行度,K越大则UserCF推荐结果就越热门。

(3)覆盖率,K越大则UserCF推荐结果的覆盖率越低。

2. 用户相似度计算的改进

两个用户曾对冷门物品采取相同的行为这进一步表明他们的兴趣之间具有一定的相似程度。通过分析用户的各项行为数据我们可以量化并计算出其兴趣之间的相似程度。

该算法通过引入与用户u、v共同关注的热门商品作为权重因素,在计算他们之间的相似度时施加影响,并命名为User-IIF算法。

复制代码
 def UserSimilarity(train):

    
     # build inverse table for item_users
    
     item_users = dict()
    
     for u, items in train.items():
    
     for i in items.keys():
    
         if i not in item_users:
    
             item_users[i] = set()
    
         item_users[i].add(u)
    
     #calculate co-rated items between users
    
     C = dict()
    
     N = dict()
    
     for i, users in item_users.items():
    
     for u in users:
    
         N[u] += 1
    
         for v in users:
    
             if u == v:
    
                 continue
    
             C[u][v] += 1 / math.log(1 + len(users))
    
     #calculate finial similarity matrix W
    
     W = dict()
    
     for u, related_users in C.items():
    
     for v, cuv in related_users.items():
    
         W[u][v] = cuv / math.sqrt(N[u] * N[v])
    
     return W

相对于传统的UserCF算法而言,该方法在各项性能指标上表现稍好于传统方法。这也表明,在计算用户兴趣相似度的过程中引入物品的流行度有助于提高推荐系统的实际效果。

3. 实际在线系统使用UserCF的例子

UserCF在目前的实际应用中使用并不多。其中最著名的使用者是Digg。

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

1. 基础算法

基于用户的协同过滤算法的缺点:

随着网站用户的数量呈快速增长趋势不断增加,在计算用户的兴趣相似度矩阵时会变得愈发具有挑战性;同时,在这一过程中,计算时间复杂度与空间复杂度的增长速率与其用户数量之间的关系大致呈现平方增长的趋势。

(2)基于用户的协同过滤很难对推荐结果作出解释。

基于内容的协同过滤算法(缩写为ItemCF)为用户提供与他们 previously liked items高度相关的 item recommendations. ItemCF algorithm primarily relies on analyzing user behavior patterns rather than item content attributes to compute item similarities. Its fundamental premise is that items A and B exhibit significant similarity due to the extensive overlap in preferences shared by users who favor item A.

该算法以物品为基础进行协同过滤,并通过用户的使用历史为推荐结果提供合理的理由。

基于物品的协同过滤算法主要分为两步。

(1) 计算物品之间的相似度。

(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。

为了避免推荐出热门的物品,可以用下面的公式计算物品的相似度:

在协同过滤机制中,两个物品之间的相似度是由于它们之间拥有广泛的共同用户偏好所导致的。因此,在协同过滤系统中,每个用户的个人兴趣列表实际上是在为这些物品施加各自的偏好影响。

类似于基于用户的协同过滤算法,当采用基于项的协同过滤方法进行商品相似度计算时,则需要为每个用户构建其收藏的物品列表。(即为每个用户创建一个包含其收藏的物品列表)接着,在构建共现矩阵C的过程中,则需要将每个用户的收藏列表中的每一项与其它所有项目进行配对计数。

复制代码
 def ItemSimilarity(train):

    
     #calculate co-rated users between items
    
     C = dict()
    
     N = dict()
    
     for u, items in train.items():
    
     for i in users:
    
         N[i] += 1
    
         for j in users:
    
             if i == j:
    
                 continue
    
             C[i][j] += 1
    
     #calculate finial similarity matrix W
    
     W = dict()
    
     for i,related_items in C.items():
    
     for j, cij in related_items.items():
    
         W[u][v] = cij / math.sqrt(N[i] * N[j])
    
     return W

基于获得的各物品间的相似度后, ItemCF利用以下公式计算用户u对物品j的兴趣

与用户的兴趣历史相关的物品可能会被包含在用户的推荐列表中,并且通常会获得较高的排名位置;这些物品越接近用户的兴趣历史相关性越高。

复制代码
 def Recommendation(train, user_id, W, K):

    
     rank = dict()
    
     ru = train[user_id]
    
     for i,pi in ru.items():
    
     for j, wj in sorted(W[i].items(), key=itemgetter(1), reverse=True)[0:K]:
    
         if j in ru:
    
             continue
    
         rank[j] += pi * wj
    
     return rank

ItemCF的一个特点是能够提供推荐理由, 即基于用户的购买历史和偏好来帮助理解当前的推荐结果.

ItemCF算法在不同K值下的性能:

(1)准确性:ItemCF推荐系统的准确性与参数K之间并不存在严格的正相关或负相关关系,在这种情况下就需要进行合理的参数选取以获得最佳的准确性值。
(2)影响力:与UserCF算法不同的是,在ItemCF模型中参数K对推荐结果的影响力并非呈现出完全线性变化的关系,在这种情况下随着参数K值的增大推荐结果的热度会呈现出一种先缓慢上升再趋于平稳的变化特征。
(3)覆盖范围:当系统中的参数K不断增大时其覆盖范围随之出现下降趋势。

2. 用户活跃度对物品相似度的影响

在计算物品间的相似性时,在考虑各用户的贡献权重后发现:活跃型用户的影响力应低于非活跃型用户。该算法建议引入IUF参数(其中逆向文档频率是对数形式表示),以修正计算出的物品相似度值。

算法记为ItemCF-IUF。

复制代码
 def ItemSimilarity(train):

    
     #calculate co-rated users between items
    
     C = dict()
    
     N = dict()
    
     for u, items in train.items():
    
     for i in users:
    
         N[i] += 1
    
         for j in users:
    
             if i == j:
    
                 continue
    
             C[i][j] += 1 / math.log(1 + len(items) * 1.0)
    
     #calculate finial similarity matrix W
    
     W = dict()
    
     for i,related_items in C.items():
    
     for j, cij in related_items.items():
    
         W[u][v] = cij / math.sqrt(N[i] * N[j])
    
     return W

3. 物品相似度的归一化

在研究中发现若采用ItemCF的相似度矩阵进行最大值归一化处理,则能显著提升推荐系统的准确性

实际上归一化的好处不仅在于提高推荐的准确性,还可以提升推荐覆盖范围以及内容多样性

通常情况下,在推荐系统中对热门类别内部的商品相似度较高时,在不进行归一化处理的情况下会导致推荐系统倾向于优先展示这类较热门的商品。这将导致推荐系统的覆盖范围相对较低。相反地,在对相似度进行归一化处理后,则能够显著提升推荐系统的覆盖范围和多样性。

2.4.3 UserCF和ItemCF的综合比较

在UserCF模型中进行推荐的行为更加社交化,在这种做法能够反映出基于用户的小范围兴趣群内商品的关注度;相比之下,在ItemCF模型中的推荐则更为个性化,在这种做法则能够体现出基于用户的个人兴趣传承。

UserCF主要应用于新闻内容的个性化推荐,在图书销售平台、电子商务平台以及电影在线服务网站中,ItemCF则能够展现出显著的优势。例如亚马逊 Kindle商店、豆瓣小组页面以及Netflix电影流媒体平台上

在技术层面分析,在数据存储方面,在用户的数量显著增加时,在物品的数量显著提升的情况下

哈利波特问题

很多书都和《哈利波特》相关,因为《哈利波特》太热门了。

哈利波特问题有几种解决方案。

(1)在分母上加大对热门物品的惩罚

其中

lpha n

[0.5 ,1]。通过提高α,就可以惩罚热门的j。

采用这种方法可以在一定程度上,在牺牲一定的精确度和召回率指标的前提下,明显提高结果的覆盖范围与新颖度(通过降低其流行度来提高其新颖性)。

(2)引入物品的内容数据

2.5 隐语义模型

2.5.1 基础算法

潜在因子模型(LFM, latent factor model)的核心思想是利用潜在因子将用户兴趣与物品进行关联

首先,我们从该用户的兴趣类别中获取相关数据;接着,在这些类别中筛选出与用户潜在偏好的匹配项。

总结一下,这个基于兴趣分类的方法大概需要解决3个问题。

(1)如何给物品进行分类?

(2)如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?

(3)在某个预设类别中,请筛选出该类别相关的商品,并对这些商品进行展示供用户参考;同时,请详细说明这些商品在该类别中的重要性程度,并介绍其计算依据或标准。

对于第一个问题:如何给物品进行分类?

简单解决方案是找编辑给物品分类,编辑给出的分类仍然具有以下缺点:

a、编辑的意见不能代表各种用户的意见。

b、编辑很难控制分类的粒度。

c、编辑很难给一个物品多个分类。

d、编辑很难给出多维度的分类。

e、编辑很难决定一个物品在某一个分类中的权重。

研究者探讨:为何不从数据中自动生成这些类别并实现个性化推荐?由此产生的隐含语义分析方法(简称LSA)应运而生。该方法通过基于用户行为数据的自动聚类策略有效地解决了上述关键问题。

a、编辑的意见无法代表所有用户的观点,但隐含语义分析技术通过统计用户的使用行为来生成分类信息。该技术与ItemCF在分
类思路上相似:若两个物品被大量用户同时喜欢,则它们很可能属于同一类别。
b、编辑难以精确设定分类的具体粒度,在这种情况下我们可以设定最终的目标类别数量:粒度越大,
类别划分越细致;反之则更为粗略。
c、编辑无法将一个物品分配到多个类别中:相反,
该技术能够计算出物品与各个类之间的关联程度。
d、编辑难以基于多维度特征进行分类:然而,
LFM模型会根据用户的共同兴趣自动确定合适的维度。
e、编辑无法单独设定某个类别的权重:系统会根据用户的使用行为来评估每个物品的重要性

相关方法:概率主题模型(probabilistic latent semantic analysis)、线性判别分析(linear discriminant analysis)、潜在类别分析模型(Latent Class Analysis Model)、潜在主题模型(Latent Topic Model)、因子分解技术(Factorization Techniques)

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

在该公式中 pu,k 和 qi,k 是模型的参数,在这种情况下 pu,k 表示用户 u 的兴趣与第 k 个隐类之间的关系,在这种情况下 qi,k 则代表第 k 个隐类与物品 i 之间的关系

在隐性反馈数据集中采用LFM应对TopN推荐的第一个关键问题即在于为每个用户生成负样本

对负样本采样时应该遵循以下原则。

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

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

虽然某件事物非常受欢迎但仍无相应行动则更能体现该事物未能引起用户的兴趣。这是因为对于冷门事物用户可能根本未在网站上发现该事物因而无法判断其兴趣程度

复制代码
 def RandomSelectNegativeSample(self, items):

    
     ret = dict()
    
     for i in items.keys():
    
     ret[i] = 1
    
     n = 0
    
     for i in range(0, len(items) * 3):
    
     item = items_pool[random.randint(0, len(items_pool) - 1)]
    
     if item in ret:
    
         continue
    
     ret[item] = 0
    
     n + = 1
    
     if n > len(items):
    
         break
    
     return ret

采样后,需要优化如下的损失函数来找到最合适的参数p和q:

为了最小化上面定义的损失函数(式①),我们可以采用一种被称为随机梯度下降法的方法。此方法属于最优化理论中最基本的核心技术之一。它首先通过计算参数梯度确定最快收敛的方向,并采用迭代更新的方式逐步调整参数值以实现最优解。

rac{artial C}{artial p_{uk}} = -2q_{ik}*e_{ui} + 2ambda p_{uk}
rac{artial C}{artial q_{ik}} = -2p_{uk}*e_{ui}+ 2ambda q_{ik}

其中,

e_{ui} = r_{ui}-um_{k=1}^{K}p_{uk}q_{ik}

基于随机梯度下降算法,在优化过程中需将参数按照最小化损失函数的方向进行更新以获得递推公式

p_{uk} = p_{uk} + lpha
q_{ik} = q_{ik} + lpha

其中,α是学习速率(learning rate),它的选取需要通过反复实验获得。

复制代码
 def LatentFactorModel(user_items, F, N, alpha, lambda):

    
     [P, Q] = InitModel(user_items, F)
    
     for step in range(0,N):
    
     for user, items in user_items.items():
    
         samples = RandSelectNegativeSamples(items)
    
         for item, rui in samples.items():
    
             eui = rui - Predict(user, item)
    
             for f in range(0, F):
    
                 P[user][f] += alpha * (eui * Q[item][f] - lambda * P[user][f])
    
                 Q[item][f] += alpha * (eui * P[user][f] - lambda * Q[item][f])
    
                 alpha *= 0.9
    
 def Recommend(user, P, Q):
    
     rank = dict()
    
     for f, puf in P[user].items():
    
     for i, qfi in Q[f].items():
    
         if i not in rank:
    
             rank[i] += puf * qfi
    
     return rank

在LFM模型中存在四个关键参数:

  1. 隐特征的数量F;
  2. 学习速率alpha;
  3. 正则化参数lambda;
  4. 负样本与正样本的比例proportion。
    实验结果表明,在LFM模型中比例参数对模型性能具有决定性影响。
    具体而言,在负样本数量逐渐增大的过程中,
    准确性与召回率均呈现显著提升,
    然而当比例超过10时,
    准确性与召回率的变化趋缓并最终趋于稳定。
    值得注意的是,
    随着负样本数量的增加,
    覆盖范围持续下降,
    而推荐结果的热度持续上升,
    这表明比例参数在一定程度上调控着算法对长尾物品的挖掘能力。

2.5.2 基于LFM的实际系统的例子

雅虎的研究人员利用前文提到的LFM预测用户是否会单击链接:

LFM模型在实际应用中存在一个局限性,即难以实现实时性推荐。传统的LFM模型在每一次参数更新过程中都需要遍历所有的用户行为数据集,以便计算出每个用户的隐特征向量(pu)以及每条物品的隐特征向量(qi)。然而,由于LFM算法需要对这些数据集进行多次迭代才能获得较好的性能评估,这使得每一次参数更新都显得十分耗时,从而导致只能每天进行一次这样的参数更新操作,并最终无法及时更新每个用户的推荐结果以适应其最近的行为模式变化

为了应对传统LFM在实时性上的不足与产品需求的冲突,雅虎的研究团队设计了一个解决方案。该方案具体来说分为两个主要部分。首先,在分析新闻链接的内容属性时(如关键词和类别等),他们能够提取出链接i的内容特征向量yi。其次,在实时收集用户对链接的行为数据后(如用户的点击频率等),他们能够计算出链接i的隐特征向量qi。然后,在上述基础上利用公式预测用户u是否会单击链接i: y_i = f(q_i)

其中,yi由物品的内容属性直接生成;xuk代表用户u对内容特征k的兴趣程度;用户的兴趣向量xu可以通过其历史行为数据获取;此外,在计算过程中仅需每天进行一次;而pu和qi则是基于实时获取用户的最近一段时间内的行为数据训练得到的模型参数。

2.5.3 LFM和基于邻域的方法的比较

LFM 基于邻域的方法
理论基础 具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型。 更多的是一种基于统计的方法,并没有学习过程
离线计算的空间复杂度 如果是F个隐类,那么它需要的存储空间是O(F*(M+N)),这在M和N很大时可以很好地节省离线计算的内存。 基于邻域的方法需要维护一张离线的相关表。在离线计算相关表的过程中,如果用户/物品数很多,将会占据很大的内存。假设有 M 个用户和 N 个物品,那么假设是用户相关表,则需要O(M *M)的空间,而对于物品相关表,则需要O(N *N)的空间。
离线计算的时间复杂度 如果用 F 个隐类,迭代 S 次,那么它的计算复杂度是O(K * F * S) 假设有 M 个用户、 N 个物品、 K 条用户对物品的行为记录。那么,UserCF计算用户相关表的时间复杂度是O(N * (K /N)^2),而ItemCF计算物品相关表的时间复杂度是O(M *(K /M)^2)
在线实时推荐 可以在线进行实时的预测 不能进行在线实时推荐
推荐解释 支持很好的推荐解释 无法提供解释

2.6 基于图的模型

2.6.1 用户行为数据的二分图表示

用户行为数据由许多二元组构成,每个二元组(u, i)代表用户u对物品i发生过行为。这种数据集通常可以用一个二分图①来表示。

2.6.2 基于图的推荐算法

将个性化推荐算法嵌入到二分图模型中相当于将推荐任务转换为评估这些不相邻的物品节点之间的关联程度,在图论中通常使用相似度指标来量化这种关联性;因此关联程度越高的物品被赋予更高的权重。

图中顶点的相关性主要取决于下面3个因素:

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

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

(3)两个顶点之间的路径经过的顶点。

相关性高的一对顶点一般具有如下特征:

(1)两个顶点之间有很多路径相连;

(2)连接两个顶点之间的路径长度都比较短;

(3)连接两个顶点之间的路径不会经过出度比较大的顶点。

基于随机游走的PersonalRank算法

为实现为用户u提供高度个性化的推荐目标,在基于用户的二分图模型中,默认从节点 vu 出发展开随机游走过程。当随机游走到任一节点时,默认按照概率α决定是否继续执行下一步骤:若决定继续,则从当前节点指向的节点集合中按照均匀分布的概率选择一个目标节点作为下一步访问的目标;若停止,则以当前节点作为候选结果返回给推荐系统进行结果评估与反馈机制调用。经过大量轮次的随机游走操作后,每个物品节点被访问到的概率会稳定收敛至一个确定值;最终系统将根据各物品结点的访问概率值大小对相应商品信息进行排序并输出至结果列表区域。

复制代码
 def PersonalRank(G, alpha, root):

    
     rank = dict()
    
     rank = {x:0 for x in G.keys()}
    
     rank[root] = 1
    
     for k in range(20):
    
     tmp = {x:0 for x in G.keys()}
    
     for i, ri in G.items():
    
         for j, wij in ri.items():
    
             if j not in tmp:
    
                 tmp[j] = 0
    
             tmp[j] += 0.6 * rank[i] / (1.0 * len(ri))
    
             if j == root:
    
                 tmp[j] += 1 - alpha
    
     rank = tmp
    
     return rank

虽然PersonalRank算法基于随机游走模型具有良好的理论基础 但该算法在计算复杂度方面存在明显的不足

针对PersonalRank算法时间复杂度过高的问题提出了解决方案:(1)降低迭代次数,在收敛条件满足之前终止计算。这将导致最终结果精度有所下降,但通常不会造成显著的影响。(2)基于矩阵理论进行优化改进现有算法结构以提高效率

全部评论 (0)

还没有任何评论哟~