推薦系統三十六式學習筆記:原理篇.近鄰推薦07|人以群分,你是什么人就看到什么世界

目錄

  • 協同過濾
  • 基于用戶的協同過濾
    • 背后的思想
    • 原理
    • 實踐
      • 1、構造矩陣
      • 2、相似度計算
      • 3、推薦計算
      • 4、一些改進
  • 應用場景:
  • 總結

談及推薦系統,不得不說大名鼎鼎的協同過濾。協同過濾的重點在于協同,所謂協同,也就是群體互幫互助,互相支持是群體智慧的體現,協同過濾也是這般簡單直接,歷久彌新。

協同過濾

當你的推薦系統過了只能使用基于內容的推薦階段后,就有了可觀的用戶行為了。這時候的用戶行為通常是正向的,也就是用戶或明或暗地表達著喜歡的行為。這些行為可以表達成一個用戶和物品的關系矩陣,或是網絡,或是圖,本質是一個東西。

這個用戶物品關系矩陣中填充的就是用戶對物品的態度,但并不是每個位置都有,需要的就是把那些還沒有的地方填充起來。這個關系矩陣是協同過濾的關鍵,一切都圍繞它來進行;

協同過濾是一個比較大的算法范疇。通常劃分為兩類;
1、基于記憶的協同過濾(Memory-Based)
2、基于模型的協同過濾(Model-Based)

基于記憶的協同過濾,就是記住每個人消費過什么東西,然后推薦相似的東西,或者推薦相似的人消費的東西。基于模型的協同過濾則是從用戶物品關系矩陣中去學習一個模型,從而把那些矩陣空白處填滿;

今天先講一下基于基于的協同過濾的一種:基于用戶,或者叫做User-Based;

基于用戶的協同過濾

背后的思想

你有沒有過這種感覺,你遇到一個人,你發現你喜歡的書,他也喜歡,你喜歡的音樂,他也在聽,你喜歡看的電影,他也至少看了兩三遍,你們這叫什么,志同道合。所以問題來了,他又看了一本書,又聽了一首歌,你會不會正好也喜歡呢?

這個感覺非常的自然,這就是基于用戶的協同過濾背后的思想。詳細來說就是:先根據歷史消費行為幫你找到一群和你口味相似的用戶,然后根據這些和你很相似的用戶消費了什么新的、你沒見過的物品、都可以推薦給你。

這就是我們常說的物以類聚人以群分,你是什么人,你就會遇到什么人。

這其實也是一個用戶聚類的過程,把用戶按照興趣口味聚類成不同的群體,給用戶產生的推薦就來自這個群體的平均值;所以要做好這個推薦,關鍵是如何量化口味相似這個指標。

原理

我們來說一下基于用戶的協同過濾具體是怎么做的,核心是那個用戶物品的關系矩陣,這個矩陣是最原始的材料。

第一步,準備用戶向量,從這個矩陣中,理論上可以給每一個用戶得到一個向量 。為什么說要是理論上呢?因為得到向量的前提是:用戶需要在我們產品里有行為數據,否則就得不到這個向量。

這個向量有這么三個特點:
1、向量的維度就是物品的個數;
2、向量是稀疏的,也就是說并不是每個位置都有值;
3、向量維度上的取值可以是簡單的0或1,1表示喜歡過,0表示沒有;

第二步,用每一個用戶的向量,兩兩計算用戶之間的相似度,設定一個相似度閾值,為每個用戶保留與其最相似的用戶。

第三步,為每一個用戶產生推薦結果。
把和他相似的用戶們喜歡過的物品匯總起來,去掉用戶自己已經消費過的物品,剩下的排序輸出就是推薦結果。

在這里插入圖片描述

這個公式,等號左邊就是計算一個物品i和一個用戶u的匹配分數,等號右邊是這個分數的計算過程,分母是把用戶u相似的n個用戶的相似度累加起來分子是把這n個用戶各自對物品i的態度,按照相似度加權求和。這里的態度最簡單就是0或1,1表示喜歡過,0表示沒有,如果是評分,則可以是0到5的取值。整個公式就是相似用戶們的態度加權平均值。

實踐

原理看上去很簡單,但是在實現上卻有一些坑,需要非常小心;
1、只有原始的用戶行為日志,需要從中構造矩陣,怎么做?
2、如果用戶的向量很長,計算一個相似度則耗時很久,怎么辦?
3、如果用戶量很大,而且通常如此,而且兩兩計算用戶相似度也是一個大坑,怎么辦?
4、在計算推薦時,看上去要為每一個用戶計算他和每一個物品的分數,又是一個大坑,怎么辦?

1、構造矩陣

我們在做協同過濾計算時,所用的矩陣是稀疏的,也就是說很多矩陣元素不用存,都是0,這里介紹典型的稀疏矩陣存儲格式。
1.CSR:這個存儲稍微復雜點,是一個整體編碼方式。它有三個組成:數值,列號和行偏移共同編碼。COO
2.COO:這個存儲方式很簡單,每個元素由三元組表示(行號,列號,數值),只存儲有值的元素,缺失值不存儲。
這些存儲格式,在常見的計算框架里面都是標準的,如Spark中,Python的Numpy包中。把你的原始行為日志轉換為上述的格式,就可以使用常用的計算框架的標準輸入了。

2、相似度計算

相似度計算是個問題。
首先是單個相似度計算問題,如果碰上向量很長,無論什么相似度計算方法,都要遍歷向量。所以通常下降相似度計算復雜度的辦法有兩種。

1、對向量采樣計算。如果兩個100維向量的相似度是0.7,我們犧牲一些精度,隨機從取出10維計算,以得到的值作為其相似度值,雖然精度下降,但執行效率明顯快了很多。這個算法由Twitter提出,叫做DIMSUM算法,已經在spark中實現了。

2、向量化計算,與其說是一個技巧,不如說是一種思維。在機器學習領域,向量之間的計算時家常便飯,現代的線性代數庫都支持直接的向量計算,比循環快很多。一些常用的向量庫都天然支持,比如python中的numpy庫。

其次的問題就是,如果用戶量很大,兩兩之間計算代價很大。

有兩個辦法來緩解這個問題:
第一個辦法是:將相似度拆成Map Reduce任務,將原始矩陣Map成鍵為用戶對,值為兩個用戶對同一個物品的評分之積,Reduce階段對這些乘積再求和,map reduce任務結束后再對這些值歸一化;

第二個辦法是:不用基于用戶的協同過濾。
這種計算對象兩兩之間的相似度的任務,如果數據量不大,而且矩陣還是稀疏的,有很多工具可以使用:比如KGraph 、GraphCHI等;

3、推薦計算

得到用戶之間的相似度之后,接下來就是計算推薦分數。顯然未每一個用戶計算每一個物品的推薦分數,這個代價有點大。不過,有幾點我們可以來利用一下:
1.只有相似用戶喜歡過的物品才需要計算,這樣就減少很多物品量。
2、把計算過程拆成Map Reduce 任務。

拆Map Reduce任務的做法是:
1、遍歷每個用戶喜歡的用戶列表;
2、獲取該用戶的相似用戶列表;
3、把每一個喜歡的物品Map成兩個記錄發射出去,一個鍵為<相似用戶ID,物品ID,1>三元組,值為<相似度>,另一個鍵為<相似用戶ID,物品ID,0>三元組,值為<喜歡程度相似度>,其中1和0是為了區分兩者,會在最后一步中用到。
4、Reduce階段,求和后輸出;
5、<相似用戶ID,物品ID,0>的值除以<相似用戶ID,物品ID,1>的值

因為map過程,其實就是將原來耦合的計算過程解耦了,這樣的話我們可以利用多線程技術實現Map效果。

4、一些改進

對于基于用戶的協同過濾有一些常用的改進辦法,改進主要集中在用戶對物品的喜歡程度上:
1.懲罰對熱門物品的喜歡程度,這是因為熱門的東西很難反應出用戶的真實興趣,更可能是被煽動,或者無聊隨便點擊的情形,這是群體行為的常見特點。
2.增加喜歡程度的時間衰減,一般使用一個指數函數,指數是一個負數,值和喜歡行為發生時間間隔正相關即可,比如 e ( ? x ) e^{(-x)} e(?x),x代表喜歡時間距今的時間間隔。

應用場景:

最后說一下基于用戶的協同過濾有哪些應用場景。基于用戶的協同過濾有兩個產出:

1、相似用戶列表
2、基于用戶的推薦結果

所以,我們不僅可以推薦物品,還可以推薦用戶,比如我們在一些社交平臺看到的,相似粉絲、和你口味類似的人等等都可以這樣計算。
對于這個方法計算出來的推薦結果本身,由于是基于口味計算得出,所以在更強調個人隱私場景中應用更佳,在這樣的場景下,不受大v影響,更能反應真實的興趣群體。

總結

今天,我與你聊了基于用戶的協同過濾方法,也順便普及了一下協同過濾這個大框架的思想。基于用戶的協同過濾算法非常簡單,但非常有效。

在實現這個方法時,有許多需要注意的地方,比如:
1、相似度計算本身如果遇到超大維度向量怎么辦?
2、兩兩計算用戶相似度遇到用戶量很大時怎么辦?

同時,我也聊到了如何改進這個推薦算法,希望能夠幫到你。

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

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

相關文章

初級軟件測試快速入門

文章目錄 初級軟件測試-測試用例、缺陷報告的認識與使用軟件測試簡介測試分類模型質量模型測試模型 用例編寫的八大要素用例設計方法缺陷 初級軟件測試-測試用例、缺陷報告的認識與使用 軟件測試簡介 什么是軟件測試&#xff1f; 使用技術手段驗證軟件是否滿足需求 主流技能 …

關于 Vue.js 中`transition`組件使用:頁面切換動畫和標簽移動動畫都是要用到的

一、引言 在 Vue.js 中&#xff0c;transition組件提供了一種簡單而強大的方式來實現頁面過渡效果。它可以讓元素在狀態改變時&#xff0c;如進入或離開視圖時&#xff0c;以平滑的動畫方式進行過渡。通過transition&#xff0c;我們可以為應用增添更加生動和吸引人的用戶體驗…

Linux文件編碼格式為unknown 8bit

file -i 1.txt顯示文件編碼為unknown 8bit, 說明這個文件的編碼格式因為一些不明原因無法識別了。 可以嘗試用其他編輯器打開&#xff0c;來看一下編輯器最終是用什么編碼格式打開的。 vim :set filecodingnotepad 直接打開文件&#xff0c;右下角會顯示文件編碼 假設文件編…

《數學學習與研究》雜志是什么級別?知網收錄嗎?評職認可嗎?

《數學學習與研究》雜志是什么級別&#xff1f;知網收錄嗎&#xff1f;評職認可嗎&#xff1f; 《數學學習與研究》是由東北師范大學主管&#xff0c;吉林省數學會與東北師范大學出版社聯合主辦的省級優秀數學類期刊雜志。該雜志為半月刊&#xff0c;國際標準刊號為 ISSN1007-…

圖解通用網絡IO底層原理、Socket、epoll、用戶態內核態······

LInux 操作系統中斷 什么是系統中斷 這個沒啥可說的&#xff0c;大家都知道&#xff1b; CPU 在執行任務途中接收到中斷請求&#xff0c;需要保存現場后去處理中斷請求&#xff01;保存現場稱為中斷處理程序&#xff01;處理中斷請求也就是喚醒對應的任務進程來持有CPU進行需要…

《大宅門》特別活動走進李良濟,開啟探尋中醫藥文化之旅!

《大宅門》話劇將于6月14-16日在蘇州灣大劇院上演&#xff0c;為了讓大家了解到中醫藥知識&#xff0c;6月2日&#xff0c;李良濟攜手蘇州灣大劇院舉辦《大宅門》特別活動“探尋中醫藥文化之旅”&#xff01; 6月2日下午&#xff0c;大家一起走進李良濟&#xff0c;深度了解傳統…

vite熱更新導致的問題及解決

一、封裝axios攔截器后,每次熱更新雖然請求了一次,但是response了多次: import axios from "axios"; axios.interceptors.request.use() axios.service.interceptors.response.use()導致此問題是因為觸發了多次攔截器,相當于是給axios添加了多個攔截器,所以多次…

怎么能通過chatgpt-on-wechat獲取全部的微信聊天信息

要通過 chatgpt-on-wechat 工具獲取全部的微信聊天信息&#xff0c;你可以按照以下步驟操作&#xff1a; 安裝并配置 itchat 庫&#xff1a; itchat 是一個開源的微信個人號接口&#xff0c;可以幫助你獲取微信群聊信息。 pip install itchat登錄微信&#xff1a; 使用 itchat …

小白必學!場外期權的交易模式

場外期權的交易模式 隨著金融市場的深化與創新&#xff0c;場外期權交易作為一種靈活多樣的金融衍生品交易方式&#xff0c;正逐漸成為投資者關注的焦點。場外期權&#xff0c;顧名思義&#xff0c;是在非交易所市場進行的期權交易&#xff0c;與交易所期權有著顯著的區別。那…

Promed Bioscience—高純度膠原蛋白

Promed Bioscience——高純度膠原蛋白供應商 專于研發&#xff0c;忠于質量&#xff0c;創新驅動 AXXORA 作為Enzo life sciences公司的子公司&#xff0c;是歐美最大的生命科學研究信息、服務、銷售電子一站式服務平臺之一&#xff0c;AXXORA精選歐洲四十多家優秀的生命科學研…

Mac 使用Docker安裝Elasticsearch、Kibana 、ik分詞器、head

安裝ElasticSearch 通過docker安裝es docker pull elasticsearch:7.8.1 在本地創建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 編輯yml文件內容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

JAVA-LeetCode 熱題-第24題:兩兩交換鏈表中的節點

思路&#xff1a; 定義三個指針&#xff0c;其中一個臨時指針&#xff0c;進行交換兩個節點的值&#xff0c;重新給臨時指針賦值&#xff0c;移動鏈表 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0,head);ListNode temp pre;wh…

docker部署fastdfs

我的鏡像包地址 鏈接&#xff1a;https://pan.baidu.com/s/1j5E5O1xdyQVfJhsOevXvYg?pwdhcav 提取碼&#xff1a;hcav docker load -i gofast.tar.gz拉取gofast docker pull sjqzhang/go-fastdfs啟動gofast docker run -d --name fastdfs -p 8080:8080 -v /opt/lijia/lijia…

antd vue a-select 搜索

數據結構 list: [{ name: "序號", id: 0, show: true },{ name: "出庫單編號", id: 1, show: false },{ name: "wbs元素", id: 2, show: true },{ name: "序號1", id: 3, show: true },{ name: "出庫單編號1", id: 4, show…

Java_Collection的其它相關知識

前置知識&#xff1a;可變參數 就是一種特殊形參&#xff0c;定義在方法&#xff0c;構造器的形參列表里&#xff0c;格式是&#xff1a;數據類型…參數名稱&#xff1b; 可變參數的好處和特點 好處&#xff1a;常常用來接受數據。 特點&#xff1a;可以不傳數據給它&#xf…

如何從小米手機傳輸文件到電腦? [5個簡單的方法]

與蘋果設備間的AirDrop或iTunes等工具相比&#xff0c;Android手機到PC的文件傳輸似乎不那么便捷。但小米用戶有多種應用&#xff0c;如Mi PC Suite和ShareMe&#xff0c;可以高效地進行傳輸。本文將介紹5種將小米設備文件傳輸到PC的方法&#xff0c;包括使用和不使用USB線的情…

深度學習_02_卷積神經網絡循環神經網絡

卷積神經網絡 1. 卷積神經網絡 神經元存在局部感受區域----感受野 . 第一個卷積神經網絡雛形----新認知機 缺點&#xff1a;沒有反向傳播算法更新權值&#xff0c;模型性能有限 第一個大規模商用卷積神經網絡----Lenet-5 缺點&#xff1a;沒有大量數據和高性能計算資源。 第一個…

圖解 React diff 算法

Render 階段會生成 Fiber Tree&#xff0c;所謂的 diff 實際上就是發生在這個階段&#xff0c;這里的 diff 指的是 current FiberNode 和 JSX 對象之間進行對比&#xff0c;然后生成新的的 wip FiberNode。 除了 React 以外&#xff0c;其他使用到了虛擬 DOM 的前端框架也會有類…

C++的枚舉

文章目錄 簡介枚舉的基本語法基本使用方法習題簡介 在C++中,枚舉(Enumeration)是一種數據類型,它允許程序員定義一個變量并指定它可以取的那些固定值的集合。枚舉的主要目的是提高代碼的可讀性和維護性,通過使用有意義的名稱而不是數字來表示狀態、類型或其他固定集合的值…