1. 程式人生 > >【推薦系統】詳解基於內容的推薦演算法

【推薦系統】詳解基於內容的推薦演算法

作者:章華燕

編輯:田 旭

前言

在第一篇文章《推薦演算法綜述》中我們說到,真正的推薦系統往往是多個推薦演算法策略的組合使用,本文介紹的將會是推薦系統最古老的演算法:基於內容的推薦演算法(Content-Based Recommendations CB)。

CB是最早被使用的推薦演算法,它的思想非常簡單:根據使用者過去喜歡的物品(本文統稱為 item),為使用者推薦和他過去喜歡的物品相似的物品。而關鍵就在於這裡的物品相似性的度量,這才是演算法運用過程中的核心。 CB最早主要是應用在資訊檢索系統當中,所以很多資訊檢索及資訊過濾裡的方法都能用於CB中。

舉個簡單的例子:在京東上購物的小夥伴們應該都知道,每當你進入任何一個物品頁面的時候都會有一個“猜你喜歡”的欄目,這時候他就會根據你經常購買的物品給你推薦相似的物品。例如對我來說:我經常購買網際網路類書籍,所以它就會給我推薦類似的書籍(當然這裡只是舉個例子,京東的推薦演算法肯定不可能那麼單一,但是可以肯定的是他肯定會用到最基礎的CB推薦演算法)。

CB的過程一般包括以下三步:

  • 物品表示(Item Representation):為每個item抽取出一些特徵(也就是item的content了)來表示此item;

  • 特徵學習(Profile Learning):利用一個使用者過去喜歡(及不喜歡)的item的特徵資料,來學習出此使用者的喜好特徵(profile);

  • 生成推薦列表(Recommendation Generation):通過比較上一步得到的使用者profile與候選item的特徵,為此使用者推薦一組相關性最大的item。 

舉個例子說明前面的三個步驟。隨著今日頭條的崛起,基於內容的文字推薦就盛行起來。在這種應用中一個item就是一篇文章。

  1. 第一步,我們首先要從文章內容中抽取出代表它們的屬性。常用的方法就是利用出現在一篇文章中詞來代表這篇文章,而每個詞對應的權重往往使用資訊檢索中的tf-idf來計算。利用這種方法,一篇抽象的文章就可以使用具體的一個向量來表示了。

  2. 第二步,根據使用者過去喜歡什麼文章來產生刻畫此使用者喜好的特徵向量了,最簡單的方法可以把使用者所有喜歡的文章對應的向量的平均值作為此使用者的特徵向量。比如我經常在今日頭條閱讀技術科技相關的文章,那麼今日頭條的演算法可能會把我的Profile中的:“網際網路”、“大資料”、“機器學習”、“資料探勘”等關鍵詞的權重設定的比較大。

  3. 這樣,當我登入頭條客戶端的時候,他獲取到我的使用者Profile後,利用CB演算法將我的個人Profile與文章Item的Profile的相似度(相似度的衡量可以用餘弦相似度Cosine)進行計算,然後按相似度大小取最大的前N個篇文章作為推薦結果返回給我的推薦列表中。

接下來我們詳細介紹下上面的三個步驟:

物品表示

真實應用中的item往往都會有一些可以描述它的屬性。這些屬性通常可以分為兩種:結構化的(structured)屬性與非結構化的(unstructured)屬性。所謂結構化的屬性就是這個屬性的意義比較明確,其取值限定在某個範圍;而非結構化的屬性往往其意義不太明確,取值也沒什麼限制,不好直接使用。比如在交友網站上,item就是人,一個item會有結構化屬性如身高、學歷、籍貫等,也會有非結構化屬性(如item自己寫的交友宣言,部落格內容等等)。對於結構化資料,我們自然可以拿來就用;但對於非結構化資料(如文章),我們往往要先把它轉化為結構化資料後才能在模型里加以使用。真實場景中碰到最多的非結構化資料可能就是文章了(如個性化閱讀中)。下面我們就詳細介紹下如何把非結構化的一篇文章結構化。

如何代表一篇文章在資訊檢索中已經被研究了很多年了,下面介紹的表示技術其來源也是資訊檢索,其名稱為向量空間模型(Vector Space Model,簡稱VSM)。

記我們要表示的所有文章集合為 D={d1,d2,...,dn},而所有文章中出現的詞(對於中文文章,首先得對所有文章進行分詞)的集合(也稱為詞典)為T={t1,t2,...,tn}。也就是說,我們有N篇要處理的文章,而這些文章裡包含了n個不同的詞。我們最終要使用一個向量來表示一篇文章,比如第j篇文章被表示為dj={w1j,w2j,...,wnj},其中wij表示第i個詞ti在文章j中的權重,值越大表示越重要。dj中其他向量的解釋類似。所以,為了表示第j篇文章,現在關鍵的就是如何計算dj各分量的值了。例如,我們可以選取wij為1,如果詞ti出現在第 j 篇文章中;選取為0,如果ti未出現在第j篇文章中。我們也可以選取wij為詞ti出現在第 j 篇文章中的次數(frequency)。但是用的最多的計算方法還是資訊檢索中常用的詞頻-逆文件頻率(term frequency–inverse document frequency,簡稱tf-idf)。第j篇文章中與詞典裡第k個詞對應的tf-idf為:

其中,TF(tk,dj) 是第k個詞在文章j中出現的次數,而nk 是所有文章中包含第k個詞的文章數量。

最終第k個詞在文章j中對應的權重由如下公式獲得:

做歸一化的好處是不同文章之間的表示向量被歸一到一個量級上,便於下面步驟的操作。

特徵學習

假設使用者u已經對一些item給出了他的喜好判斷,喜歡其中的一部分item,不喜歡其中的另一部分。那麼,這一步要做的就是通過使用者u過去的這些喜好判斷,為他產生一個模型。有了這個模型,我們就可以根據此模型來判斷使用者u是否會喜歡一個新的item。所以,我們要解決的是一個典型的有監督分類問題,理論上機器學習裡的分類演算法都可以照搬進這裡。

下面我們簡單介紹下CB裡常用的一些學習演算法:

1
最近鄰方法(簡稱KNN)

對於一個新的item,最近鄰方法首先找使用者u已經評判過並與此新item最相似的k個item,然後依據使用者u對這k個item的喜好程度來判斷其對此新item的喜好程度。這種做法和CF中的item-based kNN很相似,差別在於這裡的item相似度是根據item的屬性向量計算得到,而CF中是根據所有使用者對item的評分計算得到。

對於這個方法,比較關鍵的可能就是如何通過item的屬性向量計算item之間的兩兩相似度。對於結構化資料,相似度計算使用歐幾里得距離;而如果使用向量空間模型(VSM)來表示item的話,則相似度計算可以使用cosine。

2
Rocchio演算法

Rocchio演算法是資訊檢索中處理相關反饋(Relevance Feedback)的一個著名演算法。比如你在搜尋引擎裡搜“蘋果”,當你最開始搜這個詞時,搜尋引擎不知道你到底是要能吃的水果,還是要不能吃的蘋果,所以它往往會盡量呈現給你各種結果。當你看到這些結果後,你會點一些你覺得相關的結果(這就是所謂的相關反饋了)。然後如果你翻頁檢視第二頁的結果時,搜尋引擎可以通過你剛才給的相關反饋,修改你的查詢向量取值,重新計算網頁得分,把跟你剛才點選的結果相似的結果排前面。比如你最開始搜尋“蘋果”時,對應的查詢向量是{“蘋果” : 1}。而當你點選了一些與Mac、iPhone相關的結果後,搜尋引擎會把你的查詢向量修改為{“蘋果” : 1, “Mac” : 0.8, “iPhone” : 0.7},通過這個新的查詢向量,搜尋引擎就能比較明確地知道你要找的是不能吃的蘋果了。Rocchio演算法的作用就是用來修改你的查詢向量的:{“蘋果” : 1} –> {“蘋果” : 1, “Mac” : 0.8, “iPhone” : 0.7}。

在CB裡,我們可以類似地使用Rocchio演算法來獲得使用者u的profile

其中 wj表示item j的屬性,Ir與 Inr 分別表示已知的使用者u喜歡與不喜歡的item集合;而 β 與 γ 為正負反饋的權重,它們的值由系統給定。

在獲得後,對於某個給定的item j,我們可以使用的相似度來代表使用者u對j的喜好度。

Rocchio演算法的一個好處是可以根據使用者的反饋實時更新,其更新代價很小。

正如在本節開頭所說,本節要解決的是一個典型的有監督分類問題。所以各種有效的分類機器學習演算法都可以用到這裡,下面列舉幾個常用的分類演算法:

決策樹演算法(Decision Tree, 簡稱DT)

當item的屬性較少而且是結構化屬性時,決策樹一般會是個好的選擇。這種情況下決策樹可以產生簡單直觀、容易讓人理解的結果。而且我們可以把決策樹的決策過程展示給使用者u,告訴他為什麼這些item會被推薦。但是如果item的屬性較多,且都來源於非結構化資料(如item是文章),那麼決策樹的效果可能並不會很好。

線性分類演算法(Linear Classifer, 簡稱LC)

對於我們這裡的二類問題,線性分類器(LC)嘗試在高維空間找一個平面,使得這個平面儘量分開兩類點。也就是說,一類點儘可能在平面的某一邊,而另一類點儘可能在平面的另一邊。

仍以學習使用者u的分類模型為例。表示item j的屬性向量,那麼LC嘗試在空間中找平面,使得此平面儘量分開使用者u喜歡與不喜歡的item。其中的就是我們要學習的引數了。最常用的學習的方法就是梯度下降法了,其更新過程如下:

其中的上角標t表示第t次迭代,yuj表示使用者u對item j的打分(例如喜歡則值為1,不喜歡則值為-1)。η 為學習率,它控制每步迭代變化多大,由系統給定。

和Rocchio演算法一樣,上面更新公式的好處就是它可以以很小的代價進行實時更新,實時調整使用者u對應的 cu。

說到這裡,很多童鞋可能會想起一些著名的線性分類器:Logistic Regression和Linear SVM等等,它們當然能勝任我們這裡的分類任務。Linear SVM用在文字分類上能獲得相當不錯的效果。

如果item屬性的每個分量都是0/1取值的話(如item為文章,的第k個分量為1表示詞典中第k個詞在item j中,為0表示第k個詞不在item j中)。

相關推薦

推薦系統基於內容推薦演算法

作者:章華燕編輯:田 旭前言在第一篇文章《推薦演算法綜述》中我們說到,真正的推薦系統往往是多個推

個性化推薦系統原理介紹(基於內容過濾/協同過濾/關聯規則/序列模式)

信息 來講 行為記錄 鏈接 方程 機器學習 沒有 比較 graph 個性化推薦根據用戶興趣和行為特點,向用戶推薦所需的信息或商品,幫助用戶在海量信息中快速發現真正所需的商品,提高用戶黏性,促進信息點擊和商品銷售。推薦系統是基於海量數據挖掘分析的商業智能平臺,推薦主要基

計算機網絡網絡層(二)ARP和RARP

博文 拆分 detail 動態 再次 tcp 將在 ont 關於 ARP ARP(Address Resolution Protocol,地址解析協議)是將IP地址解析為以太網MAC地址(物理地址)的協議。在局域網中,當主機或其他網絡設備有數據要發送給另一個主機或設備時,它

WebApi系列WebApi如何傳遞參數

學習 路由規則 體系結構 fff 基本數據類型 xxx work 版權 小結 WebApi系列文章 【01】淺談HTTP在WebApi開發中的運用 【02】聊聊WebApi體系結構 【03】詳解WebApi參數的傳遞 【04】詳解WebApi測試和PostMan

TP3.2_initialize() 和 __construct() 的區別和聯系

instance ins 執行 構造方法 ces 實例化 direct control 初始化 1、假設 一個AdminController.class.php 集成至 \Think\Controller 類, 我們來看看Controller.class.php的構造方法源

裝飾器Python的裝飾器--為已經存在的函式或物件新增額外的功能

寫的非常好的文章,原文在:http://www.cnblogs.com/cicaday/p/python-decorator.html Python中的裝飾器是你進入Python大門的一道坎,不管你跨不跨過去它都在那裡。 為什麼需要裝飾器 我們假設你的程式實現了say_hello()和s

java細節如何刪除cookie

0x01 背景 最近做專案的登陸登出功能,需要實現單點登入和單點登出,驗證伺服器是一個龐大的第三方開源軟體,軟體的文件也不太全面,並沒有細緻的講解登出方式,導致登出用重定向返回應用後還是登陸狀態,無奈之舉要麼在伺服器端修改session失效時間,要麼看看登陸時

推薦系統搜狐個性化視訊推薦架構設計和實踐

為什麼要做推薦系統?視訊的覆蓋率問題,好的視訊無法難以被人發現,隨著使用者的量的增加,大部分使用

原生js輪播圖之無縫滾動

前言:輪播圖,是網站首頁中最常見的一種圖片切換特效,作為前端開發者,我相信很多開發者都直接呼叫了JQuery中的封裝好的方法實現圖片輪播,省事簡單。所以我今天想介紹一下原生js程式碼實現的圖片輪播。

JEECG TBSchedule應對平臺高併發的分散式排程框架TBSchedule

原文地址:http://geek.csdn.net/news/detail/65738【編者按】 TBSchedule是一款非常優秀的高效能分散式排程框架,本文是作者結合多年使用TBSchedule的經驗,在研讀三遍原始碼的基礎上完成。期間作者也與阿里空玄有過不少技術交流,並

DRF--檢視集

㈠ . ViewSet 檢視集 ViewSetMixin裡重寫了as_view方法,可以更方便的繫結actions。 ViewSet檢視集類不再實現get()、post()等方法,而是實現動作 action 如 list() 、create() 等。 檢視集

走進CUDA~CUDA核函式及執行時引數

核函式是GPU每個thread上執行的程式。必須通過__gloabl__函式型別限定符定義。形式如下:                 __global__ void kernel(param list){  } 核函式只能在主機端呼叫,呼叫時必須申明執行引數。呼叫形式

四種推薦系統原理介紹(基於內容過濾/協同過濾/關聯規則/序列模式)

      在推薦系統中常用的技術可大致分為四類:基於內容的過濾、協同過濾、基於規則的方法和混合方法。 一、基於內容過濾         基於內容過濾推薦系統思路如下:       (1)通過在抓取每個商品的一系列特徵來構建商品檔案;       (2)通過使用者購買的商品特徵來構建基於內容的使用者檔案

tomcat系列tomcat架構(上篇)

java中,常用的web伺服器一般由tomcat,weblogic,jetty,undertwo等,但從使用者使用廣泛度來說,tomcat使用者量相對比較大一些,當然這也基於它開源和免費的特點。 從軟體架構的發展角度來看,軟體架構大致經歷瞭如下幾個階段(當然,我們這篇文章不是主講架構的,因此只是簡單提一下架構

評價指標F1-score與多分類MacroF1&MicroF1

文章來自:一個寶藏微信公眾號【機器學習煉丹術】 # 基本概念 首先,要背住的幾個概念就是:accuracy,precision,recal, TP,FP,TN,FN - TP:true positive。預測是正確的正樣本 - FP:false positive。預測是錯誤的正樣本 - TN:true neg

推薦系統(一)基於協同過濾演算法開發離線推薦

什麼是離線推薦 所謂的離線推薦其實就是根據使用者產生的行為日誌,後臺設定一個離線統計演算法和離線推薦演算法的任務來對這些行為日誌進行週期性的統計,統計過後的結果資料為前臺或者實時分析提供資料的支撐。離線推薦要求實時性不高。 離線推薦演算法之協同過濾 協同過濾其實就是藉助大量已

推薦機制 協同過濾和基於內容推薦的區別

來源 基於人口統計學的推薦 基於人口統計學的推薦機制(Demographic-based Recommendation)是一種最易於實現的推薦方法,它只是簡單的根據系統使用者的基本資訊發現使用者的相關程度,然後將相似使用者喜愛的其他物品推薦給當前使用者,圖 2 給出了

Machine Learning第九講推薦系統--(一)基於內容推薦系統

符號介紹: 對於每一個使用者j,假設我們已經通過學習找到引數,則使用者j對電影i的評分預測值為:。   對於上面的例子:                   

推薦系統基於內容推薦系統基於知識的推薦系統

1、基於內容的推薦系統 (1)基於內容的推薦演算法概述 基於內容的推薦演算法(Content-based Recommendations, CB)也是一種工業界應用比較廣的一種推薦演算法。由於協同過濾推薦演算法中僅僅基於使用者對於商品的評分進行推薦,所以有可

VueVue組件系統

最終 文件 type html中 emit 監聽 做了 駝峰命名 操作 Vue渲染的兩大基礎方式 new 一個Vue的實例 這個我們一般會使用在掛載根節點這一初始化操作上: new Vue({ el: ‘#app‘ }) 註冊組件並使用 通過