基於物品的推薦算法以及流程(以電商網站為基准)
例如,用戶喜歡百雀羚的爽膚水,那么系統將會尋找與爽膚水、百雀羚類似的物品推薦給用戶。
算法流程:
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);#推薦
有借鑒,忘了從哪了,下次備注鏈接
