推薦系統實踐筆記(一)

2021-08-07 23:27:04 字數 4262 閱讀 9966

import pandas as pd

from pandas import series,dataframe

from operator import itemgetter, attrgetter

import math

unames=['user_id','gender','age','occupation','zip']

users=pd.read_table('ml-1m/users.dat',sep='::',header=none,names=unames)

mnames = ['movie_id', 'title', 'genres']

movies = pd.read_table('ml-1m/movies.dat', sep='::', header=none, names=mnames)

rnames = ['user_id', 'movie_id', 'rating', 'timestamp']

ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=none, names=rnames)

all_data = pd.merge(pd.merge(ratings, users), movies)

data = dataframe(data=all_data,columns=['user_id','movie_id'])

data.to_csv('data.csv')

由於在進行topn推薦而非評分**時,我們並不關心使用者給電影究竟打了多少分,而是關心使用者是否對物品產生了行為,所以這裡僅僅需要使用者id及其對應評分的電影id資料,讀取之前儲存的**並提取我們需要的資訊,書裡給出的**使用了dict儲存使用者id和電影id,如果不進行任何處理的話是不合理的,因為大多數使用者都對不止一部電影進行了評分,一部電影也有多位不同使用者進行過評分,『user_id』和『movie_id』都不能作為dict中的key,因此我在這裡直接進行倒排矩陣的建立:

data=pd.read_csv('data.csv')

x=data['user_id']

y=data['movie_id']

item_user=dict()

for i in range(x.count()):

user=x.iloc[i]

item=y.iloc[i]

if item not

in item_user:

item_user[item]=set()

item_user[item].add(user)

#計算n(u)、矩陣c(u)(v):

c={}

n={}

for i,users in item_user.items():

for u in users:

n.setdefault(u,0)

n[u]+=1

c.setdefault(u,{})

for v in users:

if u==v:

continue

c[u].setdefault(v,0)

c[u][v]+=1

#建立相似度矩陣:

w=c.copy()

for u,related_users in c.items():

for v,cuv in related_users.items():

w[u][v]=cuv/math.sqrt(n[u]*n[v])

defrecommend

(user,user_item,w,k):

rank={}

interacted_items=user_item[user]

for v,wuv in sorted(w[user].items(),reverse=true)[0:k]:

for i in user_item[v]:

if i not

in interacted_items:

rank.setdefault(i,0)

rank[i]+=wuv

return rank

#python字典setdefault()函式和get()方法類似,如果鍵不存在於字典中,將會新增鍵並將值設為預設值。dict.setdefault(key, default=none)

#對熱門物品進行了懲罰的改進的usercf,只需要在計算c[u][v]時乘上1/math.log(1+len(users))即可。itemcf只要在usercf演算法**的基礎上稍作修改,在這裡就不贅述了。

defitemsimilarity

(train):

c = dict()

n = dict()

for u, items in train.items():

for i in users:

n[i] += 1

for j in users:

if i == j:

continue

c[i][j] += 1 / math.log(1 + len(items) * 1.0)

w = dict()

for i,related_items in c.items():

for j, cij in related_items.items():

w[u][v] = cij / math.sqrt(n[i] * n[j])

return w

#召回率

defrecall

(train, test, w, n):

hit = 0

all = 0

tu = dict()

for user in train.keys():

tu = test[user]

rank = recommend(user, train, w, n)

for item, pui in rank.items():

if item in tu:

hit += 1

all += len(tu)

return hit/(all * 1.0)

# 準確率

defprecision

(train, test, w, n):

hit = 0

all = 0

for user in train.keys():

tu = test[user]

rank = recommend(user, train, w, n)

for item, pui in rank.items():

if item in tu:

hit += 1

all += n

return hit/(all*1.0)

#覆蓋率

defcoverage

(train, test, w, n):

recommend_items = set()

all_items = set()

for user in train.keys():

for item in train[user].keys():

all_items.add(item)

rank = recommend(user, train, w, n)

for item, pui in rank.items():

recommend_items.add(item)

return len(recommend_items)/(len(all_items)*1.0)

#流行度

defpopularity

(train, test, w, n):

item_popularity = dict()

for user, items in train.items():

for item in items.keys():

if item not

in item_popularity:

item_popularity.setdefault(item,0)

item_popularity[item] += 1

ret = 0

n = 0

for user in train.keys():

rank = getrecommendation(user, n)

for item, pui in rank:

ret += math.log(1 + item_popularity[item])

n += 1

ret /= n*1.0

return ret

參考部落格

推薦系統實踐筆記 一

第一章 好的推薦系統 1.1 什麼是推薦系統 當使用者沒有明確需求的時候 有明確需求的時候,通過搜尋引擎一般都能夠解決問題 如果週末想去看電影,但是不確定看什麼電影 不確定的需求 這時候需要乙個自動化的工具,它能夠根據你的歷史行為分析出你可能會喜歡哪些系統.推薦系統是自動聯絡使用者和物品的一種工具....

《推薦系統實踐》學習筆記(一)

第一章 好的推薦系統 2.長尾理論 80 20原則 3.社會化推薦 social recommendation 好友給自己推薦物品 基於內容的推薦 content based filtering 和以前物品相似的物品 基於協同過濾的推薦 collabrative filtering 和自己歷史興趣相...

推薦系統實踐筆記 八

第八章 評分 問題 乙個評分記錄為乙個三元組 u,i,r 我們用 r 表示乙個使用者u給物品i的評分.8.2 評分評測演算法 1 平均值 假設有兩個分類的函式,乙個是使用者分類函式 phi 乙個是物品分類函式 varphi phi u 定義了使用者u所屬的類,varphi i 定義了物品i所屬的類,...