推薦算法集錦(中)—— SVD和CB
原創(chuàng)【51CTO.com原創(chuàng)稿件】
1.導(dǎo)讀
通過上一篇對推薦系統(tǒng)的協(xié)同過濾算法進行詳細的介紹后,并且給出模擬推薦案例,相信廣大讀者對于協(xié)同過濾算法的原理也有了一個基本的了解,以及對其中的推薦過程和使用該推薦算法的場景和優(yōu)勢有了一個基本的掌握。在上一篇文章的結(jié)尾部分我留了幾個思考,也就是關(guān)于協(xié)同過濾算法劣勢的研究,用來引出其他的推薦算法。因此在這篇文章中,我會從這些方面出發(fā),實際地去解決這幾點疑慮,并且透徹地去闡述協(xié)同過濾算法的劣勢,然后給出相應(yīng)的解決方案和對應(yīng)的推薦算法。
2.“巧婦乃為無米之炊”——矩陣稀疏問題
2.1 “米”不夠?
首先對于協(xié)同過濾推薦算法,推薦計算過程中涉及到一個關(guān)鍵性也是基礎(chǔ)性的參數(shù)就是評分矩陣,這就引出了今天我們需要解決的第一個問題:評分矩陣的疏密程度。評分矩陣的疏密程度是選擇對應(yīng)推薦算法或者處理方法的關(guān)鍵。在實際的應(yīng)用過程中,由于很多用戶在生活中只會對少部分商品進行瀏覽、購買或者評價,對于大部分的商品都會視而不見、置之不理,因此這樣就會導(dǎo)致最終形成的評分矩陣過于稀疏。在設(shè)計推薦系統(tǒng)的時候,就會面臨一個挑戰(zhàn):使用相對較少或者根本不夠的有效評分數(shù)據(jù)來完成一個相對比較準(zhǔn)確的預(yù)測。這樣的問題無疑是“巧婦難為無米之炊”,至于選取任何一個推薦算法所帶來的結(jié)果并不會有太大區(qū)別。就好比你要煮飯,你的米不夠甚至沒有米,即使你用鐵鍋還是銅鍋甚至金鍋也做不出來滿足一家人吃的飯。這里的“米”也就是用戶對于物品的評分,而“鍋”,則就好比推薦系統(tǒng),鍋的材質(zhì)也就好比推薦算法。這樣,讀者就能明白其中的含義了,并能夠意識到評分的重要性。
面對這種評分矩陣過于稀疏的問題,最直接的辦法就是利用用戶或者物品的額外屬性數(shù)據(jù),對這些數(shù)據(jù)進行分類和整合操作,來求解相對應(yīng)的相似用戶或者物品列表。這種方法如果這樣描述,廣大讀者可能并不是能夠很好地理解其中含義,并不會對這種方法產(chǎn)生深刻的印象。因此,我還是用煮飯的例子來解釋下,用戶—物品的評分矩陣過于稀疏時(在這先不考慮評分矩陣為空的情況),也就是煮飯的米不夠,那么采用的方法就是想辦法把米進行分解,也就是把米弄碎,從而得到更多的碎米,利用這些碎米去煮粥就可以滿足一家人的需求了。這種比喻也就是上面說的利用用戶和物品的額外特征屬性數(shù)據(jù)來進行分類和整合。
2.2 沒有“米”?
當(dāng)然還存在一種情況就是沒有米的時候,也就是用戶沒有任何評分或者說是新來的用戶,這里不知道讀者有沒有似曾相識的感覺。沒錯,這種情況也就是冷啟動情況,在推薦系統(tǒng)詳解里已經(jīng)有了相對應(yīng)的解決辦法,也就是完成一個非個性化推薦。大部分都是使用熱銷物品或者榜單數(shù)據(jù)來完成推送,或者在首頁彈出窗口來詢問用戶的喜好和興趣,根據(jù)用戶點擊的模塊來完成推薦。具體的操作方法詳見我的文稿(推薦系統(tǒng)詳解——個性化推薦與非個性化推薦),在這里就不贅述了。
2.3 基于近鄰算法的短板揭露
回到之前說的利用用戶和物品的額外特征屬性對數(shù)據(jù)進行分類整合,這種操作相對應(yīng)的一種算法叫做SVD矩陣因子分解。后面我會講到;除此之外,還可以通過缺省投票的形式來補全物品的評分,原理就是給那些只有一個或者兩個的用戶評價的物品一個缺省值,這種方法類似于隱式評分計算;最后還有一個辦法,當(dāng)然也是無奈之舉。那就是在沒有評分的用戶和物品旁邊或者近鄰找到有評分的用戶和物品,以它的評分來填充當(dāng)前的評分,或者用遞增、求均值之類的方法獲取到評分來完成當(dāng)前用戶和物品評分。因此,現(xiàn)在可以得出CF——基于近鄰?fù)扑]算法的全部劣勢或者說是短板了,如下所示:
(1)覆蓋有限:由于計算兩個用戶之間的相似度是基于這些用戶對于相同一類物品的評分的,并且只有對這一類物品進行評分的用戶才可以作為近鄰,也叫對等用戶。但是由于在實際場景中,很多用戶很少對物品進行評分或者沒有評分,但是他們的確又有相同的興趣愛好,這樣就會導(dǎo)致推薦算法的覆蓋范圍受到限制和影響。為解決這一問題,引出了SVD矩陣因子分解推薦算法,它是根據(jù)已有用戶對物品的評分情況,分析出評分的用戶對各個物品的因子喜好程度,以及各個物品對于這些因子的包含程度,最后再反過來根據(jù)最終的分析結(jié)果預(yù)測評分。舉個例子來說,在沒有進行SVD矩陣因子分解前,只用戶A和用戶B以及用戶C都喜歡看電影,而且看電影的頻次也相差不大。但是就看了幾部電影,這樣就導(dǎo)致可能就兩三部電影具有用戶們的評分值,這樣的評分數(shù)量對于評分矩陣來說無疑是不夠的,也就會造成評分矩陣的稀疏了。但是通過SVD矩陣因子分解后,發(fā)現(xiàn)每個電影可以提取到額外的特征屬性因子(有勵志、搞笑、人文、愛情等屬性因素),這樣就可以提取到更多屬性的評分值。通過這種屬性也就會發(fā)現(xiàn)用戶A可能跟用戶B喜好相同,可能都喜歡看搞笑或者愛情類的電影,而用戶C可能更喜歡看恐怖或者勵志類的電影。這樣就可以根據(jù)用戶B的行為來預(yù)測A的行為了。使推薦給A的電影更符合A的口味。因此,通過SVD矩陣因子的方式就可以找出更多影響評分的因子,并且將更多有意義的關(guān)聯(lián)信息挖掘出來,推薦出符合用戶需求和意愿的物品。
(2)對稀疏數(shù)據(jù)的敏感:其實這個問題和上面覆蓋有限的問題有些類似。因為評分矩陣的稀疏性是大多數(shù)推薦系統(tǒng)的共同問題。主要是看評分舉證的稀疏程度,在上面講的SVD矩陣因子分解算法使用中,如果分解后的物品屬性因子還是不夠稠密,形成的因子評分矩陣依舊稀疏,但是又不是新用戶,還有有一定的歷史購買行為或者瀏覽行為。類似這樣的用戶就不至于采取非個性化推薦了,因為畢竟要考慮到推薦的人性化、智能化,榜單熱銷物品數(shù)據(jù)不是萬能的,有一定歷史行為的用戶還是要考慮其中的歷史行為因素,爭取做到個性化推薦。目前為了解決這一類問題,可采取基于內(nèi)容的推薦算法?;趦?nèi)容的推薦算法是直接根據(jù)用戶的歷史偏好來推薦與用戶歷史偏好相關(guān)的物品,這樣就兼顧了每個用戶所特有的屬性,完成個性化推薦。
針對上面兩個問題引出來了兩個算法分別是SVD矩陣因子分解算法和基于內(nèi)容的推薦算法,這兩個算法就是這篇文章的重點。有了這個“引子”,下面就開始燃起這兩個算法的“導(dǎo)火線”了。
3.SVD矩陣因子分解算法
3.1 SVD算法
首先來看下SVD(Singular Value Decomposition)的數(shù)學(xué)定義:將給定的評分矩陣S分解成為三個矩陣的乘積,其中U和V稱為左、右奇異向量,在本章中可理解為用戶矩陣和物品因子矩陣,對角線上的值稱為奇異值;S為n*m的矩陣,U為n*n矩陣,Q為n*m的矩陣,V為m*m的矩陣;在下面公式中,可以使用k個奇異值來近似地替代R矩陣,因為前1%的奇異值的和就占了全部奇異值和的99%以上,因為除了中間的奇異值之外,其余的奇異值基本都是0。公式如下:
然后需要將U、V矩陣進行轉(zhuǎn)換得到用戶因子矩陣C和物品因子矩陣P,將奇異矩陣Q開平方分別乘到U和V矩陣,如同將奇異矩陣Q做了一個開方然后乘積的變換。得到用戶因子矩陣C和物品因子矩陣P如下:
最后用戶t對物品i的評分預(yù)測就為用戶因子矩陣的第t行乘上物品因子矩陣的第i列(即物品因子矩陣的第i行的轉(zhuǎn)置),如下所示:
3.2 參數(shù)優(yōu)化
在進行用戶因子矩陣C和物品因子矩陣P的計算時,可以通過SGD隨機梯度下降的方式進行學(xué)習(xí)來不斷迭代調(diào)整更新相關(guān)參數(shù)。對于沒有評分的情況則不需要計算誤差值,直接令誤差值為0即可。上面提到的SGD隨機梯度下降的方法由于涉及的內(nèi)容較多,不容易理解,并且怕讀者將SGD隨機梯度下降和SVD矩陣因子分解相互混淆,在這就不再繼續(xù)對SDG隨機梯度下降進行原理上的闡述了。我會將SGD隨機梯度下降方法令作一個專題去分析闡述,因為它也涉及到一些人工智能的神經(jīng)網(wǎng)絡(luò)的運用。希望廣大讀者在這就先熟悉適應(yīng)下公式即可:
3.3 SVD算法缺陷
SVD矩陣因子分解在實際推薦系統(tǒng)中很少使用,因為它很難進行在線計算,以至于不能很好地處理用戶的實時行為反饋,也就沒有實時處理能力。而且對于大型的推薦系統(tǒng)而言,直接進行協(xié)同過濾或者SVD矩陣因子分解的話,可能會存在計算的復(fù)雜度過高的問題,這個時候就可以考慮K-means聚類算法做處理,將大量的評分數(shù)據(jù)進行分組,將每一組的所有數(shù)據(jù)歸為一類或一個因子,然后再進行協(xié)同過濾處理,對于K-means算法原理和作用在這就不作贅述。之后這些漏掉的算法原理會以補充篇來專門講述。
4.CB—基于內(nèi)容的推薦算法
4.1 CB算法及其特點、應(yīng)用
基于內(nèi)容的推薦算法(Content-based Recommendations)相比較于協(xié)同過濾算法,也是一種工業(yè)界或者互聯(lián)網(wǎng)業(yè)界應(yīng)用比較廣泛的推薦算法了。這是針對于協(xié)同過濾推薦算法中,僅僅基于用戶對商品評分推薦導(dǎo)致的評分矩陣過于稀疏(以至于矩陣因子分解后依舊達不到理想的豐富評分矩陣要求)所提出的推薦算法。這種推薦算法在某種程度上也解決了一部分冷啟動問題(雖然不是進行新用戶推薦)?;趦?nèi)容的推薦算法可以根據(jù)物品的特性或者用戶的歷史行為或者特殊偏好等特征屬性來進行比較直觀的推薦。這種算法僅僅只考慮推薦的用戶,而不去在意其他用戶群以及最近鄰。
CB算法特點:CB—基于內(nèi)容的推薦算法雖然也需要依賴物品和用戶偏好的額外信息,但是它并不需要太多的用戶評分和對等用戶群的偏好屬性記錄,換句話說,也就是只有一個用戶時,使用基于內(nèi)容的推薦算法也可以完成推薦功能,并且產(chǎn)生一個物品的推薦列表。而這些是基于協(xié)同過濾算法的推薦所辦不到的。
CB算法應(yīng)用:基于內(nèi)容的推薦算法起初設(shè)計出來時為了推薦用戶感興趣或者有意思的文本文檔,在一些文本文檔推薦中經(jīng)??梢钥吹交趦?nèi)容的推薦算法的“身影”。但是在目前也會開始將該算法應(yīng)用在其他推薦領(lǐng)域了?;趦?nèi)容完成推薦在未來也會得到進一步的推廣與應(yīng)用。
4.2 CB算法 VS 協(xié)同過濾算法
下面我們來看下CB(基于內(nèi)容)和(協(xié)同過濾)兩個算法的區(qū)別:
CB(基于內(nèi)容的推薦算法)的推薦系統(tǒng)會根據(jù)用戶過去喜歡物品,試圖推薦給用戶過去喜歡的物品的相似替代品,所推薦的物品是跟用戶過去感興趣或者購買過的物品是屬于同一類的,并且CB算法不需要依賴用戶—物品評分矩陣;
CF(協(xié)同過濾的推薦算法)的推薦系統(tǒng)則會試圖識別出與當(dāng)前用戶具有相同興趣愛好的其他用戶,來將這些其他用戶所喜歡過的物品推薦給當(dāng)前用戶。CF算法則是需要基于用戶—物品評分矩陣來完成推薦的。
4.3 CB算法實現(xiàn)步驟與結(jié)構(gòu)
CB算法實現(xiàn)步驟如下:
(1)Item Representation(對象表示):就是為每一個item(對象)抽取出一些特征屬性出來,也就是結(jié)構(gòu)化物品的操作,相對應(yīng)的處理過程也叫內(nèi)容分析;
(2)Profile Learning(特征學(xué)習(xí)):利用當(dāng)前用戶的歷史行為信息或者過去喜歡(不喜歡)的item的特征數(shù)據(jù)信息,來學(xué)習(xí)當(dāng)前用戶的喜好特征(Profile),相對應(yīng)的處理過程叫做Profile Learning;
(3)Recommendation Generation(推薦迭代):通過分析上一步得到的用戶Profile(特征),為該當(dāng)前用戶推薦一組相關(guān)性或者相似度最大的item即可,相對應(yīng)的處理過程叫做Filtering Component(過濾組件)。
由BC推薦算法的實行步驟不難得出BC推薦算法運行的結(jié)構(gòu),將BC推薦原理過程繪制成直觀的結(jié)構(gòu)圖如下所示:
4.4 CB—Item Representation
在繪制完BC推薦算法的結(jié)構(gòu)圖后,在這額外補充一點:在對物品特征屬性的挖掘抽取中,也就是Item Representation過程中,主要包括對數(shù)值型數(shù)據(jù)的處理和非數(shù)值型數(shù)據(jù)的處理,這在機器學(xué)習(xí)中采用的主要處理方式有以下幾種:
(1)數(shù)值型數(shù)據(jù)歸一化:就是將數(shù)值型數(shù)據(jù)統(tǒng)一除以自己數(shù)據(jù)總和,用每一個數(shù)據(jù)在數(shù)據(jù)總和中的占比來表示該數(shù)據(jù),使得每個數(shù)據(jù)的表示范圍都在[0,1]之間,這也是最為簡單的數(shù)值型數(shù)據(jù)歸一化方法;
(2)數(shù)值型數(shù)據(jù)二值化:依據(jù)各個數(shù)據(jù)值來設(shè)置一個默認值,設(shè)定一個條件規(guī)則如數(shù)
據(jù)值大于等于默認值,則表示為1,小于默認值表示為-1。像這樣的設(shè)定限定條件來使每一個數(shù)據(jù)值都只有兩種值中的一種,也就是所謂的二值化;
(3)非數(shù)值型數(shù)據(jù)轉(zhuǎn)換成特征向量:將每一個非數(shù)值型數(shù)據(jù)用對應(yīng)的向量型數(shù)值表示;
(4)TF-IDF:一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù)。TF是詞頻,IDF是逆文本頻率指數(shù),通常用來評估一個字詞對于一個文件集中的一份文件的重要程度。
(5)Word2Vec:一群用來產(chǎn)生詞向量的相關(guān)模型,會涉及到神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。
4.5 CB—Pofile Learning
假設(shè)用戶對于某些物品已經(jīng)有了喜好判斷,喜歡其中一部分的物品,不喜歡另外一部分,那么這個過程其實就是通過用戶過去的喜好來進行判斷,從而構(gòu)建一個判別模型,最后再根據(jù)這個模型來判斷用戶對于一個新的物品是否喜歡。這是一個比較典型的有監(jiān)督學(xué)習(xí)問題,在理論上也是可以使用機器學(xué)習(xí)的分類算法來求解所需要的的判別模型,這也為今后算法的優(yōu)化提供了研究方向,也就是結(jié)合深度學(xué)習(xí)技術(shù)來不斷完善判別模型,使得判別模型更加地貼合用戶興趣。
在這一過程中涉及到的常用算法有最近鄰方法、決策樹方法、線性分類算法、樸素貝葉斯算法等,這些算法都是在人工智能領(lǐng)域或者說是深度學(xué)習(xí)領(lǐng)域常用的處理數(shù)據(jù)的算法,由于本文只講推薦算法,涉及到的這些深度學(xué)習(xí)領(lǐng)域的算法我會在今后介紹深度學(xué)習(xí)的專題里進行闡述。至于最近鄰方法由于是推薦系統(tǒng)最關(guān)鍵、也最常用的算法,我會以補充稿的形式來詳細闡述并更好地進行該推薦算法系列的差缺補漏。通過這些涉及到機器學(xué)習(xí)的知識不難發(fā)現(xiàn),基于內(nèi)容推薦其實主要就依賴機器學(xué)習(xí)算法的基礎(chǔ)上來做的一個推薦。
4.6 CB算法大剖析
通過上述文字,不難知道基于內(nèi)容的推薦算法(CB)的優(yōu)缺點,下面我們就展開了解下,
對于CB推薦算法的優(yōu)點主要有以下幾個:
(1)用戶獨立性:這個性質(zhì)也脫離了協(xié)同過濾算法依賴其他近鄰的特征屬性的限制,真正意義上做到僅有一個用戶也能完成個性化推薦。在構(gòu)建模型的過程中,CB算法只需要考慮當(dāng)前推薦用戶的信息就可以了,非常獨立的一種推薦算法;
(2)透明度:通過CB算法的運行結(jié)構(gòu)就可以知道,CB算法通過顯式地列出使得物品出現(xiàn)在推薦列表中的內(nèi)容特征和描述信息,也就可以很好的、較為明確或者透明地解釋推薦系統(tǒng)是如何工作的了;
(3)新物品性:這個是針對于物品評分沒有的情況下的特性。也就是說,即使當(dāng)前用戶對這個物品并沒有評分,甚至這個物品沒有任何評分,但是BC算法可以基于當(dāng)前用戶歷史行為找到與該物品想類似且有用戶評分的物品,那么CB推薦算法就可以將這個沒有任何評分的物品推薦給當(dāng)前用戶,也就是完成了新物品(沒有任何評分的物品)的推薦。
當(dāng)然,任何推薦算法都是只能用來解決某一類問題或者處理某一類情況的,因此,CB算法也有它自身難以克服的缺點:
(1)抽取特征難度大(可分析的內(nèi)容有限):對于當(dāng)前用戶(物品),如果他的瀏覽歷史(特征屬性)不夠豐富,那么就會導(dǎo)致提取的特征不具備很好的表示能力,對于最終的推薦效果產(chǎn)生負面的影響。這個問題是與推薦對象相關(guān)的特征數(shù)量和類型有限相關(guān)的,并且依賴于領(lǐng)域知識,也就是機器學(xué)習(xí)算法的好壞;
(2)容易造成長尾效應(yīng):長尾效應(yīng)在之前的文章中已經(jīng)做過解釋,CB算法推薦很可能會導(dǎo)致長尾效應(yīng)的出現(xiàn),以至于無法發(fā)現(xiàn)用戶的潛在興趣,造成用戶的興趣過度專一特化。因為CB推薦算法中的推薦結(jié)果一直都是和用戶以前喜歡的物品類似的,經(jīng)過CB算法推薦,用戶始終停留在以前那一塊興趣領(lǐng)域中,無法跨越出來,喜歡上其他領(lǐng)域的物品。但是真實情況是當(dāng)前用戶肯定不止這一塊領(lǐng)域的興趣愛好,因而CB推薦算法就無法發(fā)現(xiàn)該當(dāng)前用戶可能還喜歡其他領(lǐng)域內(nèi)容,也就會造成用戶興趣過度專一特化,長尾效應(yīng)也就出現(xiàn)了;
(3)冷啟動問題:也就是無法為新注冊的用戶產(chǎn)生推薦,因為CB算法依賴的是當(dāng)前用戶的歷史行為數(shù)據(jù),對于一個完全沒有歷史行為數(shù)據(jù)的新注冊用戶也就不可能為他產(chǎn)生一個比較可靠的推薦結(jié)果了。這個問題也是之前協(xié)同過濾算法存在的問題,好在已將在之前的文
章中用非個性化推薦解決了這個問題,就不再繼續(xù)描述了。
5.總結(jié)
SVD算法和CB算法都是作為解決協(xié)同過濾算法的用戶—評分矩陣過于稀疏所研究出來的推薦算法,雖然針對于不同的稀疏度有相對于的解決辦法。但是作為SVD和CB算法本事,這兩個推薦算法仍有其自身難以克服的缺點存在。在下一篇文章中,我會把剩下的、相對比較小眾的推薦算法介紹給大家,這樣就可以讓讀者根據(jù)自身開發(fā)遇到的場景選用合適的算法了,也可以讓讀者較為清晰的了解到推薦算法的輕重級別,對于一些小眾的推薦算法的掌握是可以為自身設(shè)計的推薦系統(tǒng)起到錦上添花的效果。
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】