1. 程式人生 > >推薦演算法初探---CF、LR

推薦演算法初探---CF、LR

轉自:http://www.cnblogs.com/mafeng/p/7912217.html

序言

  最近因為PAC平臺自動化的需求,開始探坑推薦系統。這個乍一聽去樂趣無窮的課題,對於演算法大神們來說是這樣的:

  

  而對於剛接觸這個領域的我來說,是這樣的:

  

  在深坑外圍徘徊了一週後,我整理了一些推薦系統的基本概念以及一些有代表性的簡單的演算法,作為初探總結,也希望能拋磚引玉,給同樣想入坑的夥伴們提供一些思路。

  ◆ ◆ ◆

  什麼是推薦系統

  1. 什麼是推薦系統?

  推薦系統是啥?

  如果你是個多年電商(剁手)黨,你會說是這個:

  

  如果你是名充滿文藝細胞的音樂發燒友,你會答這個:

  

  如果你是位活躍在各大社交平臺的點贊狂魔,你會答這個:

  

  沒錯,猜你喜歡、個性歌單、熱點微博,這些都是推薦系統的輸出內容。從這些我們就可以總結出,推薦系統到底是做什麼的。

  目的1. 幫助使用者找到想要的商品(新聞/音樂/……),發掘長尾

  幫使用者找到想要的東西,談何容易。商品茫茫多,甚至是我們自己,也經常點開淘寶,面對眼花繚亂的打折活動不知道要買啥。在經濟學中,有一個著名理論叫長尾理論(The Long Tail)。

  

  套用在網際網路領域中,指的就是最熱的那一小部分資源將得到絕大部分的關注,而剩下的很大一部分資源卻鮮少有人問津。這不僅造成了資源利用上的浪費,也讓很多口味偏小眾的使用者無法找到自己感興趣的內容。

  目的2. 降低資訊過載

  網際網路時代資訊量已然處於爆炸狀態,若是將所有內容都放在網站首頁上使用者是無從閱讀的,資訊的利用率將會十分低下。因此我們需要推薦系統來幫助使用者過濾掉低價值的資訊。

  目的3. 提高站點的點選率/轉化率

  好的推薦系統能讓使用者更頻繁地訪問一個站點,並且總是能為使用者找到他想要購買的商品或者閱讀的內容。

  目的4. 加深對使用者的瞭解,為使用者提供定製化服務

  可以想見,每當系統成功推薦了一個使用者感興趣的內容後,我們對該使用者的興趣愛好等維度上的形象是越來越清晰的。當我們能夠精確描繪出每個使用者的形象之後,就可以為他們定製一系列服務,讓擁有各種需求的使用者都能在我們的平臺上得到滿足。

  ◆ ◆ ◆

  推薦演算法

  演算法是什麼?我們可以把它簡化為一個函式。函式接受若干個引數,輸出一個返回值。

  

  演算法如上圖,輸入引數是使用者和item的各種屬性和特徵,包括年齡、性別、地域、商品的類別、釋出時間等等。經過推薦演算法處理後,返回一個按照使用者喜好度排序的item列表。

  推薦演算法大致可以分為以下幾類[1]:

  • 基於流行度的演算法

  • 協同過濾演算法

  • 基於內容的演算法

  • 基於模型的演算法

  • 混合演算法

  2.1 基於流行度的演算法

  基於流行度的演算法非常簡單粗暴,類似於各大新聞、微博熱榜等,根據PV、UV、日均PV或分享率等資料來按某種熱度排序來推薦給使用者。

  

  這種演算法的優點是簡單,適用於剛註冊的新使用者。缺點也很明顯,它無法針對使用者提供個性化的推薦。基於這種演算法也可做一些優化,比如加入使用者分群的流行度排序,例如把熱榜上的體育內容優先推薦給體育迷,把政要熱文推給熱愛談論政治的使用者。

  2.2 協同過濾演算法

  協同過濾演算法(Collaborative Filtering, CF)是很常用的一種演算法,在很多電商網站上都有用到。CF演算法包括基於使用者的CF(User-based CF)和基於物品的CF(Item-based CF)。

  基於使用者的CF原理如下:

  1. 分析各個使用者對item的評價(通過瀏覽記錄、購買記錄等);

  2. 依據使用者對item的評價計算得出所有使用者之間的相似度;

  3. 選出與當前使用者最相似的N個使用者;

  4. 將這N個使用者評價最高並且當前使用者又沒有瀏覽過的item推薦給當前使用者。

  示意圖如下:

  

  基於物品的CF原理大同小異,只是主體在於物品:

  1. 分析各個使用者對item的瀏覽記錄。

  2. 依據瀏覽記錄分析得出所有item之間的相似度;

  3. 對於當前使用者評價高的item,找出與之相似度最高的N個item;

  4. 將這N個item推薦給使用者。

  示意圖如下:

  

  舉個栗子,基於使用者的CF演算法大致的計算流程如下:

  首先我們根據網站的記錄計算出一個使用者與item的關聯矩陣,如下:

  

  

  圖中,行是不同的使用者,列是所有物品,(x, y)的值則是x使用者對y物品的評分(喜好程度)。我們可以把每一行視為一個使用者對物品偏好的向量,然後計算每兩個使用者之間的向量距離,這裡我們用餘弦相似度來算:

  

  然後得出使用者向量之間相似度如下,其中值越接近1表示這兩個使用者越相似:

  

  最後,我們要為使用者1推薦物品,則找出與使用者1相似度最高的N名使用者(設N=2)評價的物品,去掉使用者1評價過的物品,則是推薦結果。

  基於物品的CF計算方式大致相同,只是關聯矩陣變為了item和item之間的關係,若使用者同時瀏覽過item1和item2,則(1,1)的值為1,最後計算出所有item之間的關聯關係如下:

  

  我們可以看到,CF演算法確實簡單,而且很多時候推薦也是很準確的。然而它也存在一些問題:

  1. 依賴於準確的使用者評分;

  2. 在計算的過程中,那些大熱的物品會有更大的機率被推薦給使用者;

  3. 冷啟動問題。當有一名新使用者或者新物品進入系統時,推薦將無從依據;

  4. 在一些item生存週期短(如新聞、廣告)的系統中,由於更新速度快,大量item不會有使用者評分,造成評分矩陣稀疏,不利於這些內容的推薦。

  對於矩陣稀疏的問題,有很多方法來改進CF演算法。比如通過矩陣因子分解(如LFM),我們可以把一個nm的矩陣分解為一個nk的矩陣乘以一個k*m的矩陣,如下圖:

  

  這裡的k可以是使用者的特徵、興趣愛好與物品屬性的一些聯絡,通過因子分解,可以找到使用者和物品之間的一些潛在關聯,從而填補之前矩陣中的缺失值。

  2.3 基於內容的演算法

  CF演算法看起來很好很強大,通過改進也能克服各種缺點。那麼問題來了,假如我是個《指環王》的忠實讀者,我買過一本《雙塔奇兵》,這時庫裡新進了第三部:《王者歸來》,那麼顯然我會很感興趣。然而基於之前的演算法,無論是使用者評分還是書名的檢索都不太好使,於是基於內容的推薦演算法呼之欲出。

  舉個栗子,現在系統裡有一個使用者和一條新聞。通過分析使用者的行為以及新聞的文字內容,我們提取出數個關鍵字,如下圖:

  

  將這些關鍵字作為屬性,把使用者和新聞分解成向量,如下圖:

  

  之後再計算向量距離,便可以得出該使用者和新聞的相似度了。這種方法很簡單,如果在為一名熱愛觀看英超聯賽的足球迷推薦新聞時,新聞裡同時存在關鍵字型育、足球、英超,顯然匹配前兩個詞都不如直接匹配英超來得準確,系統該如何體現出關鍵詞的這種“重要性”呢?這時我們便可以引入詞權的概念。在大量的語料庫中通過計算(比如典型的TF-IDF演算法),我們可以算出新聞中每一個關鍵詞的權重,在計算相似度時引入這個權重的影響,就可以達到更精確的效果。

  sim(user, item) = 文字相似度(user, item) * 詞權

  然而,經常接觸體育新聞方面資料的同學就會要提出問題了:要是使用者的興趣是足球,而新聞的關鍵詞是德甲、英超,按照上面的文字匹配方法顯然無法將他們關聯到一起。在此,我們可以引用話題聚類:

  

  利用word2vec一類工具,可以將文字的關鍵詞聚類,然後根據topic將文字向量化。如可以將德甲、英超、西甲聚類到“足球”的topic下,將lv、Gucci聚類到“奢侈品”topic下,再根據topic為文字內容與使用者作相似度計算。

  綜上,基於內容的推薦演算法能夠很好地解決冷啟動問題,並且也不會囿於熱度的限制,因為它是直接基於內容匹配的,而與瀏覽記錄無關。然而它也會存在一些弊端,比如過度專業化(over-specialisation)的問題。這種方法會一直推薦給使用者內容密切關聯的item,而失去了推薦內容的多樣性。

  2.4 基於模型的演算法

  基於模型的方法有很多,用到的諸如機器學習的方法也可以很深,這裡只簡單介紹下比較簡單的方法——Logistics迴歸預測。我們通過分析系統中使用者的行為和購買記錄等資料,得到如下表:

  

  表中的行是一種物品,x1~xn是影響使用者行為的各種特徵屬性,如使用者年齡段、性別、地域、物品的價格、類別等等,y則是使用者對於該物品的喜好程度,可以是購買記錄、瀏覽、收藏等等。通過大量這類的資料,我們可以迴歸擬合出一個函式,計算出x1~xn對應的係數,這即是各特徵屬性對應的權重,權重值越大則表明該屬性對於使用者選擇商品越重要。

  在擬合函式的時候我們會想到,單一的某種屬性和另一種屬性可能並不存在強關聯。比如,年齡與購買護膚品這個行為並不呈強關聯,性別與購買護膚品也不強關聯,但當我們把年齡與性別綜合在一起考慮時,它們便和購買行為產生了強關聯。比如(我只是比如),20~30歲的女性使用者更傾向於購買護膚品,這就叫交叉屬性。通過反覆測試和經驗,我們可以調整特徵屬性的組合,擬合出最準確的迴歸函式。最後得出的屬性權重如下:

  

  基於模型的演算法由於快速、準確,適用於實時性比較高的業務如新聞、廣告等,而若是需要這種演算法達到更好的效果,則需要人工干預反覆的進行屬性的組合和篩選,也就是常說的Feature Engineering。而由於新聞的時效性,系統也需要反覆更新線上的數學模型,以適應變化。

  2.5 混合演算法

  現實應用中,其實很少有直接用某種演算法來做推薦的系統。在一些大的網站如Netflix,就是融合了數十種演算法的推薦系統。我們可以通過給不同演算法的結果加權重來綜合結果,或者是在不同的計算環節中運用不同的演算法來混合,達到更貼合自己業務的目的。

  2.6 結果列表

  在演算法最後得出推薦結果之後,我們往往還需要對結果進行處理。比如當推薦的內容裡包含敏感詞彙、涉及使用者隱私的內容等等,就需要系統將其篩除;若數次推薦後用戶依然對某個item毫無興趣,我們就需要將這個item降低權重,調整排序;另外,有時系統還要考慮話題多樣性的問題,同樣要在不同話題中篩選內容。

  ◆ ◆ ◆

  推薦結果評估

  當推薦演算法完成後,怎樣來評估這個演算法的效果?CTR(點選率)、CVR(轉化率)、停留時間等都是很直觀的資料。在完成演算法後,可以通過線下計算演算法的RMSE(均方根誤差)或者線上進行ABTest來對比效果。

  ◆ ◆ ◆

  改進策略

  使用者畫像是最近經常被提及的一個名詞,引入使用者畫像可以為推薦系統帶來很多改進的餘地,比如:

  1. 打通公司各大業務平臺,通過獲取其他平臺的使用者資料,徹底解決冷啟動問題;

  2. 在不同裝置上同步使用者資料,包括QQID、裝置號、手機號等;

  3. 豐富使用者的人口屬性,包括年齡、職業、地域等;

  4. 更完善的使用者興趣狀態,方便生成使用者標籤和匹配內容。

  另外,公司的優勢——社交平臺也是一個很好利用的地方。利用使用者的社交網路,可以很方便地通過使用者的好友、興趣群的成員等更快捷地找到相似使用者以及使用者可能感興趣的內容,提高推薦的準確度。

  ◆ ◆ ◆

  總結

  隨著大資料和機器學習的火熱,推薦系統也將愈發成熟,需要學習的地方還有很多,坑還有很深,希望有志的同學共勉~

相關推薦

推薦演算法初探CFLR

轉自:http://www.cnblogs.com/mafeng/p/7912217.html序言  最近因為PAC平臺自動化的需求,開始探坑推薦系統。這個乍一聽去樂趣無窮的課題,對於演算法大神們來說是這樣的:    而對於剛接觸這個領域的我來說,是這樣的:    在深坑外圍

推薦演算法初探

1. 推薦演算法簡介 0x1:關於推薦的幾個小故事 在開始討論抽象具體的演算法和公式之前,筆者希望先通過幾個小故事,來幫助讀者朋友建立一個對推薦演算法的感性理解。同時我們也可以更好地體會到在現實複雜世界中,推薦是一項非常複雜的事情,現在的最新的推薦演算法可能只模擬了其中30%不到的程度。 1. 150年

矩陣演算法深度學習(影象處理機器視覺人工智慧機器學習)資源整合

理解矩陣(一) (真是大學時候不好好學習給自己挖的坑,現在只能一點一點的補回來,這個介紹的矩陣簡單易懂,非常牛) 連結如下: http://blog.csdn.net/myan/article/details/647511 (偶然在矩陣文章中發現演算法的世外桃源--《演算法

演算法陣列二維數字中的查詢

問題描述:每行從左到右,每列從上到下遞增的二維陣列中,判斷某個數是否存在。 1 2  8  9 2 4  9 12 4 7 10 13 6 8 11 15 7 9 12 18 思路 :從右上角開始呢?以上的矩陣,假如我們查詢的是7,從右上角開始,先比較9和7,9

目標檢測演算法基礎知識(二)卷積神經網路知識

1.什麼是filter 通常一個6x6的灰度影象,構造一個3*3的矩陣,在卷積神經網路中稱之為filter,對6x6的影象進行卷積運算。 2.什麼是padding 假設輸出影象大小為nn與過濾器大小為f

利用Python進行資料分析筆記時間序列(轉換索引偏移)

時間序列指能在任何能在時間上觀測到的資料。很多時間序列是有固定頻率(fixed frequency)的,意思是資料點會遵照某種規律定期出現,比如每15秒,每5分鐘,或每個月。時間序列也可能是不規律的(irregular),沒有一個固定的時間規律。如何參照時間序列

演算法設計與分析遞迴演算法總結

一、遞迴的思想和定義 (一)、孫子兵法道:凡治眾如治寡,分數是也。在使用計算機解決問題時我們經常遇到的問題是規模較大的問題,不能直接求解,最普遍的方法就是分解問題。遞迴就是一種特殊的分治思想,在解決一個規模為n的大問題時,先將這個大問題分解為規模為k的與原問題在形式上相同

志誠自制2011,時間管理效率為王

無為才能夠無不為一、無為並不是什麼都不管,而是讓員工能全力發揮。二、無不為才有效果,必須有目標、有計劃、有辦法。三、總裁無為,幹部無不為,依次類推,才能總動員。  我們組織三個階層:基層、中層、高層,用三個字來代表:有、能、無。基層用有,基層重有,對於他們來講看得見的,摸得著

百度地圖自定義搜尋自定義marker地圖選址實用例項

該例項中包含地圖自定義搜尋、自定義標註marker、地圖選址、滑鼠樣式修改、搜尋周邊介面等實用功能<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/

演算法導論(第三版)複習 第六部分圖論思考題 22 基本的圖演算法

22 基本的圖演算法 思考題 22-1 (以廣度優先搜尋來對圖的邊進行分類)深度優先搜尋將圖中的邊分類為樹邊、後向邊、前向邊和橫向邊。廣度優先搜尋也可以用來進行這種分類。具體來說,廣度優先搜尋將從源結點可以到達的邊劃分為同樣的4種類型。 a

推薦系統快取人人網

轉自: https://www.csdn.net/article/2010-07-26/277273摘要:【Csdn.net 7月26日 獨家報道】繼成功舉辦首期TUP活動後,日前在北京麗亭華苑酒店鴻運二廳,由CSDN和《程式設計師》雜誌聯合策劃組織的TUP第二次活動如期而至

51Nod1625夾克爺發紅包(二進位制列舉+貪心)

正解是列舉n行的全部情況,然後針對每種情況對m列進行貪心,求最大值,最後取最大值裡的最大值。 #include<bits/stdc++.h> using namespace std; #define ll long long #define fuck(x) cout<<

51Nod1072威佐夫遊戲

有2堆石子。A B兩個人輪流拿,A先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。 例如:2堆石子分別為3顆和5顆。那麼不論A怎樣拿,B

python--類例項繼承中變數的id是否變化

''' 注: 估計這麼亂的程式碼只有我自己能看。通過這段程式碼的驗證,證明了在類和例項的相對關係中, 把變數儲存為字串,數字,在各個類、例項之間變換的時候,變數的id是變化的, 把變數儲存為列表和字典的時候,id地址是不變的。id地址變與不變用於確認是否是同一份資料, 看一下這個變數是否是全域性

一文讀懂推薦系統知識體系-上(概念結構演算法

  本文主要闡述: 推薦系統的3個W 推薦系統的結構 推薦引擎演算法 瀏覽後四章的內容請見下篇。 1. 推薦系統的3個W 1.1 是什麼(What is it?) 推薦系統就是根據使用者的歷史行為、社交關係、興趣點、所處上下文環境等資訊去

程式碼優化優化條件分支

 程式碼優化-之-優化條件分支                    [email pr

小白進化記Python3 Python的資料型別

python的資料型別 回顧 命令: cp / cp -r     複製檔案/資料夾 mv       移動檔案/資料夾(改名字) cat       顯示文字檔案的內容 tar        打包並壓縮 $ tar -cz

歐美劇集觀看最佳索引 【2006924更新】

                下次更新將用上面的 urlallyesno:我在上兩個月說要做一個美劇的網站 由於最近公司的事情一直很繁忙 我沒有時間去做自己都積累了一大堆 美劇 日劇 恐怖片 沒看 兩個電腦的硬碟都塞的滿滿的 呵呵真是 天長地久有時盡,此恨綿綿無絕期。 哈哈~`` 我現在正在構思 是不是把美

NYOJ15括號匹配(二)

描述 給你一個字串,裡面只包含”(“,”)”,”[“,”]”四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 輸入 第一行輸入一個正整數N,表示測試資料

NYOJ35表示式求值

描述 ACM隊的mdd想做一個計算器,但是,他要做的不僅僅是一計算一個A+B的計算器,他想實現隨便輸入一個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。 比如輸入:“1+2/4=”,程式就輸出1.50(結果保留兩位小數) 輸入 第一行輸