基于用户的协同过滤算法的系统多样性分析

本文探讨了User-Based CF推荐算法的多样性评估方法,包括计算物品间的相似度和用户推荐列表的多样性。通过具体函数实现了推荐系统的内部多样性和用户间多样性,并给出详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习userbasedCF推荐算法的过程中,我尝试了从宏观和微观两个角度分析推荐算法系统的多样性
Intra diversity
函数表达式如下,m为训练集长度,L为用户推荐列表长度,ajαajβ为用户j推荐列表中α和β两物品的相似度。先求一个用户的推荐列表多样性,再求系统总体多样性。
这里写图片描述
计算物品-物品相似度的代码如下

 def itemSimilarity(self,train = None):
        train = train or self.traindata
        self.itemSim = dict()
        C = dict()
        N = dict()
        user_items = dict() 
        itemsN=set() #创建物品集合
        for u,item in train.items():
            for i in item.keys():
                itemsN.add(i)
        for i in itemsN:
            for j in itemsN:
                if i == j:
                    continue
                C.setdefault(i,{})
                C[i].setdefault(j,0)  #创建一个物品-物品值全为0的字典  
        for u,item in train.items():
            for i in item.keys():
                user_items.setdefault(u,set())
                user_items[u].add(i)
        for user,items in user_items.items():
            for i in items:
                N.setdefault(i,0)
                N[i] += 1
                for j in items:
                    if i == j:
                        continue
                    C.setdefault(i,{})
                    C[i].setdefault(j,0)
                    C[i][j] += 1
        for i,related_items in C.items():
            self.itemSim.setdefault(i,dict())
            for j,cij in related_items.items():
                self.itemSim[i][j] = cij / math.sqrt(N[i]*N[j]*1.0)
                #计算物品i与物品j之间相似度

intraDiversity的代码实现:

def intraDiversity():
    ubcf = UserBasedCF('C:\Users\Desktop\PythonDatabase\\u.data')
    ubcf.readData()
    ubcf.splitData(4,100)
    ubcf.userSimilarityBest()
    ubcf.itemSimilarity()
    IntraD=0
    m=943
    R=0
    for w in range(m):
        rank = ubcf.recommend(user="%s"%(w+1),k = 3)
        ret=0
        for u,item in rank.items():
            for v,item in rank.items():
                if u == v:
                    continue
                ret += ubcf.itemSim["%s"%(u)]["%s"%(v)]
        R += (1-ret/(40*(40-1)))#每个用户的推荐列表的inIntraD += R/m
    print"IntraD:"%.5f"%IntraD

Inter diversity:

函数表达式如下,根据列表物品同现矩阵计算两用户推荐列表相似性得出系统总体多样性。

这里写图片描述

def interDiversity():
    ubcf = UserBasedCF('C:\Users\Desktop\PythonDatabase\\u.data')
    ubcf.readData()
    ubcf.splitData(4,100)
    ubcf.userSimilarityBest()
    InterD=0
    m=943
    for w in range(m):
        rank = ubcf.recommend(user="%s"%(w+1),k = 3)
        for u in range(m):
            if w>=u:
                continue
            rant = ubcf.recommend(user="%s"%(u+1),k = 3)
            ret=0
            c=0
            for i in rank.items():
                for j in rant.items():
                    if i[0]==j[0]:
                        c += 1
            ret +=(1-c*1.0/40) #两个用户推荐列表间多样性,列表长度L=40
            InterD += ret*2/(m*(m-1))
    print InterD:""%.5f"%InterD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值