推薦系統(2)-協同過濾1-UserCF、ItemCF

協同過濾

  • 1.CF概述
  • 2.數據表示
  • 3.衡量相似度
  • 4.共現矩陣
  • 5.UserCF
  • 6.ItemCF
  • 7.UserCF 與ItemCF 應用場景、主要缺陷
  • 8.基于UserCF 電影推薦demo

《深度學習/推薦系統》讀書筆記

推薦系統的發展一日千里
傳統的推薦模型(2010年前后):協同過濾、羅輯回歸、因子分解、梯度提升樹
深度學習推薦模型(2015年后):…

在深度學習推薦模型成為推薦、廣告、搜索領域的主流,但是傳統推薦模型學習十分必要。因其為深度學習推薦模型的基礎,并且具備可解釋性強、硬件環境要求低,易于快速訓練和部署等不可替代的優勢。

1.CF概述

協同過濾–Collaborative Filtering(CF)

  1. 1992年–Xerox研發基于協同過濾的郵件篩選系統
  2. 2003年–Amazon發表論文《Amazon.com Recommenders Item-to-Item Collaborative Filtering》,促使CF成為使用熱點

基本思想:相似的人有相似的行為(購買),相似的物品有相似的屬性(被喜歡)。
基本流程:數據表示、定義相似、找相似TopN、按照相似候選集進行推薦決策。

三類協同過濾算法:

  1. 用戶協同過濾(UserCF):目標用戶與相似用戶的喜好相似
  2. 物品協同過濾(ItemCF):給用戶推薦有正反饋物品的相似物品
  3. 矩陣分解協同過濾(Matrix Factorization,MF):解決共現矩陣稀疏的問題。

2.數據表示

特征向量表示用戶/物品。
常用可解釋特征:

  1. 用戶向量–購買行為,評價行為,性別,年齡
  2. 物品向量–商品的類別,商品描述,用戶反饋信息

數據的高級語義特征,拓撲結構特征需要專門建模分析。
挖掘數據特征表示本就是一個重要的研究方向吧。

3.衡量相似度

向量本身具有長度和方向兩個屬性,當存在兩個向量相互作用時,還存在向量間夾角的問題。因此可以長度、夾角等不同的側重點,定義不同的相似性度量。

常用的相似性度量指標

  1. 距離度量–考察差異向量的長度∣∣x?y∣∣p||x-y||_px?yp?–1范數、2范數、無窮范數
  2. 余弦相似度:考察特征向量之間的夾角(x,y)–cos(x,y)=<x,y>∣∣x∣∣?∣∣y∣∣cos(x,y) = \frac{<x,y>}{||x||*||y||}cos(x,y)=x?y<x,y>?
  3. 皮爾遜相關系數:與推薦內容十分相關的定義式

4.共現矩陣

是用戶和商品對某一屬性行為的矩陣表示,例如購買,點擊,好評等行為。(缺陷就是只能表示一種屬性。)

簡單舉例:以用戶作為矩陣行坐標,商品作為矩陣的列坐標。矩陣中的元素就是某個用戶是否購買了某件商品。

5.UserCF

問題:是否推薦物品A給用戶X

  1. 收集各用戶對商品庫物品購買行為的共現矩陣(矩陣中缺失值的處理:取平均,直接去除)
  2. 計算TopN 相似用戶
  3. 依據TopN 相似用戶對物品A的購買行為,確定是否推薦物品A給用戶X(意見不統一的采用投票法,評分加權平均法)

主要缺陷:

  1. 用戶數遠大于物品數,維護用戶相似度矩陣的存儲開銷大。(兩兩相似N^2的空間)
  2. 用戶歷史數據非常稀疏,只有幾次購買或者點擊行為的用戶很難準確找到相似用戶。

6.ItemCF

實際在應用過程中,Amazon 和 Netflix 采用的是ItemCF 構建推薦系統。
通過計算物品列向量的相似度–》物品間相似度矩陣

  1. 構建共現矩陣[m*n]–m個用戶, n件商品;
  2. 計算共現矩陣列向量之間的兩兩相似度,構建[n*n]物品相似度矩陣;
  3. 獲取目標用戶歷史行為中有正反饋的物品列表;
  4. 利用物品相似度矩陣找出相似的TopK物品,構成相似物品集合;
  5. 依據相似度得分,生成最終推薦列表

強調:相似物品集合是 目標用戶有正反饋的物品的相似物品
注意:多個正反饋物品相似于同一個物品,這個物品的相似度得分取多個相似度的加權平均值。

7.UserCF 與ItemCF 應用場景、主要缺陷

  1. UserCF:用戶相似度,使其具備更強的社交特性,得知自己的同類最近喜歡什么,適用于新聞推薦場景,發現熱點跟蹤人點趨勢。
  2. ItemCF:適用于興趣變化較為穩定的應用,用戶在一個時間段傾向于尋找類似上商品。電影,書籍,電視劇這種喜好風格,一段時間內變化比較小。

主要缺陷:推薦結果的頭部效應比較明顯,處理稀疏向量的能力比較弱

  1. 泛化能力弱,無法將兩個物品相似推廣到其他物品相似的計算上
  2. 熱門商品具有很強的頭部效應,更大家都相似。
  3. 而尾部商品由于特征向量稀疏,跟大家都不相似,導致很少被推薦。

為了解決上述問題,同時增加模型的泛化能力,矩陣分解技術被提出來(下一篇講)
用更稠密的隱向量表示用戶和物品,挖掘用戶的隱藏興趣和隱藏特征。

8.基于UserCF 電影推薦demo

(想找一個有關于推薦系統所有算法的repository,沒有找到合適的,尤其是關于經典推薦算法。動手敲一敲唄。)
數據:用戶對電影的評分
數據格式:

# [用戶ID,電影ID,電影評分,時間標簽] 8W條數據
1  1  2  3  876893171
2  1  3  4  878542960
3  1  4  3  876893119
4  1  5  3  889751712

基本思路:預測用戶未評分的電影評分,給該每個用戶推薦預測評分最高的TopN 個電影。預測的依據–相似用戶對該電影評分的加權平均效果。
代碼參考《python與數據挖掘》第10章
demo代碼與數據

# 20210424 UserCF demo
# movie recommend
import pandas as pddef prediction(df, userdf, Nn=15):# 預測用戶未評分電影的評分corr = df.T.corr()     # 計算用戶的相關person相關系數矩陣rats = userdf.copy()for usrid in userdf.index:print(usrid)# step1:獲取用戶未評分電影dfnull = df.loc[usrid][df.loc[usrid].isnull()]    # 用戶user1沒有評分的電影:('mov6',nan)usrv = df.loc[usrid].mean()                       # 用戶user1電影評分的均值# step2: 預測未評分電影的分值for i in range(len(dfnull)):nft = (df[dfnull.index[i]]).notnull()         # 用戶user1沒有評分的電影,其他人評分與否if(Nn <= len(nft)):nlist = df[dfnull.index[i]][nft][:Nn]     # 用戶user1沒有評分的電影,前Nn有評分的人else:nlist = df[dfnull.index[i]][nft][:len(nft)]   # len(df[dfnull.index[i]][nft]) < len(nft), 有啥用呢# 1)獲取非null相關系數,有評分人列表nlist = nlist[corr.loc[usrid, nlist.index].notnull()]  # 用戶user1 和 有評分人的非null 相關系數的評分人列表nratsum, corsum = 0, 0if(0!=nlist.size):nv = df.loc[nlist.index,:].T.mean()         # 相關有評分人對所有電影的評分的平均值for index in nlist.index:                   # 相關評論人userxncor = corr.loc[usrid, index]           # 用戶user1 和 userx相關系數nratsum += ncor*(df[dfnull.index[i]][index]-nv[index])   # ncor*(df['mov6'][userx]-nv[userx])corsum += abs(ncor)if(corsum != 0):rats.at[usrid, dfnull.index[i]] = usrv + nratsum/corsum   # 預測用戶user1對沒有評分電影的評分else:rats.at[usrid, dfnull.index[i]] = usrv                    # 無其他用戶評分修正的情況下,用自己的評分均值填補else:rats.at[usrid,dfnull.index[i]] = Nonereturn rats
def recomm(df, userdf, Nn=15, TopN=3):# 依據為未評分電影預測評分,給出每個用戶的推薦列表。ratings = prediction(df, userdf, Nn)recomm = []for usrid in userdf.index:# 按Nan值獲取未評分項ratft = userdf.loc[usrid].isnull()ratnull = ratings.loc[usrid][ratft]# 對預測評分項進行排序if(len(ratnull) >= TopN):sortlist = (ratnull.sort_values(ascending=False)).index[:TopN]else:sortlist = ratnull.sort_values(ascending=False).index[:len(ratnull)]recomm.append(sortlist)return ratings,recommif __name__ == "__main__":print("------使用基于UserCF算法對電影進行推薦中...-----")traindata = pd.read_csv("./data/Chapter10/u1.base", sep='\t', index_col=None, header=None)  # [用戶ID,電影ID,電影評分,時間標簽] 8W條數據print(traindata.head())testdata = pd.read_csv("./data/Chapter10/u1.test", sep='\t', index_col=None, header=None)traindata = traindata[:1000]testdata = testdata[:1000]# 刪除時間列--本例中沒有用traindata.drop(3, axis=1, inplace=True)testdata.drop(3, axis=1, inplace=True)# 行與列重新命名traindata.rename(columns={0: 'userid', 1: 'movid', 2: 'rat'}, inplace=True)testdata.rename(columns={0: 'userid', 1: 'movid', 2: 'rat'}, inplace=True)# 整理成共現矩陣traindf = traindata.pivot(index='userid', columns='movid', values='rat')testdf = testdata.pivot(index='userid', columns='movid', values='rat')# 重命名表格的行和列traindf.rename(index={i: 'user%d'%i for i in traindf.index}, inplace=True)testdf.rename(index={i: 'user%d'%i for i in testdf.index}, inplace=True)traindf.rename(columns={i: 'mov%d'%i for i in traindf.columns}, inplace=True)testdf.rename(columns={i: 'mov%d'%i for i in testdf.columns}, inplace=True)print('d', traindata.head())userdf = traindf.loc[testdf.index]trainrats, trainrecom = recomm(traindf, userdf)print(trainrecom[:1])print(len(trainrecom))print('end')

輸出:

# 每個用戶的推薦電影列表,每人推薦3部
[Index(['mov189', 'mov396', 'mov390'], dtype='object', name='movid')]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444737.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sql查詢實例1(學生表_課程表_成績表_教師表)

表架構 Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cname,T#) 課程表 SC(S#,C#,score) 成績表 Teacher(T#,Tname) 教師表 建表語句 CREATE TABLE student ( s# INT, sname nvarchar(32), sage INT, ssex nvarchar(8) ) CREATE TABLE course ( c# INT, cname…

android 存儲方式以及路徑簡介

存儲分成了內部存儲和外部存儲。注意內部存儲又叫做機身內存,而且內存又包含了兩個部分RAM(運行時內存,這個和運行速度有關系,是手機運行時存儲數據和指令的地方)、ROM(這個才算是真正存儲東西的內部存儲范圍,是應用配置和其他數據的地方);而外部存儲就很明確了,用戶的外部掛…

MachineLearning(11)-關聯規則分析

關聯規則分析1.簡單來說-關聯規則2.經典關聯規則挖掘-Apriori1.簡單來說-關聯規則 關聯規則–通過量化的數字描述物品甲的出現 對 物品乙的出現 有多大影響。 最早是為了發現超市銷售數據庫中不同的商品之間的關聯關系&#xff1a;哪組商品可能會在一次購物中同時購買。 廣泛…

APK 安卓反編譯

在學習Android開發的過程你&#xff0c;你往往會去借鑒別人的應用是怎么開發的&#xff0c;那些漂亮的動畫和精致的布局可能會讓你愛不釋手&#xff0c;作為一個開發者&#xff0c;你可能會很想知道這些效果界面是怎么去實現的&#xff0c;這時&#xff0c;你便可以對改應用的A…

sql查詢實例2(借書卡、圖書、借書記錄)

問題描述&#xff1a; 本題用到下面三個關系表&#xff1a; CARD 借書卡。 CNO 卡號&#xff0c;NAME 姓名&#xff0c;CLASS 班級 BOOKS 圖書。 BNO 書號&#xff0c;BNAME 書名,AUTHOR 作者&#xff0c;PRICE 單價&#xff0c;QUANTITY 庫存冊數 BORROW 借書記錄。 CNO 借…

開始學習Unity3D(一)

本人最近轉行開始做海外獨立游戲的發行,主要是負責服務器,開會注意到海外的服務越來越豐富越來越細分,對國內將會造成很大的沖擊,比如AWS,Google,GameSparks等,這導致國內的所謂服務器開發將越來越簡單,國內對服務器開發的需求越來越少,反而客戶端的需求越來越多,所以…

List 流的使用

摘要 本文將介紹在 Java 1.8 中對 List 進行流操作的使用方法。引入的 java.util.stream 包為開發者提供了一種更為便捷和強大的方式來處理集合數據。通過使用流&#xff0c;我們能夠以聲明性的方式進行集合操作&#xff0c;減少了樣板代碼&#xff0c;提高了代碼的可讀性和可…

推薦系統(3)-協同過濾2-矩陣分解算法

協同過濾-矩陣分解算法1.奇異值分解2.梯度下降3.矩陣分解方法的優缺點《深度學習/推薦系統》讀書筆記&#xff08;其實矩陣分解和協同過濾已經沒有特別大的聯系了&#xff09; 2006年&#xff0c;在Netfilx舉辦的推薦算法競賽中Netflix Prize Challenge中&#xff0c;以矩陣分解…

leetcode141 環形鏈表

給定一個鏈表&#xff0c;判斷鏈表中是否有環。 為了表示給定鏈表中的環&#xff0c;我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置&#xff08;索引從 0 開始&#xff09;。 如果 pos 是 -1&#xff0c;則在該鏈表中沒有環。 示例 1&#xff1a; 輸入&#xff1a;head …

iPhoneX適配

目錄(?)[-]核心代碼自動化修改代碼參考資料iPhoneX適配&#xff0c;比較搓的一種方式&#xff0c;在不修改分辨率&#xff08;720 x 1280&#xff09;的情況下適配iphone X 主屏尺寸&#xff1a; 5.8英寸 主屏分辨率&#xff1a; 2436 x 1125核心代碼修改 工程目錄/Classes/Un…

centos安裝nginx,配置負載均衡

&#xfeff;&#xfeff;1、安裝nginx安裝教程&#xff0c;參照&#xff1a;http://mp.weixin.qq.com/s/RVaRlRpHqZRjCaXGmOlfKw 2、反向代理的配置修改部署目錄下conf子目錄的nginx.conf文件的內容[html]view plaincopylocation / { #設置主機頭和客戶端真實地…

leetcode142 環形鏈表II

給定一個鏈表&#xff0c;返回鏈表開始入環的第一個節點。 如果鏈表無環&#xff0c;則返回 null。 為了表示給定鏈表中的環&#xff0c;我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置&#xff08;索引從 0 開始&#xff09;。 如果 pos 是 -1&#xff0c;則在該鏈表中沒有…

PaperNotes(18)-VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized Representation

自動駕駛論文閱讀筆記11. Ployline Garph2. Global Graph3. 模型目標函數4.Related work5.Experiment5.1 實驗設置5.2 消融實驗5.3 模型資源消耗5.4 與其他模型的對比實驗VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized RepresentationVectorNet: 通過矢量化…

ubuntu的apache配置https

&#xfeff;&#xfeff;一、配置Apache 1、開啟SSL模塊a2enmod ssl 2、啟用SSL站點a2ensite default-ssl 3、加入監聽端口vi /etc/apache2/ports.conf #編輯Apache端口配置&#xff0c;加入443端口 Listen 443注&#xff1a;Ubuntu啟用SSL站點后&#xff0c;缺省已經加入了 (…

vim特別好的教程

歡 迎 閱 讀 《 V I M 教 程 》 —— 版本 1.7 Vim 是一個具有很多命令的功能非常強大的編輯器。限于篇幅&#xff0c;在本教程當中 就不詳細介紹了。本教程的設計目標是講述一些必要的基本命令&#xff0c;而掌握好這 些命令&#x…

jquery、javascript實現(get、post兩種方式)跨域解決方法

&#xfeff;&#xfeff;jquery、javascript實現(get、post兩種方式)跨域解決方法一、實現get方式跨域請求數據瀏覽器端<script> $(document).ready(function(){$.ajax({url: "http://www.xxx.cn/index.php",type: "get",dataType: "jsonp&quo…

推薦系統(4)-邏輯回歸LR、POLY2、FM、FFM

邏輯回歸LR、POLY2、FM、FFM1.邏輯回歸LR2.辛普森悖論3.POLY24.FM-20105.FFM6.GBDTLR-20147.LS-PLM-2017《深度學習/推薦系統》讀書筆記1.邏輯回歸LR Logistic Regression – 融合多種特征&#xff0c;通過sigmoid 函數&#xff0c;預測樣本的被點擊的概率。樣本用特征向量x[x…

leetcode125驗證回文串

給定一個字符串&#xff0c;驗證它是否是回文串&#xff0c;只考慮字母和數字字符&#xff0c;可以忽略字母的大小寫。 說明&#xff1a;本題中&#xff0c;我們將空字符串定義為有效的回文串。 示例 1: 輸入: "A man, a plan, a canal: Panama" 輸出: true 示例 …

配置 Elastic Beanstalk 環境負載均衡器以終止 HTTPS

&#xfeff;&#xfeff;配置 Elastic Beanstalk 環境負載均衡器以終止 HTTPS 要更新您的 AWS Elastic Beanstalk 環境以使用 HTTPS&#xff0c;您需要為您的環境中的負載均衡器配置 HTTPS 偵聽器。以下兩種類型的負載均衡器支持 HTTPS 偵聽器&#xff1a;傳統負載均衡器和應用…

AWS 給負載均衡器配置偵聽器并上傳IAM證書

&#xfeff;&#xfeff;1.打開EC2的負載均衡器&#xff1a;添加偵聽器&#xff0c;選擇https&#xff0c;ssl證書需要有一個CA證書&#xff0c;可以去阿里云申請&#xff0c;也可以從亞馬遜獲取&#xff1a;注意&#xff0c;這里的ssl證書要這樣寫其中私有密鑰不是那種xxxxxx…