推薦系統兩個著名的模型:CF和LFMhtml
數學定義
尋求解決信息過載的思路
系統結構
用戶畫像刻畫一些用戶維度的信息,例如這我的的學歷,經濟收入情況等等,之後不管是用戶推薦,分類,排序,都會有用戶畫像的相關應用。
評定標準
均方偏差(MSE) 均方根偏差(RMSE)
對式子除以T,使得其與測試樣本T無關。獲得用戶在每一個物品上平均的一個差別度。算法
你能拿到用戶對商品的一個評分,例如:一顆星,兩顆星或者直接的一個分數值。測試
用戶有沒有點,以及用戶在這個頁面的停留時間,視頻看沒看等等,有這麼個是與否的用戶行爲在,根據這些行爲也是能夠創建準確度的評判標準。
提高準確率能夠減小topN的量,能夠只推薦一篇或者兩篇,這樣能夠很好的擬合用戶的興趣,它頗有可能會點。問題是用戶若是還想看這兩篇之外的呢,那其餘的就沒有召回來。因此準確率和召回率這兩項是互相影響的。好的推薦要儘可能的使得這兩項有個比較好的結果。另外推薦系統對precision的要求更高一些。優化
ROC AUC3d
I表明所有商品的量。全部推薦的商品 覆蓋了所有商品的多少。
從信息論的角度來看就是:1000w的商品中,每一個商品被推薦的次數除以總次數。cdn
若是電商有1000w的商品,你推薦的商品只覆蓋了其中20w,那這推薦就是有問題的。視頻
1/2|R(u)|(|R(u)-1|)表示從推薦列表中任意取兩個的可能取法。除以它表示任意兩個的平均類似度。 1-平均類似度表示任意兩個的平均差別度。差別度就是多樣性有多高。
s(i,j)的計算方法,例如:在電商的體系當中,他會有類目這個屬性,創建的向量中也會包含這個分類屬性。若是兩個商品品類不一樣的話,能夠把類似度設置爲0htm
新穎度和驚喜度這兩個標準不太好評定,須要經過用戶反饋和調研來獲取。
推薦系統通常推薦的是熱門信息,大部分用戶都是趨同的blog
基於內容的推薦
對每一份資料創建向量,對每一個要推薦的內容(item)進行挖掘,每一個item都是一個向量,假設有4000個詞的詞表,每一個詞在item向量中會佔據一個固定的位置,若是這個詞在這個文檔中出現過,咱們就會去計算這個詞在文檔中的重要程度,而後把重要程度填在相應的位置,每一個文檔都會產生一個向量。
對用戶也創建一份相應的資料,資料的建法是 用戶以前總會閱讀過一些資料,那麼這些看過的資料應該也會有向量,即4000個詞對應相應程度的向量。而後對這些看過的資料向量作一個平均或者加權平均。或者是將這些資料的向量先揉在一塊創建一個向量。排序
用用戶的向量和文檔的向量去求一個類似度。一般用用戶的向量和那些用戶沒有看過的文檔資料進行比對,挑出來一些比較接近的文檔。
協同過濾
協同過濾一種基於近鄰的算法,意思是我須要去找到和我最接近的鄰居,根據這些鄰居來作決策。
1.基於近鄰去作綜合的斷定。
2.近鄰怎麼找?依託於用戶在共同商品上的行爲,即A,B用戶在a,b,c,d,e 5個商品上的得分,去斷定這兩個用戶之間是否是近鄰,若是是近鄰 那麼他們有多近。
找近鄰?如今有商品a,b 用戶A,B,C,D,E 用戶分別對商品a,b都有一個打分。基於各自用戶對商品的打分向量來計算商品的類似度。
類似度/距離定義
Jaccard類似度通常用於TopN推薦,要麼用戶看了要麼沒看。
基於物品的協同過濾
R_xi預測用戶x對商品i的評分。
經過計算找回來了最接近的五個物品I(i1,i2,i3,i4,i5)
1號電影若是要推薦給5號用戶,預測1號電影推薦給5號用戶的得分。
這裏的權重(用戶的打分)取的是TopN的權重,沒有把全部的電影拿過來,緣由是在電商的體系當中,若是你要推薦商品,電商總共的商品也許有上千萬,那這個時候若是每個商品都拿來比對,顯然是不可行的,因此咱們只會取TopN這一部分,好比上圖只取了3號和5號兩部電影,評估一下把1號電影推薦給5號用戶會得多少分!!
基於用戶的協同過濾
預測用戶i對商品j的評分Vi,j
大K表示歸一化因子,用來作加權平均。
基於用戶的是求列向量之間的相識度。計算每一列和5號列的相識度,取出其中的TopN,假設3號和11號和他是最接近的,求相識度時建議用皮爾森來求。
注意:公式比較粗略,能夠參考:www.cnblogs.com/zhangchaoya…
UserCF vs ItemCF
對於買過,推薦結果集中又包含的同類商品,推薦模型自己是不能幫你處理的,須要本身根據獲得的結果集進行處理。
CF的優缺點
冷啓動問題
隱語義模型
用戶對某些電影打分高,通常是基於某些因素去作的,例如:演員,主題等等。
對電影作打分,好或者很差,通常是某些因素在的。
假設打分取決於3個因素,那咱們就來看看,用戶和這3個因素的關聯,以及電影和這三個因素的關聯,這就是所謂的矩陣分解。
矩陣分解的物理意義,能夠這麼理解,M*N的矩陣能夠當作是M*F的矩陣和F*N的矩陣相乘(M*N=M*F * F*N)。是這N個用戶對這F個隱層因素上的值或者得分,以及這M個商品對這F個隱層因素上的值或者得分之間作一個關聯 決定了他最後的得分。
用戶和隱層的關聯與商品和隱層的關聯,作乘法的意思就是看看這關聯一不一致,不一致的話它就是負向的(負的得分),一致的話他就是一個正向的(正的得分)。
因素怎麼判別?矩陣分解!
SVD分解在這種場景下不必定合適,第一它的時間複雜度過高,第二由於有些位置是空的(沒有得分),它會在這個位置填上一個零,但這是你人爲的填充,當你分解後還原回來的時候,這個位置的值依然很小,達不到咱們對缺省位置填充值的這麼一個做用。
SVD對於有缺省的值,由於你必需要在這個缺省的位置填上一個分數,你又沒有東西能夠填,不少時候你會給他一個零,但在給零的狀況下,就至關於你人爲的給了他一個分數,因此他在把這個矩陣還原回來的時候,這個缺省值的位置依據會趨於零,這個方式是不合理的。
若是要用矩陣分解,又不想受到沒有得分位置的影響,怎麼辦?辦法是假設如今有個U個用戶,D個item,我想要找到K個關聯因子,讓已經有得分的位置儘可能的接近,沒有分數的位置無論它。
r_ij:第i個用戶對j個商品的評分,依據我分解出來的矩陣作預測,他的得分會是多少呢?得分是經過兩個向量的內積獲得的,例如上面圖中的[1,-2,0]*[-1,4,2]=5。
咱們讓預測出來的得分和相應位置已經有得分位置的值最接近。
第一個因子對最後的推薦貢獻了多少,第二個因子對最後的推薦貢獻了多,第三個因子對最後的推薦貢獻了多,把全部的這些因子的貢獻加在一塊就是最後的推薦值。
隱語義模型進一步優化
每一個用戶都會有一個平均打分, 每部電影你們打他也會有一個平均打分, 全部人在全部電影上的得分也會有一個均值。 這三個均值也會影響最後的結果。我想把這3個均值也加到公式中最後的影響因素裏頭。
Time表示前面咱們指的context上下文。