鐘志攀,袁仕芳,梁榮鋒,朱翡虹
(五邑大學 數學與計算科學學院,廣東 江門 529020)
隨著互聯網的普及和信息技術的發(fā)展,人們日常生活可以接觸到的信息越來越豐富,產生信息數據的速度也越來越快。但是“信息過載”問題也越來越嚴重。想要從這海量的信息中獲取目的信息需要耗費大量的時間和精力。
人們解決“信息過載”問題的方法主要有建立搜索引擎、建立推薦系統(recommended system)[1-3]。推薦系統是比搜索引擎處理問題更為人性化的工具,它可以根據用戶的個人愛好、歷史瀏覽記錄等為用戶推薦所感興趣的內容[4-6]。建立一個好的推薦系統可以節(jié)省用戶查找感興趣內容的時間,增強用戶體驗,還可以提高商品銷售量。推薦系統在很多行業(yè)都有應用,例如新聞行業(yè)中的《今日頭條》,個性音樂軟件“網易云音樂”,尤其是電商行業(yè),最著名的例子就有亞馬遜的“尿不濕和啤酒”[7]。推薦系統在工業(yè)上最經典的應用莫過于協同過濾算法(CF)[8-9],該算法通過找到與用戶有相同品味的用戶,然后將相似用戶過去喜歡的物品推薦給用戶。
文中首先介紹了奇異值分解(SVD)和SVD推薦算法之間的聯系,以及SVD推薦算法原理,在此基礎上,建立了一個傳統服飾商城的推薦系統。然后利用傳統服飾商城的用戶樣本數據測試該推薦系統的性能。
協同過濾算法是推薦系統中的經典算法。協同過濾算法主要分為兩類,一類是基于鄰域(neighborhood methods)的協同過濾算法,另一類是隱語義模型(latent factor models)的協同過濾算法[10],后者是利用矩陣分解(matrix factorization)算法實現的。
為了評價推薦算法的性能,一般使用平方絕對值誤差(MAE)和均方根誤差(RMSE)測試推薦系統的準確性,公式如下:
(1)
(2)
其中,Rtest表示測試數據集,ui表示用戶i,cj表示商品j,r(ui,cj)表示用戶ui對商品cj的評分。
SVD算法是在奇異值分解(singular value decomposition)[11]的基礎上建立起來的矩陣分解算法。對于矩陣A∈Rn×m,它的奇異值分解為:
(3)
其中,Σr=diag(λ1,λ2,…,λr),r=rank(A),U∈Rn×n和V∈Rm×m是正交矩陣。U的列向量稱為左奇異值向量;Σr對角線上的值是A非零奇異值;VT是V的轉置,V的列向量稱為右奇異向量。
通常定義奇異值為σi,在矩陣Σ中沿對角線從大到小排列為:
σ1≥σ2≥…≥σr,r≤min{n,m}
σi的下降速度很快,大多數情況下,前10%甚至1%的奇異值的和就可占所有奇異值之和的99%以上,所以這里r往往遠小于n和m。根據奇異值的這個性質,可以用一部分奇異值近似地描述矩陣所包含的信息,即有:
(4)
其中k≤r。
傳統的推薦系統一般會通過用戶對商品進行評價,得出評分矩陣R(rating matrix),再通過評分矩陣進行分類、預測用戶喜好,從而進行商品推薦。當用戶數量比較大,商品種類和數量比較多時,很難做到讓所有的客戶對所有的商品進行評分,此時評分矩陣R就會出現很多的缺失值。
這些缺失的評分可以看作是用戶ui對于商品cj的未知的潛在評分。SVD算法的思路就是在評分矩陣R缺失的情況下,對矩陣進行分解,從而得到用戶因子矩陣U(users features matrix)和商品因子矩陣C(item features matrix),最后通過矩陣U和C來預測用戶對商品的潛在評分。
由式(6)推廣到分解評分矩陣R,有以下等式:
Un×r=Un×nΣr×r
(5)
(6)
用隱語義模型來進行協同過濾的目標是揭示隱藏的特征,這些隱藏的特征能夠解釋觀測到的評分。SVD是為了識別隱語義因子而發(fā)展起來的,然而由于大部分評分值缺失,把SVD應用到CF領域的顯式評分變得相對困難。例如表1。
表1 評分矩陣R
實際情況中往往只能獲得形如表1所示的評分矩陣,所有用戶無法對所有商品進行評價,造成評分矩陣存在缺失值。當r(i,j)=0,表示用戶i對商品j的評分缺失,如表1所示。存在缺失的現實意義就是用戶尚未購買或者與某商品有一些交互動作,因此,通過預測缺失的評分,在用戶尚未評價的商品中,通過用戶原有的評分記錄和其他用戶的相似性這一先驗知識,對用戶沒有評分的商品進行評分預測。
SVD算法在奇異值分解的基礎上,將存在缺失值的評分矩陣R分解成形如表2和表3的用戶因子矩陣U和商品因子矩陣C。
表2 用戶因子矩陣U
表3 商品因子矩陣C
可以不用知道這兩個矩陣中的因子(factors)具體是什么,第一個因子可以是商品的價格,也可以是商品的外觀的美觀程度。關于“因子”,可以把它認為是商品的子屬性。對同一個因子進行評分,在用戶因子矩陣中表示用戶偏愛于這種商品的屬性的程度,而在商品因子矩陣中則表示此屬性在該商品反映的程度。
對于要推薦的商品,如衣服,價格是衣服的屬性之一,假設這件衣服的價格很低廉,那么相對應評分就會高些,此時用戶在購買衣服時十分注重衣服的價格,那么對于衣服的價格的偏愛程度就會高一點。
通過矩陣分解(可以是任何合理的矩陣分解算法),得到了上面的用戶因子矩陣U和商品因子矩陣C,通過分解出來的因子評分可以預測出用戶對新商品的評分,在這些新商品的評分中選取前n(Top-N)個預測評分最高的物品,構造出推薦列表進行推薦。
預測用戶ui對商品cj的評分,利用用戶因子矩陣U和商品因子矩陣C計算可得預測評分:
(7)
利用式(7)可以得到表4。
表4 評分矩陣
通過上述內容,SVD算法實現推薦的主要思路是:通過矩陣分解技術將評分矩陣R分解成用戶因子矩陣U和商品因子矩陣C,再通過這兩個矩陣的合成從而預測用戶對商品的評分。但是矩陣U和C并不是直接通過矩陣分解得出,而是通過學習的方法得到。
預測用戶ui對商品cj的評分可以表示為:
(8)
(9)
其中I∈{0,1}n×m,作為一個指示器,指示相應位置是否有評分,有評分為“1”,沒有評分為“0”,最后兩項是正則化項;ku和kc是常數,防止過擬合[12]。
考慮由于個體差異可能導致評分過低或過高,使用baseline predictors基準預測。將平均評分設為μ,設用戶做出的評分相對于平均評分的偏差為bui,設商品cj相對于平均分的偏差為bcj,得到:
(10)
結合式(8)和式(10),有:
(11)
于是損失函數可以重新表述為:
(12)
對式(13)求導到求解函數:
(14)
其中,γ為學習率。
利用評分矩陣中已知的評分求解上述函數(14),訓練得到損失函數值最優(yōu)時的參數,從而確定損失函數,完成對模型的訓練。通過損失函數可以預測用戶對商品的評分,完成推薦任務。
實驗是在Intel-Core i7雙核處理器,CPU1 2.60 GHz,CPU2 2.0 GHz,內存4 G的計算機上進行,采用Window8.1操作系統,編程語言是Python 3.6。
實驗數據來自傳統漢服網站“衣緣巷”的用戶統計數據。隨機選取了158名用戶對20件服裝進行評分,評分范圍是1~7。
算法流程如圖1所示。
圖1 算法流程
將獲取到的數據進行數據清理,剔除user_id、item_id數據內容缺失的數據項。再將數據集重新整合成(user_id,item_id,rating)三元組結構。使用交叉驗證[14]來驗證數據,將數據隨機分成三份進行三組測試,第一組實驗選定其中兩份數據作為訓練數據,剩下的一份作為測試數據;其他兩組數據也是執(zhí)行同樣的操作。
初始化式(13)的學習率γ為0.002,因子factors的維數初始化為100,表示將要分解的評分矩陣的因子最多有100個。模型測試指標見表5。
表5 模型測試指標
圖2反映了實際評分和預測評分之間的絕對誤差主要集中在“1”分左右,意味著該模型預測用戶的評分出現的誤差大部分不超過“1”。
通過計算客戶對商品的實際評分和模型的預測評分之間的絕對誤差占總分“7”的百分比,觀察模型的總體預測性能,如圖3所示??梢园l(fā)現誤差百分比超過50%的誤差基本沒有,誤差百分比大部分集中在30%,其中誤差百分比為10%的誤差的樣本數量居多。
圖2 絕對評分誤差散點分布
圖3 模型預測誤差分布
總體來說,該模型相對于現行的其他推薦算法是可靠的。SVD算法的優(yōu)勢在于可以較為準確地預測用戶評分,實現精準推薦。但在用戶和商品基數特別
大的情況下,SVD算法會因矩陣分解的時間效率低而優(yōu)勢不在,表明該算法非常適合用戶數量不夠巨大,商品種類不太繁多的小型在線商城。