首页IT科技协同过滤算法难吗(协同过滤算法)

协同过滤算法难吗(协同过滤算法)

时间2025-04-30 17:50:18分类IT科技浏览2904
导读:协同过滤算法 协同过滤(Collaborative Filtering,简写CF 是推荐系统最重要得思想之一,其思想是根据用户之前得喜好以及其他兴趣相近得用户得选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐 ,一般仅仅基于用户的行为...

协同过滤算法

协同过滤(Collaborative Filtering,简写CF)是推荐系统最重要得思想之一            ,其思想是根据用户之前得喜好以及其他兴趣相近得用户得选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向                  ,并预测用户可能喜好的产品进行推荐)      ,一般仅仅基于用户的行为数据(评价            ,购买                  ,下载等)      ,而不依赖于物品的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄      ,性别等)            。其思想总的来说就是:人以类聚                  ,物以群分                  。目前应用比较广泛的协同过滤算法是基于邻域的方法            ,而这种方法主要有两种算法:基于用户的协同过滤算法(给用户推荐和他兴趣相似的其他用户喜欢的产品)和基于物品的协同过滤算法(给用户推荐和他之前喜欢的物品相似的物品)      。

如上图所示      ,其实给用户推荐物品的过程就可以认为是一个猜测用户对商品进行打分的任务            。我们的目的就是判断该不该把物品5推荐给Alice                  ,即预测Alice会对这件商品打多少分                  。基于用户的协同过滤就是计算Alice和其他用户1            ,2,3                  ,4之间的相似度                  ,找出与Alice最相似的用户,根据他对商品5的喜好来判断Alice对商品5的喜好      。而基于物品的协同过滤则是计算商品5与商品!            ,2                  ,3      ,4的相似度            ,用Alice对与商品5相似度最高的那个样品的喜好来判断其对商品5的喜好      。我们可以看出                  ,无论是基于用户的协同过滤还是基于物品的协同过滤      ,都需要计算相似度      ,那我们来看一下相似度是如何计算的把                  。

相似度的计算方式

杰卡德(Jaccard)相似系数 杰卡德相似系数

这是衡量两个集合的相似度的一种指标            。两个集合A和B的交集元素在A                  ,B的

并集中所占的比例            ,称为两个集合的杰卡德相似系数      ,用符号J(A,B)表示      。

J

(

A

,

B

)

=

A

B

A

B

J(A,B)=\frac{|A∩B|}{|A∪B|}

J(A,B)=ABAB

杰卡德相似系数越大                  ,说明相似度越高            ,当A和B都为空时,J(A,B)=1.

杰卡德距离

与杰卡德相似系数相反的概念时杰卡德距离                  ,杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度                  。距离越大                  ,区分度越高,距离越小            ,区分度越低            。

J

δ

=

1

J

(

A

,

B

)

=

A

B

A

B

A

B

J_{\delta}=1-J(A,B)=\frac{|A∪B|-|A∩B|}{|A∪B|}

Jδ=1J(A,B)=ABABAB 余弦相似度

余弦相似度衡量了向量i和j之间的向量夹角的大小                  ,夹角越小      ,说明相似度越大            ,两个用户越相似。

s

i

m

(

i

,

j

)

=

c

o

s

(

i

,

j

)

=

i

j

i

j

sim(i,j)=cos(i,j)=\frac{i·j}{||i||·||j||}

sim(i,j)=cos(i,j)=ijij

这是向量表示的用具体数值表示:

c

o

s

(

θ

)

=

k

=

1

n

x

1

k

x

2

k

k

=

1

n

x

1

k

2

2

k

n

x

2

k

2

cos(\theta)=\frac{\sum_{k=1}^{n}{x_{1k}x_{2k}}}{\sqrt{\sum_{k=1}^{n}{x_{1k}^{2}}}\sqrt{\sum_{2k}^{n}{x_{2k}^{2}}}}

cos(θ)=k=1nx1k22knx2k2k=1nx1kx2k

其中

x

1

=

(

x

11

,

x

12

,

.

.

.

,

x

1

n

)

,

x

2

=

(

x

21

,

x

22

,

.

.

.

,

x

2

n

)

x_{1}=(x_{11},x_{12},...,x_{1n}),x_{2}=(x_{21},x_{22},...,x_{2n})

x1=(x11,x12,...,x1n),x2=(x21,x22,...,x2n)

API:

from sklearn.metrics.pairwise import cosine_similarity import numpy as np i=np.array([[1,0,0,0]]) j=np.array([[1,0.5,0.5,0]]) cosine_similarity(i,j) array([[0.81649658]])

余弦相似度比较常用                  ,一般效果也不会太差      ,但是对于评分数据不规范的时候      ,例如存在有的用户喜欢打高分                  ,有的用户喜欢打低分            ,有的用户喜欢乱打分的情况      ,这时候计算出来的余弦相似度就不太准确了                  ,比如下面这种情况:

这时候计算余弦相似度cos<d,e>=0.973,cos<d,f>=0.919,则d和f比较相似            ,而实际上,我们观察数据                  ,从对商品的喜好的趋势来看                  ,d和e是比较接近的,只不过e比较喜欢打低分            ,d比较喜好打高分                  ,所以对于这种情况      ,余弦相似度就不是那么好了            ,可以考虑使用皮尔逊相关系数                  。

皮尔逊相关系数

相比余弦相似度                  ,皮尔逊相关系数通过用户平均分对每个独立评分进行修正      ,减少了用户评分偏置的影响      ,即将每个向量都减去他们的平均值后在计算余弦相似度                  。

s

i

m

(

i

,

j

)

=

p

P

(

R

i

,

p

R

i

)

(

R

j

,

p

R

j

)

p

P

(

R

i

,

p

R

i

)

2

p

P

(

R

j

,

p

R

j

)

2

sim(i,j)=\frac{\sum_{p∈P}(R_{i,p}-\overline{R_{i}})(R_{j,p}-\overline{R_{j}})}{\sqrt{\sum_{p∈P}(R_{i,p}-\overline{R_{i}})^{2}}\sqrt{\sum_{p∈P}(R_{j,p}-\overline{R_{j}})^{2}}}

sim(i,j)=pP(Ri,pRi)2pP(Rj,pRj)2pP(Ri,pRi)(Rj,pRj)

其中

R

i

,

p

i

p

                  ,

R

i

i

R_{i,p}表示用户i对物品p的平方            ,\overline{R_{i}}表示用户对i对所有物品的平均分

Ri,pip      ,Rii                  ,P代表所有物品的集合。

R

i

=

(

R

i

1

,

R

i

2

,

.

.

.

R

i

n

)

,

R

j

=

(

R

j

1

,

R

j

2

,

.

.

.

,

R

j

n

)

R_{i}=(R_{i1},R_{i2},...R_{in}),R_{j}=(R_{j1},R_{j2},...,R_{jn})

Ri=(Ri1,Ri2,...Rin),Rj=(Rj1,Rj2,...,Rjn)
其他

①欧式距离

②曼哈顿距离

③马氏距离

UserCF基于用户的协同过滤

算法思想

上图很好的说明了UserCF的思想            ,即当一个用户A需要个性化推荐的时候,我们可以先找到和他有相似兴趣的其他用户                  ,然后把那些用户喜欢的                  ,而用户A没有听说过的物品推荐给A            。

所有基于用户的协同过滤算法步骤为:

①找到和目标用户兴趣相似的其他用户集合

②找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户

举例说明

仍以这个问题为例子

计算Alice与其他用户的相似度(以余弦相似度为例)

用户向量Alice(5,3,4,4),user1(3,1,2,3),user2(4,3,4,3),user3(3,3,1,5),user4(1,5,5,2)

Alice与user1的余弦相似度为:

s

i

m

(

A

l

i

c

e

,

u

s

e

r

1

)

=

c

o

s

(

A

l

i

c

e

,

u

s

e

r

1

)

=

5

3

+

3

1

+

4

2

+

4

3

5

5

+

3

3

+

4

4

+

4

4

3

3

+

1

1

+

2

2

+

3

3

=

0.975

sim(Alice,user1)=cos(Alice,user1)=\frac{5*3+3*1+4*2+4*3}{\sqrt{5*5+3*3+4*4+4*4}\sqrt{3*3+1*1+2*2+3*3}}=0.975

sim(Alice,user1)=cos(Alice,user1)=55+33+44+4433+11+22+3353+31+42+43=0.975

同理计算出Alice与其他用户的余弦相似度                  。

用程序计算出的用户相似度矩阵为:

[[1. , 0.9753213 , 0.99224264, 0.89072354, 0.79668736],

[0.9753213 , 1. , 0.94362852, 0.91160719, 0.67478587],

[0.99224264, 0.94362852, 1. , 0.85280287, 0.85811633],

[0.89072354, 0.91160719, 0.85280287, 1. , 0.67082039],

[0.79668736, 0.67478587, 0.85811633, 0.67082039, 1. ]]

可以看出Alice与User1和User2最为相似

根据相似度用户计算出Alice对物品5的最终得分

评分预测方式:

①利用用户相似度和相似用户的平均            ,加权平均获得用户的平均预测

R

u

,

p

=

s

S

(

w

u

,

s

R

s

,

p

)

s

S

w

u

,

s

R_{u,p}=\frac{\sum_{s∈S}(w_{u,s}·R_{s,p})}{\sum_{s∈S}w_{u,s}}

Ru,p=sSwu,ssS(wu,sRs,p)

其中权重

w

u

,

s

w_{u,s}

wu,s是用户u和用户s的相似度                  ,

R

s

,

p

R_{s,p}

Rs,p
是用户s 对物品p的评分

%

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站不收录原因(网站不收录的原因及解决方法) 人工智能研究方面(人工智能的几个研究方向)