基於鄰域的推薦算法

User-Based

  1. 用戶相似度:
    wuv=N(u)N(v)N(u)N(v)w_{uv} = \frac{|N(u) \cap N(v)|}{|N(u) \cup N(v)|}
    wuv=N(u)N(v)N(u)N(v)w_{uv} = \frac{|N(u) \cap N(v)|}{\sqrt{|N(u)| |N(v)|}}
  2. 建立物品-用戶倒排表,轉化爲用戶相似度矩陣:
def UserSimilarity(train):
        # build inverse table for item_users
        item_users = dict()
        for u, items in train.items():
             for i in items.keys():
                 if i not in item_users:
                     item_users[i] = set()
                 item_users[i].add(u)
        #calculate co-rated items between users
        C = dict()
        N = dict()
        for i, users in item_users.items():
             for u in users:
                 N[u] += 1
                 for v in users:
                     if u == v:
                         continue
                     C[u][v] += 1
        #calculate finial similarity matrix W
        W = dict()
        for u, related_users in C.items():
             for v, cuv in related_users.items():
                 W[u][v] = cuv / math.sqrt(N[u] * N[v])
		return W
  1. UserCF下用戶uu對物品ii的感興趣程度,S(u,k)S(u,k)是和用戶uu相似度最接近的KK個用戶,N(i)N(i)是對物品ii有過行爲的用戶集合:
    p(u,i)=vS(u,K)N(i)wuvrvip(u, i) = \sum_{v\in S(u,K) \cap N(i)}w_{uv}r_{vi}
  2. 代碼實現:
def Recommend(user, train, W):
    rank = dict()
    interacted_items = train[user]
    for v, wuv in sorted(W[u].items, key=itemgetter(1), \
        reverse=True)[0:K]:
        for i, rvi in train[v].items:
             if i in interacted_items:
                 #we should filter items user interacted before
                 continue
             rank[i] += wuv * rvi
    return rank
  1. 改進用戶相似度計算公式:
    wuv=N(u)N(v)N(u)N(v)w_{uv} = \frac{|N(u) \cap N(v)|}{\sqrt{|N(u)| |N(v)|}}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章