推荐系统的任务就是联系用户和信息:
和搜索引擎一样,推荐系统也是一种帮助用户快速发现有用信息的工具。
推荐系统可以更好地发掘物品的长尾(long tail)。
如下方式决定最终看什么电影:
起初就让用户告诉自己兴趣的三个缺点:
购物车分析:
啤酒和尿布的故事,从用户行为数据中可以挖掘,不那么显而易见的规律。找出类似“购买A商品的用户都购买B商品”这种规律。
基于用户行为分析的推荐算法,即协同过滤算法。顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。
用户行为数据:原始日志->会话日志->展示日志->点击日志
用户行为分类:
用户活跃度和物品流行度的分布:
f u ( k ) f_u(k) fu(k)为对 k k k个物品产生过行为的用户数, f i ( k ) f_i(k) fi(k)被 k k k个用户产生过行为的物品数。 f u ( k ) f_u(k) fu(k)和 f i ( k ) f_i(k) fi(k)都满足长尾分布。
用户活跃度和物品流行度的关系:
不活跃用户:要么是新用户,要么是只来过网站一两次的老用户。
用户越活跃,越倾向于浏览冷门的物品
协同过滤算法:
数据集:MovieLens;
数据量:100w条,6000多用户,4000多电影;
数据划分方法:M折交叉验证;
评测指标:Recall,precision,覆盖率;
覆盖率:终的推荐列表中包含多大比例的物品;
步骤:
计算相似度:
相似的的计算复杂度非常大,这是一个很严重的问题,可以通过构建物品的倒排索引来解决这个问题。对于每个物品,和这个物品有关系的用户,对应的稀疏矩阵+K个物品。以下图解释,如何得到倒排表的:
对普通UserCF的小提升-UserCF-IIF:
考虑物品的流行度,加一个惩罚因子,来惩罚过度流行的商品。
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)\cap N(v)}\frac{1}{log(1+|N(i)|)}}{\sqrt{|N(u) \cup N(v)|}} wuv=∣N(u)∪N(v)∣∑i∈N(u)∩N(v)log(1+∣N(i)∣)1
用户ABCD,他们分别喜欢的物品时{a,b,d},{a,c},{b,e},{c,d,e}
。
ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要分析用户的行为记录计算物品相似度。
此处有点偏经验性,通过内兄属性计算也不是说不可以。
UserCF的缺陷:
Iterm-CF步骤:
相似度计算方法:
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{ij} = \frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}} wij=∣N(i)∣∣N(j)∣∣N(i)∩N(j)∣
分子: 即喜欢物品 i i i,也喜欢物品 j j j的用户数;
分母: N ( i ) N(i) N(i)喜欢物品 i i i的用户数, j j j类似;
和UserCF类似,使用物品倒排表来计算,物品相似度矩阵。下图简单说明,相似度矩阵是如何求得的。左边每一行代表一个用户喜欢的物品集合。
ItemCF计算一个用户 u u u对一个物品 j j j的兴趣:
p u j = ∑ i ∈ N ( u ) ∩ S ( j , k ) w j i r u i p_{uj} = \sum_{i\in N(u)\cap S(j,k)}w_{ji}r_{ui} puj=i∈N(u)∩S(j,k)∑wjirui
用户活跃度对物品相似度的影响:
我们可以认为,过于活跃的用户对物品相似度的贡献不如活跃度较差的,不过这里面也应该有一个阈值限制,不活跃的等级。为了修正活跃的用户对于相似度的贡献:
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)\cap N(j)}\frac{1}{log(1+|N(u)|)}}{\sqrt{|N(i)||N(j)|}} wij=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)log(1+∣N(u)∣)1
物品归一化相似度:
w i j ′ = w i j m a x j w i j w_{ij}' = \frac{w_{ij}}{max_jw_{ij}} wij′=maxjwijwij
通过物品归一化相似度,可以解决类内,类间,物品相似度差距比较大的问题。
UserCF | ItemCF | |
---|---|---|
推荐原理 | 推荐那些和用户有共同兴趣爱好的用户所喜欢的产品 | 给用户推荐和他之前喜欢的物品类似的物品 |
侧重方面 | 和用户兴趣相似的小群体的热点 | 维系用户的历史兴趣 |
群体 | 社会化 | 个性化 |
技术角度 | 用户相似度矩阵 | 用物品相似度矩阵 |
性能 | 适用于用户较少的场合 | 适用于物品数量较少的场合 |
领域 | 时效性强,用户兴趣稳定 | 长尾物品丰富,个性化需求强烈 |
基于兴趣的分类三个主要问题:
问题1:专家进行分类
缺点:
LFM计算用户 u u u对物品 i i i的兴趣:
P r e f e r e n c e ( u , i ) = r u , i = ∑ f = 1 F p u , k q i , k Preference(u,i) = r_{u,i} = \sum_{f=1}^Fp_{u,k}q_{i,k} Preference(u,i)=ru,i=f=1∑Fpu,kqi,k
在隐性反馈数据集中训练得到参数,隐性反馈数据集中只有正样本(用户喜欢什么),没有负样本,如何生成阜阳们便成为一个问题。
效果来看:第三种>第二种>第四种>第一种
经过采样以后得到训练集,用户-物品集 K = { u , i } K=\{u,i\} K={u,i},如果 ( u , i ) (u,i) (u,i)是正样本那么 r u i = 1 r_{ui}=1 rui=1,否则是0:
C = ∑ ( u , i ) ∈ K ( r u i − r ^ u i ) 2 = ∑ ( u , i ) ∈ K ( r u i − ∑ k = 1 K p u , k q i , k ) 2 + λ ∥ p u ∥ 2 + λ ∥ q i ∥ 2 C=\sum_{(u, i) \in K}\left(r_{u i}-\hat{r}_{u i}\right)^{2}=\sum_{(u, i) \in K}\left(r_{u i}-\sum_{k=1}^{K} p_{u, k} q_{i, k}\right)^{2}+\lambda\left\|p_{u}\right\|^{2}+\lambda\left\|q_{i}\right\|^{2} C=(u,i)∈K∑(rui−r^ui)2=(u,i)∈K∑(rui−k=1∑Kpu,kqi,k)2+λ∥pu∥2+λ∥qi∥2
通过梯度下降便可训练得到合适的参数 q q q和 p p p。
将用户行为表示为二分图模型,推荐任务变转换成度量用户定点和没有边连接的物品定点在图上的相关性的问题。
度量两个顶点之间相关性的算法:
相关性较高的顶点所具有的特征:
分类:
信息分类:
基于注册信息的个性化推荐流程:
如何根据注册信息对用户进行分类呢,是否可以用聚类,尽可能分更多的类,根据注册信息进行分类,如果test的准确率特别高的话,可以考虑将label加入到聚类里面一起进行聚类。
重点是计算特征喜欢的物品,也就是某个特征和物品的关系。
p ( f , i ) p(f,i) p(f,i)具有特征 f f f的用户对物品 i i i的喜好程度:
p ( f , i ) = ∣ N ( i ) ∩ U ( f ) ∣ p(f,i) = |N(i) \cap U(f)| p(f,i)=∣N(i)∩U(f)∣
N ( i ) N(i) N(i):喜欢物品i的用户集合;
U ( f ) U(f) U(f):具有特征f的用户集合;
为了解决热门物品,修改为喜欢物品i的用户中具有特征 f f f的比例:
p ( f , i ) = ∣ N ( i ) ∩ U ( f ) ∣ N ( i ) + α p(f,i) = \frac{|N(i) \cap U(f)|}{N(i)+\alpha} p(f,i)=N(i)+α∣N(i)∩U(f)∣
α \alpha α的是为了解决数据稀疏问题。但是 α \alpha α应该如何确定呢。
用户的人口统计学特征越多,越能准确的预测用户兴趣。
启动用户的物品特点:
衡量一个物品的区分度:
D ( i ) = σ u ∈ N + ( i ) + σ u ∈ N + ( i ) + σ u ∈ N − ( i ) D(i) = \sigma_{u\in N^+(i)}+\sigma_{u\in N^+(i)} + \sigma_{u\in N^-(i)} D(i)=σu∈N+(i)+σu∈N+(i)+σu∈N−(i)
σ u ∈ N + ( i ) \sigma_{u\in N^+(i)} σu∈N+(i):喜欢i的用户集合,对应的评分方差;
σ u ∈ N + ( i ) \sigma_{u\in N^+(i)} σu∈N+(i):不喜欢i的用户集合,对应的评分方差
σ u ∈ N − ( i ) \sigma_{u\in N^-(i)} σu∈N−(i):没有评分的用户,对应的其他物品评分方差;
物品内容信息通过向量空间模型来表示。
将物品的内容表示成关键词向量:
d i = ( e 1 , w 1 ) , ( e 2 , w 2 ) . . . d_i = {(e_1, w_1),(e_2,w_2)...} di=(e1,w1),(e2,w2)...
e i e_i ei:关键词向量;
w i w_i wi:关键词权重
得到向量后,物品之间两两计算相似度,复杂度是 O ( N 2 ) O(N^2) O(N2)。采用关键词-物品倒排表可以加速。
除了前面讲过的基于用户喜欢过的物品,利用兴趣相似的用户这两种方式,另一种常用的方式是通过一些特征来联系用户和物品,其实这和我们常用的方式相一致,也就是常说的做特征。特征可以是用户属性,也可以是用户特征,和隐语义向量。
标签系统的作用:
时间信息对用户兴趣的影响表现:
包含时间信息的用户行为数据集,由一系列三元组组成, ( u , i , t ) (u,i,t) (u,i,t),表示用户u在时刻t对物品i产生过行为。
物品的生存周期和系统的时效性:
推荐系统的实时性;
推荐系统的的时间多样性;
最近最热门: 物品i在时间T的流行度
n i ( T ) = ∑ ( u , i , t ) ∈ T r a i n , t < T 1 1 + α ( T − t ) n_i(T) = \sum_{(u,i,t)\in Train,t
时间上下文相关的ItemCF:
原始ItemCF相似度计算公式:
S i m ( i , j ) = ∑ u ∈ N ( i ) ∩ N ( j ) 1 ∣ N ( i ) ∣ ∣ N ( j ) ∣ Sim(i,j) = \frac{\sum_{u\in N(i)\cap N(j)} 1}{\sqrt{|N(i)||N(j)|}} Sim(i,j)=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)1
添加时间衰减项:
S i m ( i , j ) = ∑ u ∈ N ( i ) ∩ N ( j ) f ( ∣ t u i − t u j ∣ ) ∣ N ( i ) ∣ ∣ N ( j ) ∣ Sim(i,j) = \frac{\sum_{u\in N(i)\cap N(j)} f(|t_{ui}-t_{uj}|)}{\sqrt{|N(i)||N(j)|}} Sim(i,j)=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)f(∣tui−tuj∣)
f ( ∣ t u i − t u j ∣ ) f(|t_{ui}-t_{uj}|) f(∣tui−tuj∣)时间衰减函数,eg.:
f ( ∣ t u i − t u j ∣ ) = 1 1 + α ∣ t u i − t u j ∣ f(|t_{ui}-t_{uj}|) = \frac{1}{1+\alpha|t_{ui}-t_{uj}|} f(∣tui−tuj∣)=1+α∣tui−tuj∣1
时间上下文相关的UserCF:
原始UserCF相似度计算公式:
w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ w_{uv} = \frac{|N(u)\cap N(v)|}{\sqrt{|N(u)|\cup |N(v)|}} wuv=∣N(u)∣∪∣N(v)∣∣N(u)∩N(v)∣
将时间信息考虑进去:
w u v = ∑ i ∈ N ( u ) ∩ N ( v ) 1 1 + α ∣ t u i − t v i ∣ ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ w_{uv} = \frac{\sum_{i\in N(u)\cap N(v)} \frac{1}{1+\alpha|t_{ui}-t_{vi}|}}{\sqrt{|N(u)|\cup |N(v)|}} wuv=∣N(u)∣∪∣N(v)∣∑i∈N(u)∩N(v)1+α∣tui−tvi∣1
其实UserCF和ItemCF都是相似的,都是在计算相似度的时候添加一个时间衰减因子。
基于位置的推荐算法:
LARS(Location Aware Recommend System):
用户兴趣和地点相关的两组特征:
推荐资料:
利用图来定义社交网络:
优点:
缺点:
根据社交网络和用户行为数据集来进行推荐,社交网络给出用户之间的好友关系。
用户 u u u对物品 i i i的兴趣:
p u i = ∑ v ∈ o u t ( u ) w u v r v i p_{ui} = \sum_{v\in out(u)}w_{uv}r_{vi} pui=v∈out(u)∑wuvrvi
可以将用户之间的关系以及用户是否属于同一个社群,构建在一个途中。
左边是社群,如果两个用户和同一个社群相连,代表他们属于同一个社群。用户之间同样用边相连,代表他们之间的关系。