• django -- 推荐商品算法


    协同过滤算法之基于物品的推荐算法

    目前有关个性化推荐算法主要分为三大类:1.基于协同过滤的推荐;2.基于内容过滤的推荐和3.社会化推荐。

    本文主要讨论基于协同过滤的推荐,而该算法也可以划分为两类:

    1.基于用户的协同过滤算法(UserCF)

    该算法利用用户之间的相似性来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。但有很难解决的两个问题,一个是稀疏性,即在系统使用初期由于系统资源还未获得足够多的评价,很难利用这些评价来发现相似的用户。另一个是可扩展性,随着系统用户和资源的增多,系统的性能会越来越差。

    2.基于物品的协同过滤算法(ItemCF)

    内容过滤根据信息资源与用户兴趣的相似性来推荐商品,通过计算用户兴趣模型和商品特征向量之间的向量相似性,主动将相似度高的商品发送给该模型的客户。由于每个客户都独立操作,拥有独立的特征向量,不需要考虑别的用户的兴趣,不存在评价级别多少的问题,能推荐新的项目或者是冷门的项目。这些优点使得基于内容过滤的推荐系统不受冷启动和稀疏问题的影响

    数据描述

        #用户,兴趣度,物品

        uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',

    'E,1,a', 'E,1,d']

    1.构建用户-->物品的倒排

    def loadData(files):

        data ={};

        for line in files:

            user,score,item=line.split(",");

            data.setdefault(user,{});

            data[user][item]=score;

        print "----1.用户:物品的倒排----"

        print data

        return data

    #2.计算

    # 2.1 构造物品-->物品的共现矩阵

    # 2.2 计算物品与物品的相似矩阵

    def similarity(data):

        # 2.1 构造物品:物品的共现矩阵

        N={};#喜欢物品i的总人数

        C={};#喜欢物品i也喜欢物品j的人数

        for user,item in data.items():

            for i,score in item.items():

                N.setdefault(i,0);

                N[i]+=1;

                C.setdefault(i,{});

                for j,scores in item.items():

                    if j not in i:

                        C[i].setdefault(j,0);

                        C[i][j]+=1;

        print "---2.构造的共现矩阵---"

        print ('N:',N);

        print ('C',C);

        #2.2 计算物品与物品的相似矩阵

        W={};

        for i,item in C.items():

            W.setdefault(i,{});

            for j,item2 in item.items():

                W[i].setdefault(j,0);

                W[i][j]=C[i][j]/sqrt(N[i]*N[j]);

        print "---3.构造的相似矩阵---"

        print W

        return W

    #3.根据用户的历史记录,给用户推荐物品

    def recommandList(data,W,user,k=3,N=10):

        rank={};

        for i,score in data[user].items():#获得用户user历史记录,如A用户的历史记录为{'a': '1', 'b': '1', 'd': '1'}

            for j,w in sorted(W[i].items(),key=operator.itemgetter(1),reverse=True)[0:k]:#获得与物品i相似的k个物品

                if j not in data[user].keys():#该相似的物品不在用户user的记录里

                    rank.setdefault(j,0);

                    rank[j]+=float(score) * w;

        print "---4.推荐----"

        print sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N];

        return sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N];

    if __name__=='__main__':

        #用户,兴趣度,物品

        uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',

                         'E,1,a', 'E,1,d'];

        data=loadData(uid_score_bid);#获得数据

        W=similarity(data);#计算物品相似矩阵

        recommandList(data,W,'A',3,10);#推荐

  • 相关阅读:
    Android ConstraintLayout详解
    Android开发屏幕适配解决方
    高并发场景下的一种JVM GC优化配置【CMS】
    Runnable 和 Callable的区别
    理解对象实例化顺序
    mysql 优化原理【转】
    使用@Scheduled注解编写spring定时任务
    Spring加载resource时classpath*:与classpath:的区别
    Java 8 中的 Streams API 详解
    java 8 函数式接口
  • 原文地址:https://www.cnblogs.com/weifeng-888/p/10792939.html
Copyright © 2020-2023  润新知