1. 概述 python
和搜索引擎同樣,推薦系統是爲了幫助人們更快速的得到對本身有用的信息。 算法
和搜索引擎不一樣,推薦系統是人們被動的獲取,由系統根據用戶行爲或其餘的信息推薦給用戶的,兒搜索引擎是用戶主動輸入關鍵字獲取的。 網絡
從某種意義上說,搜索引擎和推薦系統是互相補充的。 優化
而推薦算法的本質是經過必定的方式將用戶和物品聯繫起來,從而有效的給用戶推薦自己感興趣或須要可是沒有發現的物品。 網站
個性化推薦系統的應用場景:電子商務(聽說Amazon 35%的銷售額來自推薦系統)、電影和視頻網站、個性化音樂網絡電臺、社交網絡、個性化閱讀、基於位置的服務、個性化郵件、個性化廣告(上下文廣告、搜索廣告、個性化展現廣告)。 搜索引擎
一個推薦系統的評判標準:用戶滿意度、預測準確度、覆蓋率、多樣性、新穎性、驚喜度、信任度、實時性、健壯性、商業目標。 code
2. 主要推薦系統算法 視頻
基於鄰域的方法、隱語義模型、基於圖的隨機遊走算法。在這些方法中,最著名、在業界獲得最普遍應用的算法是基於鄰域的方法。 索引
基於鄰域的方法主要包括:基於用戶的協同過濾算法(給用戶推薦和他興趣類似的其餘用戶喜歡的物品)和基於物品的協同過濾算法(給用戶推薦和該用戶喜歡的物品屬性相似的其餘物品) utf-8
下面主要說明一下第一種算法
基於用戶的協同過濾算法
該算法的主要步驟:一、找到與該用戶興趣類似的用戶集;二、找到這個集合中的用戶喜歡的可是沒有據說過的物品推薦給目標用戶。
第一步:計算用戶的興趣類似度
能夠經過如下公式計算:
其中u,v表示兩個用戶,N(u)表示用戶u曾經有過正反饋的物品集合;N(v)表示用戶v曾經有過正反饋的物品集合。
算法的Python實現以下:
def User_Similarity(train): W=dict() for u in train.keys(): for v in train.keys(): if u == v: continue; W[u][v] = len(train[u],train[v]) W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)
能夠發現該代碼的時間複雜度是O(n*n),而且大多數用戶的興趣類似度可能位0,即|N(u)∩N(v)| = 0,因此該代碼仍是能夠優化的。
咱們能夠先計算出|N(u)∩N(v)| ≠ 0的用戶對(u,v)而後除以餘弦類似度。這裏可使用倒排,將數據排列成物品到用戶的倒排表,物品後連接的是與對該物品感興趣的用戶鏈表,而後循環統計每一個物品用戶鏈表的用戶類似度便可。
算法的Python代碼以下:
#!/usr/bin/env python # coding=utf-8 def UserSimilarity(train): #創建倒排表 item_users = dict() for u,items in train.items(): for i in item.keys(): if i not in item_users: items_users[i] = set() item_users[i].add(u) #item_users即爲物品到用戶的倒排表 #計算用戶之間的相關度 C = dict()#任意用戶之間的相關度 N = dict()#用戶正反饋物品的數目 for i ,users in item_users: for u in users: N[u] += 1 for v in users: if u == v: continue: C[u][v] += 1 #最後計算結果矩陣 W = dict() for u ,related_users in C.items(): for v,cuv in related_users: W[u][v] = cuv / math.sqrt(N[u]* N[v]*1.0) return W
物品-用戶倒排表
第二步:推薦和他類似的K個用戶喜歡的物品
其中:p(u,i)用戶u對物品i的興趣度;
S(u,K)包含和用戶u興趣最相近的K的用戶;
Wuv用戶u和用戶v的興趣類似度;
Rvi用戶v對物品i的興趣度;
算法的Python代碼實現:
def Recommend(user,train,W): rank = dict() interacted_items = train[user] for v , wuv in sort(W[u].items,key = itemgetter(1),reverse = True)[0:k]: for i ,rvi in train[v].items: if i in interacted_items: continue rank[i] += wuv * rvi return rank