這是2019年的第一篇文章,由於最近導師給了一個新的任務,有關某app的個性化推薦的,正好本身也是第一次學習這方面的知識,便想着彙總整理下。前人栽樹,後人乘涼,由於篇幅緣由,這一部分準備分開來敘述,本篇主要和你們介紹基於用戶的協同過濾算法,但願能夠對你們有所幫助,若有謬誤,還望指正!算法
其實個性化推薦系統早已滲透進咱們的生活了,網易雲音樂的「每日推薦」,淘寶的」猜你喜歡「,這些都是生活中很是常見的個性化推薦的案例。現在,隨着大數據的發展,個性化推薦早已涉及諸多領域,好比電子商務(京東淘寶)、電影和電視網站(youtube)、個性化音樂網絡電臺(網易雲音樂)、社交網絡(QQ)、個性化閱讀(微信讀書)、基於位置的個性化服務(美團)等。推薦算法的本質是經過必定的方式將用戶和物品聯繫起來,而不一樣的推薦系統也會根據實際狀況採起不一樣的推薦方式。npm
通常來講一個完整的推薦系統通常包括如下三個參與方:微信
以網易雲音樂的日推爲例:網絡
首先,推薦系統須要知足用戶的需求,給用戶推薦那些令他們感興趣的音樂。其次,推薦系統要儘可能讓各個歌手的歌都可以被推薦給對其感興趣的用戶,而不是隻推薦幾個大流量歌手的歌。最後, 好的推薦系統設計,可以讓推薦系統自己收集到高質量的用戶反饋,不斷完善推薦的質量,增長用戶和網站的交互,提升網站的收入。以下圖所示:app
想要評判一個東西好很差,必定要有個標準。那麼推薦系統好壞的標準是什麼呢?試想一下爲何你們都喜歡網易雲音樂的每日推薦而不喜歡今日頭條的每日推送呢?最直觀的感覺就是網易雲的日推歌曲你愛聽,而頭條的推送你很討厭。因此說預測準確度是推薦系統領域的重要指標(沒有之一)。dom
好的推薦系統不只僅可以準確預測用戶的行爲,並且可以擴展用戶的視野,幫助用戶發現那些他們可能會感興趣,但卻不那麼容易發現的東西(好比網易雲音樂常常給你推送那些很是好聽可是比較冷門的歌曲)。同時,推薦系統還要可以幫助商家將那些被埋沒在長尾中的好商品介紹給可能會對它們感興趣的用戶。學習
爲了讓推薦結果符合用戶口味,咱們須要深刻了解用戶。如何才能瞭解一我的呢?《論語·公冶長》中說「聽其言,觀其行」,也就是說能夠經過用戶留下的文字和行爲了解用戶興趣和需求。大數據
實現個性化推薦的最理想狀況是用戶能主動告訴系統他喜歡什麼,好比好久以前註冊網易雲音樂的時候會讓用戶選擇喜歡什麼類型的歌曲,但這種方法有3個缺點:首先,如今的天然語言理解技術很難理解用戶用來描述興趣的天然語言;其次,用戶的興趣是不斷變化的,但用戶不會不停地更新興趣描述;最後,不少時候用戶並不知道本身喜歡什麼,或者很難用語言描述本身喜歡什麼。網站
所以,咱們須要經過算法自動發掘用戶行爲數據,從用戶的行爲中推測出用戶的興趣,從而給用戶推薦知足他們興趣的物品。設計
基於用戶行爲分析的推薦算法是個性化推薦系統的重要算法,學術界通常將這種類型的算法稱爲協同過濾算法(Collaborative Filtering Algorithm)。顧名思義,協同過濾就是指用戶能夠齊心合力,經過不斷地和網站互動,使本身的推薦列表可以不斷過濾掉本身不感興趣的物品,從而愈來愈知足本身的需求。
既然是基於用戶的行爲分析,就必需要將用戶的行爲表示出來,下表給出了一種用戶行爲的表示方式(固然,在不一樣的系統中,每一個用戶所產生的行爲也是不同的),它將個用戶行爲表示爲 6 部分,即產生行爲的用戶和行爲的對象、行爲的種類、產生行爲的上下文、行爲的內容和權重。
表示 | 備註 |
---|---|
user id | 產生行爲的用戶的惟一標識 |
item id | 產生行爲的對象的惟一標識 |
behavior type | 行爲的種類(好比說是點贊仍是收藏) |
context | 產生行爲的上下文,包括時間和地點等信息 |
behavior weight | 行爲的權重(若是是聽歌的行爲,那麼權重能夠是聽歌時常) |
behavior content | 行爲的內容(若是是評論行爲,那麼就是評論的文本) |
隨着學術界的大佬們對協同過濾算法的深刻研究,他們提出了不少方法,好比基於鄰域的方法(neighborhood-based)、隱語義模型(latent factor model)、基於圖的隨機遊走算法(random walk on graph) 等。在這些方法中,最著名的、在業界獲得最普遍應用的算法是基於鄰域的方法,而基於鄰域的方法主要包含下面兩種算法:
在一個在線個性化推薦系統中,當一個用戶A須要個性化推薦時,能夠先找到和他有類似興趣的其餘用戶,而後把那些用戶喜歡的、而用戶A沒有據說過的物品推薦給A。這種方法稱爲基於用戶的協同過濾算法。
基於用戶的協同過濾算法主要包括兩個步驟:
步驟1的關鍵就是計算兩個用戶的興趣類似度。這裏,協同過濾算法主要利用行爲的類似度計算興趣的類似度。
舉個栗子🌰:假設如今有三個用戶A、B、C,已經知道A連續5天都在聽周杰倫和林俊杰的歌,B連續5天在聽劉德華和張學友的歌,C連續聽了5天林俊杰和張傑的歌,那麼你說A和誰的興趣類似度更高,天然是C。
剛纔是你在腦海中思考這個問題的,那若是讓機器思考A和誰的興趣類似度更高呢?
其實也很簡單,不過在進行下一步的講解以前,先讓咱們回顧下基本的數學知識:
在數學中,咱們經過測量兩個向量的夾角的餘弦值來度量它們之間的類似性,兩個向量有相同的指向時,餘弦類似度的值爲1;兩個向量夾角爲90°時,餘弦類似度的值爲0;兩個向量指向徹底相反的方向時,餘弦類似度的值爲-1。名曰:「餘弦類似性」。最重要的是這必定律不只僅適用在二維空間,對任何維度的向量空間中都適用,所以餘弦類似性經常使用於高維正空間。例如在信息檢索中,每一個詞項被賦予不一樣的維度,而一個文檔由一個向量表示,其各個維度上的值對應於該詞項在文檔中出現的頻率。餘弦類似度所以能夠給出兩篇文檔在其主題方面的類似度。
考慮到大多數人可能已經忘了怎麼計算餘弦類似度了,在這再給你們開個小竈,簡單的回顧下計算方法,想要深刻了解的,請自行Google。
假設有二維向量a,b以下圖所示:
則他們的餘弦類似度爲:
推廣到多維向量,:
理解了上述數學知識,接下來的就是基本操做了,首先咱們先給定兩個用戶和,令表示 聽過的歌的集合,表示聽過的歌的集合,那麼就表示、 都聽過的歌的集合,就表示或 聽過的歌的集合總數,表示用戶和用戶的類似度。
咱們來嘗試計算下A和D之間的興趣類似度:
從 「用戶聽過的歌曲」 能夠看出,A和D都聽過的歌只有d,也就是1個。用戶A打開過的網頁數=3,用戶D打開過的網頁數=3。因此A和D的類似度。其餘的計算也是相似的。
在獲得用戶之間的類似度以後,咱們要作的就是解決步驟2的問題了,假設e是剛剛發佈的新歌,用戶C和用戶D都已經聽過了,那麼如何計算A對新歌e的感興趣程度呢?
獲得用戶之間的興趣類似度後,UserCF算法會給用戶推薦和他興趣最類似的K個用戶喜歡的物品。以下的公式度量了 UserCF 算法中用戶 u 對物品的感興趣程度:
其中,包含和用戶興趣最接近的個用戶,是對物品有過行爲的用戶集合,是用戶 和用戶 的興趣類似度,表明用戶 對物品的興趣,由於使用的是單一行爲的隱反饋數據,因此全部的 =1。
上面一大段截取自《推薦系統實踐》,可能不少人看到這公式和這解析有些雲裏霧裏,簡單來講就是:
其中表示A對e的興趣度,表示A與B的類似度,表示B對e的興趣度 ,以此類推。由於咱們這裏用的不是評分制,而是考慮是否聽過這首歌,那麼C聽了e,C對e的興趣度就是1,B沒聽過這首歌,因此B對e的興趣度爲0。
因此咱們能夠預測A對e的類似度爲:
這篇文章從網易雲音樂的每日推薦這個生活中很常見的例子,引出了什麼是推薦系統,一個好的推薦系統是什麼樣子的,進而引出協同過濾的概念,而且介紹了什麼是基於用戶的協同過濾,同時還回顧了餘弦類似性等數學知識。然而真正在實際的企業產品中,基於用戶的協同過濾並不會這麼簡單,判斷兩個用戶的類似程度也不是簡簡單單的使用餘弦類似性就能夠了,考慮到本文旨在讓更多的人對個性化推薦有個簡單的概念,本文就不詳細展開了,推薦閱讀相關的論文,下一篇文章將會介紹基於內容的協同過濾算法。