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

Posted 姚雅丽~yaoyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于物品的协同过滤实现(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);#推荐

 

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

 

以上是关于基于物品的协同过滤实现(javaweb+python)的主要内容,如果未能解决你的问题,请参考以下文章

ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

基于物品协同过滤实现商品推荐系统

基于物品的协同过滤

JAVA推荐系统-基于用户和物品协同过滤的电影推荐

推荐系统(一):基于物品的协同过滤算法

基于协同过滤推荐算法的图书推荐研究