Item-based协同过滤

来源:互联网 发布:广数g75编程实列 编辑:程序博客网 时间:2024/06/09 14:29

论文:Item-Based Top-N Recommendation Algorithms

过程:

1. 构建一个m*m的矩阵,每一列最多有k个非0值,比如第j列,非0值代表和第j个item最相关的k个item。k一般10-20,不会很大,保持矩阵的稀疏性。

2. 推荐的方式如此:构建m*1的矩阵,表示当前用户购买过的item,1表示购买,0表示未购买。以此为输入,

3. 上述矩阵相乘,等于是权重累加(比如用户买过了a和b,a和c的相似度权重+b和c的相似度权重,就是这个用户推荐c的总权重)。输出的格式:m*1的矩阵,最多N个非0值,存的是权重,代表为该用户推荐的N个item。


存在问题,a和b相关的一系列item之间不可直接比较。特别是对于不经常购买的商品。需要归一化,使得一个item对应的k个item总权重为1.


如何计算相似度:

1. 一个买很多东西的用户,和一个买比较少东西的用户,对于商品共现的权重不同。买的少的人,里面商品的共现,体现的相关性更大一些。

2. sim(i,j)和sim(j,i)是不同的。出现次数多的i会被惩罚

3. 基于cosine的相似度:n×m user–item矩阵,

如果要对买的东西多的人进行降权,则可以对每一行进行归一化

4. 基于条件概率的相似度:

P( j |i) = Freq(i j )/Freq(i)

买过i的人再买j的概率

上述公式的问题是:如果j经常被购买,则会趋向于获得更大的概率,必须适度惩罚

a是一个0-1之间的数,具体取多少合适,需要看具体的问题,需要试验

Freq(ij)是同时购买i和j的用户数

上述公式没有区分买东西多和买东西少的用户

考虑的话,首先对n×m user–item矩阵行归一化(买的少的用户,权重会更大点)

上述公式的上面部分,应用于user–item矩阵,把第j列归一化后的非0值都加起来。是否少了个条件?至少用户还得买过i啊。


所有ij组都计算出来,构成一个矩阵,最后矩阵还需要归一化(列归一化),使得列的模为1