item-based CF

item-based CF

给用户推荐那些和他们之前喜欢的物品相似的物品。item-based CF并不是利用物品的内容属性计算物品之间的相似度,主要是通过分析用户的行为记录计算物品间的相似度

算法步骤

(1)计算物品之间的相似度
(2)根据物品的相似度和用户的历史行为,给用户生成推荐列表
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ w_{ij}=\frac{|N(i)\cap N(j)|}{|N(i)|} wij=N(i)N(i)N(j)
其中 ∣ N ( i ) ∣ |N(i)| N(i)是喜欢物品 i i i的用户数, ∣ N ( i ) ∩ N ( j ) ∣ |N(i)\cap N(j)| N(i)N(j)是同时喜欢物品 i i i和物品 j j j的用户数。喜欢物品 i i i的用户里,有多少比例的用户也喜欢物品 j j j。但如果物品 j j j很热门,即很多人都喜欢,则 w i j w_{ij} wij就会很大,接近1;即任何物品都会和热门的物品有很大的相似度,所以添加惩罚物品 j j j的权重
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)

用户-物品倒排表

对每个用户建立一个包含他”喜欢的物品的列表“,然后对每个用户,将他”喜欢的物品的列表“中的物品两两在共现矩阵 C C C中加1。
对每个用户”喜欢的物品的列表“建立”物品两两对应出现矩阵“,最终将每个用户的”物品两两对应出现矩阵“相加得到共现矩阵 C C C C [ i ] [ j ] C[i][j] C[i][j]表示同时喜欢物品 i i i和物品 j j j的用户数。
user-item矩阵.jpg
item两两对应矩阵合成共现矩阵.jpg

import math

def ItemSimilarity(train):
    """
    :param train: user-item matrix
    :return: W: similarity matrix
    """
    #calculate co-rated users between items
    C=dict()
    N=dict()
    for u, items in train.items():
        for i in items:
            #################
            if i not in N:
                N[i] = 0
            #################
            N[i] += 1

            for j in items:
                if i == j:
                    continue
                #################
                if i not in C:
                    C[i] = dict()
                if j not in C[i]:
                    C[i][j]=0
                #################
                C[i][j] += 1

    #calculate final similarity matrix W
    W=dict()
    for i, related_items in C.items():
        for j, cij in related_items.items():
            #################
            if i not in W:
                W[i] = dict()
            if j not in W[i]:
                W[i][j] = 0
            #################
            W[i][j] = cij/math.sqrt(N[i]*N[j])
    return W

#test:
train={'A':{'a','b','d'},
       'B':{'b','c','e'},
       'C':{'c','d'},
       'D':{'b','c','d'},
       'E':{'a','d'}}
print(ItemSimilarity(train))

#Output:
{'a': {'b': 0.4082482904638631, 'd': 0.7071067811865475}, 
 'b': {'a': 0.4082482904638631, 'd': 0.5773502691896258, 'c': 0.6666666666666666, 'e': 0.5773502691896258}, 
 'd': {'a': 0.7071067811865475, 'b': 0.5773502691896258, 'c': 0.5773502691896258}, 
 'c': {'b': 0.6666666666666666, 'e': 0.5773502691896258, 'd': 0.5773502691896258}, 
 'e': {'b': 0.5773502691896258, 'c': 0.5773502691896258}}

用户u对物品j的兴趣【用户u对物品i的兴趣;物品i和物品j的相似性】

p u j = ∑ i ∈ N ( u ) ∩ S ( j , K ) w j i r u i p_{uj}=\sum\limits_{i\in N(u)\cap S(j,K)}w_{ji}r_{ui} puj=iN(u)S(j,K)wjirui
其中 N ( u ) N(u) N(u)是用户 u u u喜欢的物品集合, S ( j , K ) S(j,K) S(j,K)是和物品 j j j最相似的 K K K个物品的集合, w j i w_{ji} wji是物品 j j j和物品 i i i的相似度, r u i r_{ui} rui是用户 u u u对物品 i i i的兴趣。即,和”用户历史上感兴趣的物品“越相似的物品,在用户的推荐列表里越有可能排名靠前。

from  operator import itemgetter
def Recommendation(train, user_id, W, K):
    """
    :param train: user-item matrix
    :param user_id: user id
    :param W: similarity matrix
    :param K: number of similar items
    :return: recommendation list in order
    """
    #give final recommendation list
    rank=dict()
    ru=train[user_id]   #user_id喜欢的物品集
    for i in ru:   #user_id喜欢的物品i
        if i not in W:
            continue
        for j, wj in sorted(W[i].items(), key=itemgetter(1), reverse=True)[0:K]:   #与物品i相似度最大的K个物品
            if j in ru:   #如果与物品i 相似度在前K个位置的物品j 在user_id原本喜欢的物品集里
                continue
            #################
            if j not in rank:
                rank[j] = 0
            #################
            rank[j] += wj
    return rank

#test:
train={'A':{'a','b','d'},
       'B':{'b','c','e'},
       'C':{'c','d'},
       'D':{'b','c','d'},
       'E':{'a','d'}}
W=ItemSimilarity(train)
print(Recommendation(train, 'A', W, 1))
print(Recommendation(train, 'A', W, 3))

#Output:
{'c': 0.6666666666666666}
{'c': 1.2440169358562925, 'e': 0.5773502691896258}

#即遍历指定用户喜欢的每个物品的/前K个相似物品

扫码关注公众号:瑞行AI,欢迎交流AI算法、数据分析等技术,提供技术方案咨询和就业指导服务!
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于基于项目的协同过滤(item-based collaborative filtering),计算项目之间的相似度是非常重要的。常用的方法有以下几种: 1. 余弦相似度(Cosine Similarity):通过计算项目之间的向量夹角来度量相似度。具体计算公式为: ![cosine_similarity](https://img-blog.csdnimg.cn/20220723170947442.png) 其中,A和B分别表示两个项目的向量表示,例如使用项目的特征向量,而|A|和|B|表示向量的模。 2. 皮尔逊相关系数(Pearson Correlation):通过计算项目之间的线性相关性来度量相似度。具体计算公式为: ![pearson_correlation](https://img-blog.csdnimg.cn/20220723171002167.png) 其中,R(A,B)表示项目A和项目B之间的皮尔逊相关系数,n表示用户数,r(A,i)和r(B,i)分别表示用户对项目A和项目B的评分。 3. Jaccard相似度(Jaccard Similarity):主要用于计算项目之间的二元关系(如是否购买、是否点击等)。具体计算公式为: ![jaccard_similarity](https://img-blog.csdnimg.cn/20220723171020302.png) 其中,|A∩B|表示项目A和项目B同时出现的用户数,|A∪B|表示项目A和项目B出现的总用户数。 优化方法主要包括以下几个方面: 1. 基于物品的压缩:可以使用稀疏矩阵的压缩存储方式,减少计算相似度时的空间复杂度。 2. 基于近似计算:由于计算相似度的复杂度较高,可以采用近似计算的方法,如LSH(局部敏感哈希)等。 3. 优化算法:可以使用并行计算、分布式计算等技术来提高计算相似度的效率。 4. 特征选择:可以选择更加有代表性的特征来计算相似度,以减少计算量。 以上是常见的item-CF相似度计算方法和优化技巧,具体选择哪种方法和优化策略要根据实际情况来确定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值