• 基于物品的协同过滤实现(javaweb+python)


    基于物品的推荐算法以及流程(以电商网站为基准)

    例如,用户喜欢百雀羚的爽肤水,那么系统将会寻找与爽肤水、百雀羚类似的物品推荐给用户。

    算法流程:

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

    2.构建物品与物品的同现矩阵;

    3.计算物品之间的相似度,即计算相似矩阵;

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

    数据库中数据如下:

    注:user_id为用户id

      good_id为用户喜欢的商品id

    python代码:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    from math import sqrt
    import operator
    
    #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];
    import cx_Oracle
    import csv
    import re
    import codecs
    import requests
    from bs4 import BeautifulSoup
    def fetch_data(sql):
        conn = cx_Oracle.connect('C##CHINA_GOOD/bishe@127.0.0.1:1521/ORCL')
        cursor = conn.cursor()
        result = cursor.execute(sql)
        all_data = cursor.fetchall()  # 查询全部
        return all_data
    
    if __name__=='__main__':
        #用户,兴趣度,物品
        sql1 = "select * from user_like_good"
        datas = fetch_data(sql1)
        uid_score_bid=[]
        for data in datas:
            content=str(data[1])+",1,"+str(data[2])
            print(content)
            uid_score_bid.append(content)
        print(uid_score_bid)
        data=loadData(uid_score_bid);#获得数据
        W=similarity(data);#计算物品相似矩阵
        recommandList(data,W,'104976',3,10);#推荐

    有借鉴,忘了从哪了,下次备注链接

  • 相关阅读:
    (Java) LeetCode 275. H-Index II —— H指数 II
    (Java) LeetCode 82. Remove Duplicates from Sorted List II —— 删除排序链表中的重复元素 II
    前端知识体系目录
    PhoneGap/cordvoa如何添加Media插件
    使用Google Closure Compiler高级压缩Javascript代码注意的几个地方
    javascript中的函数式声明与变量式声明
    call,apply,bind的用法
    canvas学习笔记
    Cookie/Session机制详解
    架构师速成6.8-设计开发思路-领域驱动 分类: 架构师速成 2015-07-30 18:28 15人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/lovema1210/p/12327119.html
Copyright © 2020-2023  润新知