-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy path32contented-based methods and collabortative filtering
106 lines (100 loc) · 9.27 KB
/
32contented-based methods and collabortative filtering
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
contented-based methods and collabortative filtering
---
title: "contented-based methods and collabortative filtering"
author: "fuyanbo"
date: "2021/10/12"
output:
word_document: default
html_document: default
---
本文将对基于内容推荐算法和协同过滤算法两种算法进行介绍和讨论 一·基于内容推荐算法(Contented-based methods)
(一)简介
所谓基于内容的推荐算法(Content-Base Recommendations)是基于标的物相关信息 、用户相关信息及用户对标的物的操作行为来构建推荐算法模型,为用户提供推荐服务。这里的标的物相关信息可以是对标的物文字描述的metadata信息、标签、用户评论、人工标注的信息等。用户相关信息是指人口统计学信息(如年龄、性别、偏好、地域、收入等等)。用户对标的物的操作行为可以是评论、收藏、点赞、观看、浏览、点击、加购物车、购买等。 基于内容的推荐算法一般只依赖于用户自身的行为为用户提供推荐,不涉及到其他用户的行为。
(二)实现原理
基于内容的推荐算法的基本原理是根据用户的历史行为,获得用户的兴趣偏好,为用户推荐跟他的兴趣偏好相似的标的物,读者可以直观上从下图理解基于内容的推荐算法。 要做基于内容的个性化推荐,一般需要三个步骤,它们分别是:基于用户信息及用户操作行为构建用户特征表示、基于标的物信息构建标的物特征表示、基于用户及标的物特征表示为用户推荐标的物 有了用户特征和标的物特征,我们怎么给用户做推荐呢?主要的推荐思路有如下三个:
(1)基于用户历史行为记录做推荐 我们需要事先计算标的物之间的相似性,然后将用户历史记录中的标的物的相似标的物推荐给用户。不管标的物包含哪类信息,一般的思路是将标的物特征转化为向量化表示,有了向量化表示,我们就可以通过cosine余弦相似度计算两个标的物之间的相似度了。
(2)用户和标的物特征都用显式的标签表示,利用该表示做推荐标的物用标签来表示,那么反过来,每个标签就可以关联一组标的物,那么根据用户的标签表示,用户的兴趣标签就可以关联到一组标的物,这组通过标签关联到的标的物,就可以作为给用户的推荐候选集。这类方法就是所谓的倒排索引法,是搜索业务通用的解决方案。
(3)用户和标的物嵌入到同一个向量空间,基于向量相似做推荐当用户和标的物嵌入到同一个向量空间中后,我们就可以计算用户和标的物之间的相似度,然后按照标的物跟用户的相似度,为用户推荐相似度高的标的物。还可以基于用户向量表示计算用户相似度,将相似用户喜欢的标的物推荐给该用户,这时标的物嵌入是不必要的。
我们可以通过如下的方式计算两个标的物之间的相似度。
假设两个标的物的向量表示分别为:
$V 1=\left(p_{1}, p_{2}, p_{3}, \ldots \ldots, p_{k}\right)$
$V2=\left(g_{1}, q_{2}, q_{3}, \ldots \ldots, q_{k}\right)$
这时这两个标的物的相似性可以表示为:
$\operatorname{sim}(V 1, V 2)=\sum_{t=1}^{k} \operatorname{sim}\left(p_{1}, g_{t}\right)$
其中
$sim=\left(p_{t},q_{t}\right)$
代表的是向量的两个分量之间的相似度。可以采用Jacard相似度等各种方法计算两个分量之间的相似度。
$\operatorname{sim}(V 1, V 2)=\sum_{t=1}^{k} w_{t} * \operatorname{sim}\left(p_{1}\right)(t)$
二·协同过滤算法
(一)简介
协同过滤,从字面上理解,包括协同和过滤两个操作。所谓协同就是利用群体的行为来做决策(推荐),生物上有协同进化的说法,通过协同的作用,让群体逐步进化到更佳的状态。对于推荐系统来说,通过用户的持续协同作用,最终给用户的推荐会越来越准。而过滤,就是从可行的决策(推荐)方案(标的物)中将用户喜欢的方案(标的物)找(过滤)出来。 具体来说,协同过滤的思路是通过群体的行为来找到某种相似性(用户之间的相似性或者标的物之间的相似性),通过该相似性来为用户做决策和推荐。 协同过滤利用了两个非常朴素的自然哲学思想:“群体的智慧”和“相似的物体具备相似的性质”,群体的智慧从数学上讲应该满足一定的统计学规律,是一种朝向平衡稳定态发展的动态过程,越相似的物体化学及物理组成越一致,当然表现的外在特性会更相似。虽然这两个思想很简单,也很容易理解,但是正因为思想很朴素,价值反而非常大。所以协同过滤算法原理很简单,但是效果很不错,而且也非常容易实现。
(二)协同过滤算法的实现原理
基于协同过滤的两种推荐算法,核心思想是很朴素的”物以类聚、人以群分“的思想。所谓物以类聚,就是计算出每个标的物最相似的标的物列表,我们就可以为用户推荐用户喜欢的标的物相似的标的物,这就是基于物品(标的物)的协同过滤。所谓人以群分,就是我们可以将与该用户相似的用户喜欢过的标的物的标的物推荐给该用户(而该用户未曾操作过),这就是基于用户的协同过滤。 协同过滤的核心是怎么计算标的物之间的相似度以及用户之间的相似度。我们可以采用非常朴素的思想来计算相似度。我们将用户对标的物的评分构建用户行为矩阵,矩阵的某个元素代表某个用户对某个标的物的评分,如果某个用户对某个标的物未产生行为,值为0。其中行向量代表某个用户对所有标的物的评分向量,列向量代表所有用户对某个标的物的评分向量。有了行向量和列向量,我们就可以计算用户与用户之间、标的物与标的物之间的相似度了。具体来说,行向量之间的相似度就是用户之间的相似度,列向量之间的相似度就是标的物之间的相似度。
相似度的计算可以采用cosine余弦相似度算法来计算两个向量之间的相似度
$\operatorname{sim}\left(v_{1}, v_{2}\right)=\frac{v_{1} * v_{2}}{\left\|v_{1}\right\| \times\left\|v_{2}\right\|}$
用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中U是与该用户最相似的用户集合(我们可以基于用户相似度找到与某用户最相似的K个用户),
$score\left(u_{i},s\right)$
是用户对标的物s的喜好度(对于隐式反馈为1,而对于非隐式反馈,该值为用户对标的物的评分),
$sim\left(u,u_{i}\right)$
是用户与用户u的相似度。
$\operatorname{sim}(u, s)=\sum_{u_{i} \in U} \operatorname{sim}\left(u, u_{i}\right) * \operatorname{score}\left(u_{i}, s\right)$
有了用户对每个标的物的评分,基于评分降序排列,就可以取topN推荐给用户了
(三)案例及R语言实践
```{r setup}
#载入数据
org_data = read.csv('C:\\Users\\Roderick\\Desktop\\testCF.csv',header=FALSE)
FileDataModel = function(org_data){
names(org_data) = c("uid","iid","pref")
M = dcast(uid ~ iid,data=org_data)
rownames(M) = unique(org_data$uid)
M = as.matrix(M[-1])
colnames(M) = unique(sort(org_data$iid))
M
}
EuclideanDistanceSimilarity = function(M){
simple = function(x,y){
num = intersect(which(M[x,]!=0),which(M[y,]!=0))
s = sum((M[x,] - M[y,])^2,na.rm = T)
s = length(num)/(1 + sqrt(s))
if(s > 1) s = 1
if(s < -1) s = -1
return(s)
}
outer(1:nrow(M),1:nrow(M),Vectorize(simple)) - diag(nrow(M))
}
NearestNUserNeighborhood = function(S,n){
sapply(1:n,function(i) {m = apply(S,2,which.max)
ij = cbind(m,seq_along(m))
S[ij] <<- 0
m})
}
UserBasedRecommender=function(uid,data=org_data,n=2,N=3){
library(reshape2)
M = FileDataModel(org_data)
S = EuclideanDistanceSimilarity(M)
N = NearestNUserNeighborhood(S,N)
uid_N=which(rownames(M)==uid)
part = colnames(M)[is.na(M[uid_N,])]
m = S[uid_N, N[uid_N,]]
md = M[N[uid_N,],part]
if(length(dim(md)) >= 1) {
a = colnames(md)[colSums(md,na.rm=TRUE)!=0]
score = colSums(md*m,na.rm = T)/apply(!is.na(md),2,function(x) sum(m[x]))
res = score[order(score,decreasing=T)][1:n]
res = res[intersect(names(res),a)]
return(res)
} else { res = NA}
}
UserBasedRecommender(uid='A11111',data=org_data,n=2,N=3)
```
三·协同过滤和基于内容推荐的区别
综上所述
基于内容的推荐算法只考虑了对象的本身性质,将对象按标签形成集合,如果你消费集合中的一个则向你推荐集合中的其他对象
协同过滤算法,充分利用集体智慧,即在大量的人群的行为和数据中收集答案,以帮助我们对整个人群得到统计意义上的结论,推荐的个性化程度高,基于以下两个出发点:
(1)兴趣相近的用户可能会对同样的东西感兴趣
(2)用户可能较偏爱与其已购买的东西相类似的商品。也就是说考虑进了用户的历史习惯,对象客观上不一定相似,但由于人的行为可以认为其主观上是相似的,就可以产生推荐了。
参考文献
1.Albert-Laszlo Barabasi-Network Science
2.Networks An introduction, M.E.J. Newman
3.Zafarani R., Abbasi M.A., Liu H.-Social Media Mining_An introduction-CUP(2014)
4.Social Network Data_Analytics