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所屬的類,...