日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【推荐系统】{1} —— 基于用户的协同过滤算法

發布時間:2024/3/24 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【推荐系统】{1} —— 基于用户的协同过滤算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

協同過濾(英語:Collaborative Filtering,簡稱CF),簡單來說是利用某興趣相投、擁有共同經驗之群體的喜好來推薦用戶感興趣的信息,個人透過合作的機制給予信息相當程度的回應(如評分)并記錄下來以達到過濾的目的進而幫助別人篩選信息,回應不一定局限于特別感興趣的,特別不感興趣信息的紀錄也相當重要?!S基百科


基于用戶的協同過濾算法(簡稱UserCF)

在一個在線個性化推薦系統中,當一個用戶A需要個性化推薦時,可以先找到和他有相似興趣的其他用戶,然后把那些用戶喜歡的、而用戶A沒有聽說過的物品推薦給A。這種方法稱為基于用戶的協同過濾算法。

舉個例子:

用戶/物品物品A物品B物品C物品D
用戶A推薦給用戶A
用戶B
用戶C

要實現基于用戶的協同過濾,需要的步驟:

  • 收集用戶偏好
  • 通過計算相似度找到與目標用戶相似的用戶
  • 將相似用戶喜歡的、且目標用戶沒有聽說過的物品推薦給目標用戶

  • 一、計算兩個用戶的興趣相似度

    其中關鍵的一步就是計算兩個用戶的興趣相似度。

    協同過濾算法主要利用行為的相似度計算興趣的相似度。給定用戶 uuu 和用戶 vvv ,令 N(u)N(u)N(u) 表示用戶 uuu 曾經有過正反饋的物品集合,令 N(v)N(v)N(v) 為用戶 vvv 曾經有過正反饋的物品集合。則可以通過計算余弦相似度簡單地計算 uuuvvv 的興趣相似度:wuv=∣N(u)∩N(v)∣∣N(u)∪N(v)∣w_{uv} = \frac{|N(u)\cap{N(v)|}}{\sqrt{|N(u)\cup{N(v)|}}}wuv?=N(u)N(v)?N(u)N(v)?


    例子:

    圖片來源

    如圖,AAA、BBBCCCDDD 為用戶,aaa、bbb、ccc、dddeee 為物品。

    利用余弦相似度公式計算他們之間的興趣相似度分別為:wAB=∣{a,b,d}∩{a,c}∣∣{a,b,d}∣∣{a,c}∣=16w_{AB} = \frac{|{\{ a,b,d\}}\cap\{{a,c}\}|}{\sqrt{|\{a,b,d\}|\,\,|\{a,c\}}|}=\frac{1}{\sqrt{6}}wAB?={a,b,d}{a,c}?{a,b,d}{a,c}?=6?1?

    wAC=∣{a,b,d}∩{b,e}∣∣{a,b,d}∣∣{b,e}∣=16w_{AC} = \frac{|{\{ a,b,d\}}\cap\{{b,e}\}|}{\sqrt{|\{a,b,d\}|\,\,|\{b,e\}}|}=\frac{1}{\sqrt{6}}wAC?={a,b,d}{b,e}?{a,b,d}{b,e}?=6?1?

    wAC=∣{a,b,d}∩{c,d,e}∣∣{a,b,d}∣∣{c,d,e}∣=13w_{AC} = \frac{|{\{ a,b,d\}}\cap\{{c,d,e}\}|}{\sqrt{|\{a,b,d\}|\,\,|\{c,d,e\}}|}=\frac{1}{3}wAC?={a,b,d}{c,d,e}?{a,b,d}{c,d,e}?=31?
    但事實上,很多用戶相互之間并沒有對同樣的物品產生過行為,即 ∣N(u)∩N(v)∣=0|N(u)\cap{N(v)}|=0N(u)N(v)=0


    因此換一種思路,我們可以首先計算出 ∣N(u)∩N(v)∣≠0|N(u)\cap{N(v)}|≠0N(u)N(v)?=0 的用戶對 (u,v)(u,v)(u,v) ,然后再對這種情況除以分母 ∣N(u)∪N(v)∣\sqrt{{|N(u)\cup{N(v)|}}}N(u)N(v)? 。

    為此,可以首先建立 物品?>用戶物品->用戶?> 的倒排表。令稀疏矩陣 C[u][v]=∣N(u)∩N(v)∣C[u][v]=|N(u)\cap{N(v)}|C[u][v]=N(u)N(v) 。因此,可以遍歷倒排表中每個物品對應的用戶列表,將用戶列表中的兩兩用戶對應的 C[u][v]C[u][v]C[u][v] 同時加 111,最終就可以得到所有用戶之間不為 000C[u][v]C[u][v]C[u][v]。

    代碼實現如下:

    def UserSimilarity(train):# 建立倒排表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)# 修改相似度矩陣C = dict()N = dict()for i, users in item_users.items():for u in users:N[u] += 1for V in users:if u == v:continueC[u][v] += 1# 計算相似度矩陣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)。然后建立一個 4×44×44×4 的用戶相似度矩陣 WWW,對于物品 aaa,將 W[A][B]W[A][B]W[A][B]W[B][A]W[B][A]W[B][A]111,對于物品 bbb,將 W[A][C]W[A][C]W[A][C]W[C][A]W[C][A]W[C][A]111,以此類推(如圖2)。掃描完所有物品后,我們可以得到最終的 WWW 矩陣。 此處 WWW 是余弦相似度中的分子部分,將 WWW 除以分母即可得到最終的用戶興趣相似度(如圖3)。

    圖片來源


    二、進行推薦

    得到用戶之間的興趣相似度后,UserCFUserCFUserCF 算法會給用戶推薦和他興趣最相似的 KKK 個用戶喜歡的物品。以下公式度量了 UserCFUserCFUserCF 算法中用戶 uuu 對物品 iii 的感興趣程度: p(u,i)=∑v∈S(u,K)∩N(i)wuvrvip(u,i)=\displaystyle \sum_{v\in{S(u,K)\cap{N(i)}}}w_{uv}r_{vi}p(u,i)=vS(u,K)N(i)?wuv?rvi?

    K是 UserCFUserCFUserCF 算法的一個重要參數

    其中,S(u,K)S(u,K)S(u,K) 包含和用戶 uuu 興趣最接近的 KKK 個用戶,N(i)N(i)N(i) 是對物品 iii 有過行為的用戶集合,wurw_{ur}wur?
    是用戶 uuu 和用戶 vvv 的興趣相似度,rvir_{vi}rvi? 代表用戶 vvv 對物品 iii 的興趣,因為使用的是單一行為的隱反饋數據(否則使用評分等指標),所以所有的 rvi=1r_{vi}=1rvi?=1

    評分可以經過歸一化處理

    代碼如下:

    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:# 過濾互動過的項目continuerank[i] += wuv * rvireturn rank

    利用上述 UserCFUserCFUserCF 算法,可以給上述圖1、2、3的用戶 AAA 進行推薦。選取 K=3K=3K=3,用戶 AAA 對物品 ccceee 沒有過行為,因此可以把這兩個物品推薦給用戶 AAA。相似用戶則是 BBB、CCCDDD,他們喜歡過并且 AAA 沒有喜歡過的物品有 ccc、eee。根據 UserCFUserCFUserCF 算法,用戶 AAA 對物品 ccc、eee 的興趣是:p(A,c)=wAB×1+wAD×1=16+19=0.7416p(A,c)=w_{AB} ×1+ w_{AD} ×1= \frac{1}{\sqrt{6}}+\frac{1}{\sqrt{9}}=0.7416p(A,c)=wAB?×1+wAD?×1=6?1?+9?1?=0.7416p(A,e)=wAC×1+wAD×1=16+19=0.7416p(A,e)=w_{AC}×1+ w_{AD} ×1= \frac{1}{\sqrt{6}}+\frac{1}{\sqrt{9}}=0.7416p(A,e)=wAC?×1+wAD?×1=6?1?+9?1?=0.7416


    用戶相似度計算的改進:

    兩個用戶對冷門物品采取過同樣的行為比熱門物品更能說明他們興趣的相似度。因此,為了防止熱門物品的影響,提出如下公式計算用戶的興趣相似度:wuv=∑i∈N(u)∩N(v)1log1+∣N(i)∣∣N(u)∣∣N(v)∣w_{uv}=\frac{\displaystyle \sum_{i\in{N(u)\cap{N(v)}}}\frac{1}{log1+|N(i)|}}{\sqrt{|N(u)||N(v)|}}wuv?=N(u)N(v)?iN(u)N(v)?log1+N(i)1??

    上述公式通過 1log1+∣N(i)∣\frac{1}{log1+|N(i)|}log1+N(i)1? 懲罰了用戶 uuu 和用戶 vvv 共同興趣列表中熱門物品對他們相似度的影響。

    基于上述用戶相似度公式的算法記為 User?IIFUser-IIFUser?IIF 算法。

    代碼如下:

    def UserSimilarity(train):# 建立倒排表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)# 統計相似度矩陣C = dict()N = dict()for i, users in item_users.items():for u in users:N[u] += 1for v in users: if u == v:continueC[u][v] += 1 / math.1og(1 + len(users))# 計算相似度矩陣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

    UserCFUserCFUserCF 算法存在的問題:

    • 對于一個新用戶,很難找到相似用戶。
    • 對于一個物品,所有相似用戶都在其上沒有多少行為。
    • 矩陣稀疏。
    • 用戶量越來越大
    • 人類善變

    參考資料:《推薦系統實踐》

    總結

    以上是生活随笔為你收集整理的【推荐系统】{1} —— 基于用户的协同过滤算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。