推薦系統 基於itemCF推薦模型

2021-07-31 15:51:13 字數 3764 閱讀 2586

雖然目前工業界很少再直接通過itemcf來進行推薦,但可以從這個演算法中體會到這種集體智慧型的應用。

充分利用集體智慧型,即在大量的人群的行為和資料集中收集答案,以幫助我們對整個人群得到統計意義上的結論,推薦的個性化程度高。

基於以下兩個出發點:

(1)興趣相近的使用者可能會對同樣的東西感興趣;

(2)使用者可能較偏愛與其已購買的東西相類似的商品。

也就是說考慮進了使用者的歷史習慣,物件客觀上不一定相似,但由於人的行為可以認為其主觀上是相似的,就可以產生推薦了。

基於物品的協同過濾關鍵步驟

(1)計算物品之間的相似度。

(2)根據物品的相似度和使用者的歷史行為給使用者生成推薦列表。

itemcf演算法並不利用物品的內容屬性計算物品直接的相似性,她主要通過分析使用者的行為記錄計算物品直接的相似度。

iuf(inverse user frequence)引數,即使用者活躍度對數的倒數的引數,認為活躍使用者對物品相似度的貢獻應該小於不活躍的使用者。

from collections import defaultdict

# data_path = "../data/ml-1m/ratings.dat";sep = "::"

data_path = "../data/ml-100k/u1.base";sep = "\t"

fp = open(data_path, "r")

user2item_matrix = defaultdict(defaultdict) # 使用者到物品的評分矩陣

item2user_matrix = defaultdict(defaultdict) # 物品到使用者的倒排評分矩陣

# userid \t movieid \t score \t time

forline

inopen(data_path):

lines = line.strip().split(sep)

userid, movieid, score = lines[0],lines[1],lines[2]

user2item_matrix[userid][movieid] = float(score)

item2user_matrix[movieid][userid] = float(score)

fp.close()

print("totol users:",len(user2item_matrix))

print("totol items:",len(item2user_matrix))

輸出:

(『totol users:』, 943)

(『totol items:』, 1650)

計算物品之間的相似度公式: wi

j=|n

(i)⋂

n(j)

||n(

i)||

n(j)

|√* |n(i)|是喜歡物品i的使用者數,所以分子是同時喜歡物品i和物品j的使用者數。

* 上述公式可以理解為喜歡物品i的使用者中有多少比例的使用者也喜歡物品j。

* 分母懲罰了物品j的權重,可以避免推薦出熱門的物品,從而使推薦系統更致力於挖掘長尾資訊。

* 用itemcf演算法計算物品的相似首先度時,建立使用者-物品倒排表,然後對於每個使用者,將他物品列表中的物品兩兩在共現矩陣c中加1.

import math

defitem_sim_cosine

(item2user_matrix):

n = {}

c = defaultdict(defaultdict) # 物品-物品-共線矩陣

w = defaultdict(defaultdict) # 物品-物品-相似度矩陣

for i in item2user_matrix.keys():

for j in item2user_matrix.keys():

if i==j:

continue

w[i][j] = len(set(item2user_matrix[i]) & set(item2user_matrix[j])) # 分子:同時喜歡物品i和物品j的使用者數

dem = math.sqrt(len(list(item2user_matrix[i])) * len(list(item2user_matrix[j])) * 1.0)

if dem==0.0:

continue

w[i][j] /= dem

return w

%time w = item_sim_cosine(item2user_matrix)

輸出

cpu times: user 31.2 s, sys: 581 ms, total: 31.7 s

wall time: 31.5 s

在得到物品之間的相似度後,itemcf演算法通過如下公式計算使用者u對乙個物品j的興趣: pu

j=∑i

∈n(u

)⋂s(

j,k)

wijr

ui* n(u)是使用者喜歡的物品的集合

* s(j,k)是和物品j最相似的k個物品的集合

* w是物品j和i的相似度

* r是使用者u對物品i的興趣。

該公式的含義是,和使用者歷史上感興趣的物品越相似的物品,越有可能在使用者的推薦列表中獲得比較高的排名。

import operator

defrecommend

(user2item_matrix, user_id, w, k):

'''通過使用者userid、訓練集資料、使用者相似度矩陣進行topn推薦'''

rank=defaultdict(int)

# i為特定使用者的電影id,score為其相應評分

for i,score in user2item_matrix[user_id].items():

# 從w物-物相似度矩陣中,獲取物品i相似的物品列表,並按照得分進行sorted()的返回值為list

for j,wj in sorted(w[i].items(),key=operator.itemgetter(1),reverse=true)[0:k]:

# 如果j已經在該使用者的看過的物品列表中,則忽略掉

if j in user2item_matrix[user_id].keys():

continue

rank[j]+= score * wj

rank_list = sorted(rank.items(),key=operator.itemgetter(1),reverse=true)[0:10]

return rank_list

%time print recommend(user2item_matrix,'3',w,3)

輸出

[(『272』, 6.120247002905049), (『50』, 4.239718828183374), (『269』, 4.192092497183264), (『315』, 4.176401327888063), (『300』, 3.8573141711075003), (『286』, 3.6913920128867064), (『294』, 3.429595429950021), (『750』, 3.3202801975935095), (『328』, 3.3156220551840514), (『348』, 2.856158942397304)]

cpu times: user 15.2 ms, sys: 246 µs, total: 15.5 ms

wall time: 15.3 ms

python推薦演算法itemCF基於物品的協同過濾

itemcf demo python 3.7 import numpy as np import math test data users u1 u2 u3 item like list a,b,c a,b,c,e,f a,e 單個商品喜歡人數 def check 1item item return...

推薦系統 01 UserCF和ItemCF

推薦系統可能涉及的常見演算法 協同過濾的基本思想 協同過濾一般指在海量的使用者中發掘出一小部分和你品味比較類似的。實現協同過濾步驟 收集使用者偏好方法相似度 把資料看成空間中的向量 降噪,歸一化 基於距離計算相似度 計算歐幾里得空間中兩個點的距離 基於相關係數計算相似度 皮爾遜相關係數一般用於計算兩...

推薦系統 基於UGC的推薦

使用者用標籤描述對物品的看法,所以使用者生成標籤 ugc 是聯絡使用者和物品的紐帶,也是反應使用者興趣的重要資料來源。乙個使用者標籤行為的資料集一般有乙個三元組 使用者,物品,標籤 的集合組成,其中一條記錄 a,b,c 表示使用者a給物品b打上了標籤c 乙個簡單的演算法 統計每隔使用者最常用的標籤 ...