【51CTO.com原創稿件】

1.導讀

通過上面幾篇文稿可以詳細瞭解到推薦算法的種類和優缺點,對於推薦算法這塊內容還有很多,之前的幾篇文稿在內容程度上多少有些許遺漏,以及之前闡述的算法內容深入程度上仍舊達不到一個專業推薦系統開發人員的水平。爲此,在這篇文稿中,我將會對前面闡述的遺漏內容進行補充,並在之前的基礎上提高一個層次,來在推薦系統算法中更加深入一步。

2.協同過濾算法(CF)拓展

2.1 相似度度量延伸

在之前的協同過濾算法中,闡述了在近鄰推薦中運用到的相似度度量方法包括皮爾遜相關係數(Pearson Correlation)和改進餘弦向量相似度(Adjuested Cosine)。皮爾遜相關係數在基於用戶近鄰推薦算法中常用的一種度量公式,它的推薦效果最佳。而改進餘弦向量相似度是在基於物品近鄰推薦算法中最常用的一個相似度度量計算公式,效果最佳。除此之外,還有一些不太常用的兩種度量公式,因爲它的推薦效果不是很好,因此在之前內容中就沒有進行介紹了,在實際應用中也不推薦使用。但是有必要去了解下。

(1)均方差(Mean Squared Difference),它是使用用戶u和用戶v之間對相同物品評分差的平方和均值的倒數來表示兩個人的相似度,然而有一個缺點就是不能表示負關聯的關係。

(2)斯皮爾曼等級關聯(Spearman Correlation),它是利用用戶對物品評分的排名來計算兩個用戶之間的相似度。但是缺點就是計算排名時,消耗就比較大了,而且對於用戶評分只有少量可選值的情況下,就會產生大量並列的排名,也就會造成推薦效果不佳。

2.2 兩種特殊情況?

第一種情況就是在基於近鄰推薦算法運用中,當兩個用戶對物品進行評分的時候,如果評分的商品比較少,並且對商品的評分的分數比較一致的情況下,我們自然就會認爲這兩個用戶時比較相似的。在基於物品近鄰推薦算法中也是一樣的。但是其實在這個時候兩個用戶的愛好在事實上可能是完全不同的。因此爲了解決這個問題,可以通過在相似度上添加一個重要性權重過着是進行一個相似度縮放的方式來對相似度進行轉換。這樣處理後的相似度才更能接近實際的用戶相似情況。下面,就這重要性權威和相似度縮放這兩個方式來進行延伸。

(1)重要性權重:對於兩個用戶或者物品之間的共同評分的物品和用戶數量小於給定閾值的時候,那就降低相似度重要性的權重。閾值的選定一般是通過交叉驗證的方法來進行的。實際場景中,一般當閾值大於或者等於25的時候,往往會收到比較好的預測效果。

(2)相似度縮放:給出一個收縮因子對用戶或者物品相似度進行收縮轉換時,當最後的共同評分數量遠遠大於收縮因子的時候,物品的相似度幾乎沒有變化;在實際場景中,當收縮因子爲100的時候,得到的效果不錯。

下面就是通過重要性權重和相似度縮放兩種方式來計算的相似度公式:

另外一種情況就是當兩個用戶對物品給出一致的喜歡和不喜歡的評分的時候,可能會不如他們給出差異更大的評分的時候提供的信息量多而有用。這個時候可以通過使用反用戶頻率(Inverse User Frequence)來對相似度計算公式進行轉換,每個物品都會被賦以權重,權重的公式如下:

通過反用戶頻率對相似度計算公式進行轉換時,所用到的皮爾遜相關係數也就變成了頻率加權皮爾遜相關係數(Frequencey-Weighted Pearson Correlation),相應的公式如下:

頻率加權皮爾遜相關係數 2.3 近鄰的選擇問題?

之前的稿子中提到了協同過濾算法,它是通過選擇當前用戶的近鄰用戶羣來完成對當前用戶的推薦。可是不知道讀者有沒有想過,近鄰的選擇是憑空隨便選的嗎?難道沒有近鄰選擇的方法嗎?答案是有的。不過在之前沒有進行深入,因爲之前的相關知識點太多,很容易弄混淆。在這,就近鄰的選擇問題來闡述下:

在基於近鄰進行推薦的算法中,近鄰數量的選擇以及對於近鄰選擇的規則都會對推薦系統的最終效果產生重要影響。在實際運用場景中,一般在基於近鄰推薦算法中近鄰的選擇方式有以下方式:

(1)先過濾出預選近鄰,過濾的方法有Top-N過濾、閾值過濾和負數過濾。這幾個過濾通過名字基本就知道了過濾方法了。Top-N過濾無非就是選取排名靠前的N個物品或者用戶;閾值過濾無非就是設置個參數,超過或者低於這個參數就會被過濾掉之類的;而負數過濾也就無非過濾掉負數這類的。

(2).在從預選的近鄰列表中獲取所設定的k個近鄰;如果所選取的k的數目過小的話,就會導致預測精度非常低。當隨着k的增大,預測精度就會有一定的提升,但是過猶不及,達到一定參數值的時候(一般在實際場景中是50),由於存在一些重要的關聯被不重要的關聯給削弱了,就會導致預測精度下降了,因此推薦k的選值爲25至50之間。不過在實際運用場景中,最優的k值還得通過訓練集和測試集來通過交叉驗證來獲取。k-近鄰(KNN)具體的選取步驟即對未知類別屬性的數據集的每個點依次執行以下操作:

(1)先計算已知類別數據集中的每個點與當前點之間的距離,

(2)按取距離遞增次序排序;

(3)選取和當前點距離最近的k(預設定)個點;

(4)確定前k個點所在類別的出現頻率,按照出現頻率最高的k個點的類別來作爲當前點的預測類別。

3. K-means算法

在協同過濾算法的SVD矩陣因子分解中,分解後的或者未分解的評分矩陣豐富度過高,也就是評分數量過多的話,會造成算法時間複雜度過高,對實時性造成嚴重影響。這時候就會採取之前所說的K-means算法,但是在之前的文稿中也只是隨便提及了而已,並沒有進行過多闡述。因此在這裏對K-means算法進行介紹下。

K-mans算法的步驟和思想其實也比較容易理解,就是將數據集中的每一個點進行分類歸整。將相同屬性類別的點歸爲一類。算法接收端輸入的是一個尚未標記的數據集,然後通過聚類算法對數據集的每個點分爲不同的組,這也是一種無監督的學習算法。具體步驟大致分爲以下幾步:

(1)先隨機地選取k個點(k的值先預設出來,一般選取小值比較好),來作爲聚類的中心點;

(2)計算每個點分別到選取好的k個聚類中心點的距離,通過每個點如其他中心點的距離來進行排序,將該點劃分給距離最近的那個聚類裏面,依次分別劃分所有點的類別;

(3)再重新計算每個聚類的中心點;

(4)不斷重複以上2、3兩步,直到聚類的中心點的位置不發生改變或者已經達到了之前預設的迭代次數爲止。

4. SGD隨機梯度下降

4.1 SGD含義

在之前的文稿中也提到了SGD隨機梯度下降算法,這個算法一般用來不斷調整參數來減小函數或者結果的損失及誤差的。也就是給定一個損失函數,然後通過梯度下降的算法來使這個損失函數最小化。所謂的梯度下降的理解就是,首先對於每個函數圖像曲面上都有各個方向上的導數,也就是函數在各個方向上的斜率。而曲面上各個方向導數中,最大導數值的方向也就代表了梯度的方向。因此梯度下降就是沿着梯度的反方向來進行權重的更新,從而有效的找到了全局的最優解。

4.2 小的理解案例?

這裏提一個容易讓別人理解SGD隨機梯度下降的例子,就是將你放到一座山的任何一個地方,讓你通過某一方法最快到達山頂或者山底。其實這個方法就可以利用SGD隨機梯度下降方法。先找到各個方向的導數,也就是斜率,然後找到斜率或者導數最大的那個方向也就是梯度,沿着梯度方向走一步然後再計算梯度方向,依次類推不斷行進。通過梯度下降方法可以讓自己每一步都是處於當前位置趨勢最大的方向,從而最快的下降到山底或者上升到山頂。通過這個原理也就可以以最快的速度來降低損失函數值或者誤差。

5.推薦系統擴展——攻擊

在實際應用中,因爲推薦系統的建議或多或少會影響用戶的購買行爲,因此在帶來經濟效益的同時,不能假設所有參與評分建議的用戶都是誠實公平的。也就是說,林子大了,什麼鳥類都有。在衆多提供推薦建議或者評分建議的用戶中。肯定是存在一部分惡意用戶的,他們會影響到推薦系統的推薦效果,以至於讓推薦系統中的最終推薦列表經常或者很少包含某類的商品,這種問題就叫推薦系統攻擊了。當然對於這種推薦攻擊情況,所有推薦系統都會遇到的,也有一些相應的解決辦法:

(1)儘可能的提高那些穩定或者可信度高的用戶的評分權重,也就是一些長期購買的或者會員用戶等;

(2)過濾掉異常的數據,比如前後評分差異懸殊的數據,因爲當有大量的異常數據存在時,纔會對推薦結果造成不好的影響。

6.推薦系統的實現

6.1 推薦系統實現意義

對於任何一個推薦系統的開發人員來講,談再多理論知識只是一個基礎,關聯重點在於實際用代碼去實現一個推薦系統。畢竟理論來源於實踐,只有自己真正設計好一個推薦系統或者完成一個推薦功能後,才能夠真正把握之前的推薦系統理論知識。將理論知識進一步昇華,過渡到實際運用中去,這也是任何一家公司對一個程序員基本的代碼能力要求。

對於完成設計一個推薦系統或者完成一個推薦功能模擬,有很多方法或者框架都可以用。運用框架可以有利於開發人員快速的去生成一個推薦功能模塊,在整體上更好地把握到自己設計的推薦系統功能。而且,在目前開發的行情來看,框架是絕大多數開發人員的必選條件之一。因爲達到只有開發領域的技術專家程度,才能從真正意義上脫離框架,不過也;沒有必要脫離,因爲運用框架也是“站在巨人的肩膀上”,前輩們的經驗或者技巧完全可以去運用學習的。

6.2 框架分類

推薦系統所用到的框架中,比較通用的主要分爲兩大類,一類是在學術界科研領域運用廣泛,另外一種就是在企業開發領域常用的了。學術界運用廣泛的主要有LibMF、SVDFeature等,企業開發一般會用到Mahout、SparmMLib、Waffles等。

而且在開發語言上的選取也有所不同,學術界一般更加重視理論性和發展性,採用的語言更加傾向於C、C++以及Python,而企業開發更加會重視語言的流行度後效率,因而更偏愛JAVA、scala或者Python。由此可見,Python語言在這一塊領域會更加喫香些。因此站在很多高校都新開了必修課就是Python語言的學習,企業也對會使用Python的學生和員工更加青睞。目前的發展勢頭很猛,有很多人都說有可能會追趕上開發語言流行度冠軍——JAVA,拿下榜首的位置,雖然現在還沒有實現。爲此,在這一系列結束後,我會在後面開一個Python語言進階的系列,在掌握Python的基礎上,再去實現一個推薦系統會更加遊刃有餘。

7.總結

至此,推薦算法集錦這塊的理論知識系列已經完全結束了,後面先通過Python技術的瞭解與掌握後,然後再對推薦系統或者推薦功能的設計來完成實戰性的模擬演練。這一系列的推薦算法內容比較繁多,廣大讀者只有在理解這些內容的基礎上,才能夠繼續對推薦這塊有一個更好的延伸拓展。而且對於推薦系統的設計,這條道路始終是沒有盡頭的,是需要精益求精的。爲配合時代的發展,推薦系統也越來越傾向於結合火熱的人工智能領域來進一步加強推薦的效果及穩定性,因此推薦系統邂逅深度學習勢不可擋,也是未來推薦系統能完成新的突破或蛻變的方向所在。希望在未來,深度學習技術真的能作爲推薦系統的兩雙翅膀,來讓推薦系統繼續騰飛一次。因此,對於深度學習或者人工智能領域這塊的學習也是必不可少的,今後我也會就深度學習方面的知識來簡要概述下,來爲讀者打下一個深度學習技術方面的基礎。

【51CTO原創稿件,合作站點轉載請註明原文作者和出處爲51CTO.com】

【責任編輯:龐桂玉 TEL:(010)68476606】

相關文章