作者:18cyl
时间:2021-8-24
一、什么是用户行为数据
用户行为数据在网站上最简单的存在方式就是日志。网站在运行过程中都产生大量原始日志,并将其存储在文件系统中。原始日志经过汇总后可以形成会话日志(按照用户行为汇总)。如为查询生成展示日志,为点击操作生成点击日志。在日志中存储的统一形式可以是:(user_id,item_id,behavior_type行为类型,context上下文信息,behavior_weight行为权重,behavior_content行为内容)
用户行为在个性化推荐系统中一般分为两种:
- 显性反馈行为:用户明确表示对物品喜好的行为。如:关注、不喜欢、喜欢、评分、收藏
- 隐性反馈行为:不能明确表示用户喜好的行为。如:浏览页面、足迹、观看视频日志、听歌日志
按照 反馈的方向分则有正反馈、负反馈
二、用户行为分析
用户行为中总是蕴含着一些普遍规律,而通过分析这些行为进而为用户推荐物品是一个典型的数据挖掘问题。
长尾分布:在互联网上的很多数据(对k个物品产生过行为的用户数、被k个用户产生过行为的物品数)都满足长尾分布(类似二八定理)。即
f
(
x
)
=
α
x
k
f(x) = \alpha x^k
f(x)=αxk
(满足长尾分布的数据在双对数坐标轴上近似为一个直线)
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法:
- 基于用户的协同过滤算法:给用户推荐和他兴趣相似的其他用户喜欢的物品。
- 基于物品的协同过滤算法:给用户推荐和他喜欢的物品相似的物品。
基于用户的协同过滤算法
基于用户的协同过滤算法主要包括两个步骤:
- 找到和目标用户兴趣相似的用户集合。关键在于用户相似度评价
- 找到这个集合用的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
步骤 1 的关键是根据用户行为计算用户兴趣相似度。可以通过Jaccard公式简单地计算u和v的兴趣相似度:
w
u
v
=
∣
N
(
u
)
⋂
N
(
v
)
∣
∣
N
(
u
)
⋃
N
(
v
)
∣
w_{uv} = \frac{|N(u)\bigcap N(v)|}{|N(u)\bigcup N(v)|}
wuv=∣N(u)⋃N(v)∣∣N(u)⋂N(v)∣
或者是通过余弦相似度计算:
w
u
v
=
∣
N
(
u
)
⋂
N
(
v
)
∣
∣
N
(
u
)
∣
∣
N
(
v
)
∣
w{uv} = \frac{|N(u)\bigcap N(v)|}{\sqrt{|N(u)||N(v)|}}
wuv=∣N(u)∣∣N(v)∣∣N(u)⋂N(v)∣
在计算相似的的时候时间复杂度是O(n^2)的,在用户数量极大的情况下几乎无法使用。而且因为绝大多数用户之间相似度为0,因此可以考虑建立物品-用户倒查表来加快这一进程。(即为每个物品存储一个用户记录表)
计算过程则可以为:
- 初始化用户相似度二维矩阵C
- 扫描物品-用户倒查表
- 为同一物品的不同用户之间相似度+1.如:物品v有三个用户a、b、c`1+则为C_ab、C_ac、C_bc均**+1**
得到用户之间的兴趣相似度之后,UserCF算法会给用户w推荐和他兴趣最相似的K个用户喜欢的物品i:
p
(
u
,
i
)
=
∑
v
∈
S
(
u
,
K
)
⋂
N
(
i
)
w
u
v
r
v
i
p(u,i) = \sum_{v\in S(u,K)\bigcap N(i)} w_{uv}r_{vi}
p(u,i)=v∈S(u,K)⋂N(i)∑wuvrvi
其中 S(u,k)为与用户u最相近的K个用户,N(i)是对物品i有过行为的用户的集合,W_uv代表用户u与v之间的相似度,r_vi代表用户v对物品i的喜爱程度。而对于UserCF算法来说K是一个很重要的参数。K越大最终得出来的推荐覆盖率越低,流行度越高(因为k越大,用户之间的喜好最相同的往往是热门产品,而这也没有啥子推荐意义)。随着K从小到大,准确率与召回率一般都会经历一个从小到大然后在变小的过程。
用户相似度计算的改进
- 问题1:如果两个用户同时购买《新华字典》,这并不能说明他们兴趣相似,而是因为这本书是热门物品。一般情况下两个用户同时对冷门物品感兴趣则代表他们兴趣相同。也就是说在兴趣相似度计算时需要对热门物品进行适当惩罚。
W u v = ∑ i ∈ N ( u ) ⋂ N ( v ) 1 l o g 1 + ∣ N ( i ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ W_{uv} = \frac{\sum_{i\in N(u)\bigcap N(v)}\frac{1}{log1 + |{N(i)|}}}{\sqrt{|N(u)||N(v)|}} Wuv=∣N(u)∣∣N(v)∣∑i∈N(u)⋂N(v)log1+∣N(i)∣1
可 以 看 到 该 公 式 通 过 1 l o g 1 + ∣ N ( i ) ∣ 惩 罚 了 用 户 u 与 用 户 v 共 同 兴 趣 列 表 中 热 门 物 品 对 他 们 相 似 度 的 影 响 。 可以看到该公式通过 \frac{1}{log1+|N(i)|} 惩罚了用户u与用户v共同兴趣列表中热门物品对他们相似度的影响。 可以看到该公式通过log1+∣N(i)∣1惩罚了用户u与用户v共同兴趣列表中热门物品对他们相似度的影响。
基于物品的协同过滤算法
基于物品的协同过滤算法主要分为两步:
- 计算物品之间的相似度。近似度计算的对象从人变成了物品。
- 根据物品的相似度和用户的历史行为给用户生成推荐列表
计算过程为:
- 初始化物品相似度二维矩阵C,并建立用户-物品倒排表(对每个用户建立一个包含他喜欢的物品的列表)
- 扫描用户-物品倒排表
- 为同一用户的不同物品两两之间相似度+1.
I
t
e
m
C
F
通
过
如
下
公
式
计
算
用
户
u
对
一
个
物
品
i
的
兴
趣
:
P
u
j
=
∑
i
∈
N
(
u
)
⋂
S
(
i
,
K
)
w
j
i
r
u
i
ItemCF通过如下公式计算用户u对一个物品i的兴趣: P_{uj} = \sum_{i\in N(u)\bigcap S(i,K)}w_{ji}r_{ui}
ItemCF通过如下公式计算用户u对一个物品i的兴趣:Puj=i∈N(u)⋂S(i,K)∑wjirui
进度和流行度都不随着K增加呈正相关或者负相关,但K增加会降低系统的覆盖率。
用户活跃度对物品相似度的影响
应该削减活跃用户对于物品相似度的影响,所以对活跃用户进行适当惩罚。
W
i
j
=
∑
u
∈
N
(
i
)
⋂
N
(
j
)
1
l
o
g
1
+
∣
N
(
u
)
∣
∣
N
(
i
)
∣
∣
N
(
j
)
∣
W_{ij} = \frac{\sum_{u\in N(i)\bigcap N(j)}\frac{1}{log1 + |{N(u)|}}}{\sqrt{|N(i)||N(j)|}}
Wij=∣N(i)∣∣N(j)∣∑u∈N(i)⋂N(j)log1+∣N(u)∣1
上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,为了避免相似度矩阵过于稠密,在实际的计算中一般会直接忽略他的兴趣列表,不将其纳入到相似度计算的数据集中。
物品相似度的归一化
一般来说,物品总是属于很多不同的类,每一类中的物品联系比较紧密。在纪录片之间的相似度纪录片与动画片之间的相似度。然而纪录片与动画片的数量不同导致纪录片与纪录片之间的相似度远高于动画片与动画片之间的相似度。而这是不合理的。所以热门的类其类内物品相似度一般比较大。如果不进行归一化就会推荐热门的类内物品。
所以对于不同的类进行归一化操作是很有必要的。
UserCF与ItemCF的综合比较
- UserCF着重于反应和用户兴趣相似的小群体的热点,而ItemCF的推荐结果着重于维系用户的历史兴趣。
- UserCF的推荐更加社会化,而ItemCF的推荐结果更加个性化,反映了用户自己的兴趣传承。
- 在用户兴趣不是特别细化并且对热门要求比较高的新闻领域UserCF相对较好。
- 在图书、电子商务、电影网站这类对热门程度并不是那么敏感并且对物品偏好相对明显的领域ItemCF更加优势。
- 从技术上考虑,UserCF需要维护一个用户相似度矩阵,在用户数量非常大的情况下,对内存的要求很高。而ItemCF维护物品相似度矩阵,在物品数量大的情况下,对内存要求高。
- 总体来讲,上述基础版的ItemCF在离线测评的各项指标上不如UserCF,但其实在优化过后的在线使用最终两者的离线性能是近似的。
隐语义模型
在UserCF与ItemCF中使用的数据是具有明确物理含义的特征向量:(用户id,喜欢\不喜欢,物品id,等等)。用户的浏览数据、购买数据、收藏数据等等作为特征向量的一项也有明确的物理意义。在使用这些有明确物理意义的特征向量去计算相似度矩阵然后通过相似度矩阵去为用户进行推荐的时候有一个巨大的问题是相似度矩阵是稀疏的,同时语义信息等重要上下文信息并不能参数化。构建好的用户-物品喜好矩阵也是稀疏的。然而使用隐语义模型的意思则是通过某种数学方法为每个用户与每个物品都分别构建k维特征向量。而这k维向量一般是通过机器学习训练得到、或者是矩阵分解算法、自然语言处理等方式得到。
LFM(latent factor model)隐语义模型依托于隐含语义分析技术(latent variable analysis),可以采取基于用户行为的自动聚类来自动地为物品及用户分类,而不需要太多专家知识。特征向量之间的欧氏距离(或其他距离)小则代表两个物品(用户)特征(兴趣)相似。并且还可以灵活设置聚类的粒度来应用于不同的场景。
L
F
M
通
过
公
式
P
e
r
f
e
r
e
n
c
e
(
u
,
i
)
=
r
u
i
=
p
u
T
q
i
=
∑
f
=
1
F
p
u
,
k
q
i
,
k
计
算
用
户
u
对
物
品
i
的
兴
趣
。
LFM通过公式 Perference(u,i) = r_{ui} = p_u^Tq_i = \sum_{f=1}^F p_{u,k}q_{i,k} 计算用户u对物品i的兴趣。
LFM通过公式Perference(u,i)=rui=puTqi=f=1∑Fpu,kqi,k计算用户u对物品i的兴趣。
负样本采集原则:
- 对每个用户,要保证正负样本的平衡
- 对每个用户采集负样本时,要选取那些很热门,而用户却没有行为的物品
在Perference(u,i)公式中p与q为未知参数。(特征向量)可以通过梯度下降法来求得:
C
=
∑
(
u
,
i
)
∈
K
(
r
u
i
−
r
^
u
i
)
2
=
∑
(
u
,
i
)
∈
K
(
r
u
i
−
∑
f
=
1
F
p
u
,
k
q
i
,
k
)
2
+
λ
∣
∣
p
u
∣
∣
2
+
λ
∣
∣
q
i
∣
∣
2
C= \sum_{(u,i)\in K}(r_{ui}-\hat r_{ui})^2 = \sum_{(u,i)\in K}(r_{ui} - \sum_{f=1}^Fp_{u,k}q_{i,k})^2 + \lambda||p_u||^2+\lambda||q_i||^2
C=(u,i)∈K∑(rui−r^ui)2=(u,i)∈K∑(rui−f=1∑Fpu,kqi,k)2+λ∣∣pu∣∣2+λ∣∣qi∣∣2
在采用梯度下降法求p_uk与q_ik的时候,偏导数分别是。
∂
C
∂
p
u
k
=
−
2
q
i
k
+
2
λ
p
u
k
\frac {\partial C } {\partial p_{uk} } = -2q_{ik} +2\lambda p_{uk}
∂puk∂C=−2qik+2λpuk
∂ C ∂ q i k = − 2 q i k + 2 λ q i k \frac {\partial C } {\partial q_{ik} } = -2q_{ik} +2\lambda q_{ik} ∂qik∂C=−2qik+2λqik
然后根据随机梯度下降法,将参数沿着最速下降方向向前推进,以你可以得到:
p
u
k
=
p
u
k
−
α
(
q
i
k
−
λ
p
u
k
)
p_{uk} = p_{uk} - \alpha(q_{ik}-\lambda p_{uk})
puk=puk−α(qik−λpuk)
q i k = q i k − α ( p u k − λ q i k ) q_{ik} = q_{ik} - \alpha(p_{uk}-\lambda q_{ik}) qik=qik−α(puk−λqik)
在LFM中,重要的参数有4个:
- 隐特征的个数F
- 学习速率alpha
- 正则化参数lambda
- 负样本\正样本的比例ratio
通过实验发现ratio对实验的影响最大,一般通过实验获得。
LFM和基于邻域的方法的比较
- LFM具有比较好的理论基础,是一种机器学习方法。而基于邻域的方法更多的是一种基于统计的方法。
- LFM在离线计算过程中空间复杂度远小于基于邻域的方法
- 时间复杂度上两者没有本质的区别
- LFM不太适用于物品数量非常大的系统,并且难以满足实时任务。而基于邻域的方法可以在线实时推荐。
- LFM的推荐解释性不如基于邻域的方法。
基于图的模型
重点与将用户行为抽象成为图模型。然后采用图领域的相关算法进行计算。
令G(V,E)表示用户-物品二分图,其中V为用户顶点集合V_U与物品顶点集合V_I组成。对于数据集中的每一个二元组(u,i)图中都有一套对应的边e(v_u,v_i).
基于图的推荐算法:
给用户u推荐物品的任务就可以转化为度量用户顶点v_u和与v_u没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。
而度量图中两个节点的相关性主要取决于三个因素:
- 两个顶点之间的路径数
- 两个顶点之间的路径长度
- 两个顶点之间的路径经过的顶点
而相关性高的一对顶点一般具有如下特征:
- 两个顶点之间很多路径相连
- 连接两个顶点之间的路径长度都比较短
- 连接两个顶点之间的路径不会经过出度比较大的顶点。
而计算顶点之间相关性的方法有很多,其中典型的有基于随机游走PersonalRank算法(假设要给用户u进行个性化推荐):
- 从用户u对应的阶段v_u开始在用户-物品二分图上进行随机游走
- 游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从v_u节点开始重新游走
- 如果决定继续游走,那么就随机选择一个结点作为下一个节点。
- 这样经过多次随机游走之后,每个物品节点被访问到的概率会逐渐收敛,访问物品的频率对应相应的相似度
上述周可以抽象成如下公式:
P
R
(
v
)
=
{
α
∑
v
.
∈
i
n
(
v
)
P
R
(
v
‘
)
∣
o
u
t
(
v
‘
)
∣
(
v
≠
v
u
)
(
1
−
a
l
p
h
a
)
+
α
∑
v
‘
∈
i
n
(
v
)
P
R
(
v
‘
)
∣
o
u
t
(
v
‘
)
∣
(
v
=
v
u
)
PR(v) = \begin{cases} \alpha \sum_{v^. \in in(v)} \frac{PR(v^`)}{|out(v^`)|} & (v \neq v_u) \\ (1-alpha)+ \alpha \sum_{v^` \in in(v)} \frac{PR(v^`)}{|out(v^`)|} & (v = v_u) \end{cases}
PR(v)=⎩⎨⎧α∑v.∈in(v)∣out(v‘)∣PR(v‘)(1−alpha)+α∑v‘∈in(v)∣out(v‘)∣PR(v‘)(v=vu)(v=vu)
为了加快PersonalRank算法的执行速度有两种解决方法:
- 减小迭代次数
- 利用矩阵论,重新设计算法(这里没看懂)