基於物品的協同過濾實現(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);#推薦

 

有借鑒,忘了從哪了,下次備注鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM