推荐系统——矩阵分解FM
矩陣分解
隱語義模型與矩陣分解
之所以我們提出隱語義模型與矩陣分解,原因就是[[協(xié)同過濾]]存在泛化能力弱的問題
而對于隱語義模型而言,我們可以利用隱向量來代表隱藏信息
此外,也可以在一定程度上彌補[[協(xié)同過濾]]處理稀疏矩陣能力不足的情況
隱語義模型
隱語義模型主要在于可以挖掘用戶和物品的潛在特征來聯(lián)系不同的用戶和物品,接著對不同的用戶和item進行聚類
可以舉個例子,如果用戶A喜歡看偵探小說、科普圖書以及一些計算機技術(shù)書,而B喜歡數(shù)學(xué)和機器學(xué)習(xí)方面。
- 對于UserCF而言,系統(tǒng)會先找到和其看了相同書的其他用戶,然后給新用戶推薦其他用戶看的書
- 對于ItemCF而言,系統(tǒng)會找到和新用戶已經(jīng)看的書相似的書(在這里所謂的相似并沒有用到隱語義,可能只是簡單的通過書籍的評分來尋找相似),然后給用戶推薦這些書籍
那么隱語義模型會嘗試將用戶興趣和書進行歸類,當(dāng)用戶來的時候會將用戶的興趣分類,再從興趣分類中挑選他可能喜歡的書籍。
可以再使用一個對音樂評分的例子來看一下隱特征矩陣的含義:
A喜歡帶有小清新,吉他伴奏,王菲的歌曲,如果一首歌正好是王菲唱的,并且是吉他伴奏的小清新,那么就可以將這首歌推薦給這個用戶,所以這里是三個標(biāo)簽🏷連接起了用戶和歌曲。又每首歌中所包含的元素不盡相同,因此,我們可以去找如下兩個矩陣
潛在因子——用戶矩陣
| 三 | 0.6 | 0.8 | 0.1 | 0.1 |
| 四 | 0.1 | 0 | 0.9 | 0.1 |
| 五 | 0.5 | 0.7 | 0.9 | 0.9 |
潛在因子——音樂矩陣P
表示每種音樂中含有各種元素的成分,如下表中,音樂A是一個偏小清新的音樂,含有小清新的Latent Factor的成分是0.9,重口味的成分是0.1,優(yōu)雅成分0.2
| 樂A | 0.9 | 0.1 | 0.2 | 0.4 |
| 樂B | 0.5 | 0.6 | 0.1 | 0.9 |
| 樂C | 0 | 0.6 | 0.1 | 0.2 |
那么有了以上矩陣,我們可以認為張三對音樂A的喜歡程度為
0.6?0.9+0.8?0.1+0.1?0.2+0.1?0.4+0.7?0=0.690.6*0.9+0.8*0.1+0.1*0.2+0.1*0.4+0.7*0 = 0.690.6?0.9+0.8?0.1+0.1?0.2+0.1?0.4+0.7?0=0.69
基于此,我們也可以得到一個用戶——音樂評分的共現(xiàn)矩陣
| 張三 | 0.68 | 1.58 | 0.28 | 0.51 |
| 李四 | 0.31 | 0.43 | 0.47 | 0.11 |
| 王五 | 1.06 | 1.57 | 0.73 | 0.69 |
??所以在此例子中,小清新,重口味,優(yōu)雅這些就可以看作是隱含特征,而我們就可以用這些隱含特征來將用戶的興趣和音樂進行一個分類,其本質(zhì)即為找到用戶/音樂的一個隱向量表達形式,通過該隱向量就可以來進行用戶/音樂之間相似度的判定。
但是在實際情況下,我們一般也是只能有最后的用戶——物品打分矩陣,并且矩陣會存在很多缺失值如
| 張三 | 0.68 | ? | ? | 0.51 |
而對于使用UserCF或者ItemCF去填充也是很麻煩的,對此,我們可以使用[[矩陣分解]]
矩陣分解的原理
??如果我們有用戶——物品打分的共線矩陣YYY(存在缺失值),基于[[矩陣分解]]的原理,我們求出矩陣PPP和QQQ有:P×Q=YP \times Q = YP×Q=Y
??其中,矩陣乘法將m×nm\times nm×n的共現(xiàn)矩陣Y分分解為m×km \times km×k的用戶矩陣和k×nk \times nk×n的物品矩陣,其中m為用戶的個數(shù),n為物品的個數(shù),而k為隱向量的維度即隱含特征的個數(shù),但是這里的隱含特征變得無法解釋,并不是和我們之前矩陣小清新的例子一樣是明顯可解釋的,而對于k而言,k的大小決定了隱向量的表達能力的強弱,k越大,表達信息就越強,劃分得就更具體。
??在有了用戶矩陣P和物品矩陣Q之后,如果我們想計算用戶uuu對物品iii的評分,只需要
Preference(u,i)=rui=puTqi=∑f=1Fpu,kqk,iPreference(u, i) = r_{ui} = p^T_uq_i = \sum_{f=1}^Fp_{u,k}q_{k,i}Preference(u,i)=rui?=puT?qi?=f=1∑F?pu,k?qk,i?
??其中,pup_upu?為用戶uuu所對應(yīng)的隱向量,qiq_iqi?為用戶iii所對應(yīng)的隱向量
矩陣分解算法的求解
矩陣分解常用方法為[[特征值分解EVD]]與[[奇異值分解SVD]],但是這兩種方法在這里并不適用,比如EVD要求分解的矩陣為方陣,但是對于用戶——物品打分矩陣而言,不一定是方陣的形式,而對于SVD分解計算機復(fù)雜度非常高
Basic SVD
Funk-SVD:把求解上面兩個矩陣的參數(shù)問題轉(zhuǎn)換成一個最優(yōu)化問題,可以通過訓(xùn)練集里面的觀察值利用最小化來學(xué)習(xí)用戶矩陣和物品矩陣
??如果我們想計算用戶uuu對物品iii的評分,可以使用Preference(u,i)=rui=puTqi=∑f=1Fpu,kqk,iPreference(u, i) = r_{ui} = p^T_uq_i = \sum_{f=1}^Fp_{u,k}q_{k,i}Preference(u,i)=rui?=puT?qi?=f=1∑F?pu,k?qk,i?
而我們一般只會有ruir_{ui}rui?的真實數(shù)據(jù),并沒有pup_upu?和qiq_iqi?,所以基于修正的思想,我們可以初始化puRqip_u^Rq_ipuR?qi?,然后計算出r^ui=puTqi\hat{r}_{ui} = p_u^Tq_ir^ui?=puT?qi?,從而得到誤差
eui=rui?r^uie_{ui} = r_{ui} - \hat{r}_{ui}eui?=rui??r^ui?
接著求出誤差平方和
SSE=∑u,ieui2=∑u,i(rui?∑k=1Kpu,kqk,i)2SSE = \sum_{u, i}e_{ui}^2=\sum_{u, i}(r_{ui}-\sum_{k=1}^Kp_{u, k}q_{k, i})^2SSE=u,i∑?eui2?=u,i∑?(rui??k=1∑K?pu,k?qk,i?)2
有了誤差之后,我們可以利用誤差進行修正從而使SSE降到最小,轉(zhuǎn)化為一個最優(yōu)化問題,而目標(biāo)函數(shù)為
min?q?,p?∑(u,i)∈K(rui?puTqi)2\min_{q^*, p^*}\sum_{(u, i) \in K}(r_{ui} - p_u^Tq_i)^2q?,p?min?(u,i)∈K∑?(rui??puT?qi?)2
接下來可以使用梯度下降去降低損失,有
pu,k=pu,k?η(?euiqk,i)=pu,k+ηeuiqk,ip_{u, k} = p_{u, k} - \eta(-e_{ui}q_{k,i}) = p_{u, k}+\eta e_{ui}q_{k,i} pu,k?=pu,k??η(?eui?qk,i?)=pu,k?+ηeui?qk,i?
qk,i=qk,i?η(?euipu,k)=qk,i+ηeuipu,kq_{k, i} = q_{k, i} - \eta(-e_{ui}p_{u,k}) = q_{k, i}+\eta e_{ui}p_{u,k} qk,i?=qk,i??η(?eui?pu,k?)=qk,i?+ηeui?pu,k?
其中,η\etaη為學(xué)習(xí)率。
但在實際中,單純的r^ui=puTqi\hat{r}_{ui} = p^T_uq_ir^ui?=puT?qi?只能評判一部分屬性,對于一個評分系統(tǒng)而言,有些固有屬性和用戶物品無關(guān),而用戶也有有些屬性和物品無關(guān),物品也有些屬性和用戶無關(guān),所以提出了另一種[[LFM]],在原有基礎(chǔ)上添加了偏置項。
LFM
LFM在原有基礎(chǔ)上加了偏置項,來消除用戶和物品打分的偏差,即預(yù)測公式如下:
r^ui=μ+bu+bi+puT?qi\hat{r}_{ui} = \mu + b_u + b_i + p^T_u \cdot q_ir^ui?=μ+bu?+bi?+puT??qi?
加入了3個偏置項μ,bu,bi\mu, b_u, b_iμ,bu?,bi?
- μ\muμ:訓(xùn)練集中,也就是那個矩陣Y所有非空元素的平均值。因為可能在一個網(wǎng)站的評價打分中,因為網(wǎng)站的定位和銷售物品不同,所以網(wǎng)站的整體打分分布會產(chǎn)生差異,所以μ\muμ可以表示網(wǎng)站本身對用戶評分的影響。
- bub_ubu?:用戶偏差系數(shù),是用戶uuu所有打分的均值, 可以當(dāng)作訓(xùn)練參數(shù)。這一項表示了用戶的評分習(xí)慣中和物品沒有關(guān)系的那種因素
- bib_ibi?:物品偏差系數(shù),是物品iii收到的所有評分的均值,可以當(dāng)作訓(xùn)練參數(shù)。表示了物品接受的評分中和用戶沒有關(guān)系的因素
而此時添加了偏置系數(shù)之后,SSE的形式也需要改變,如果把bub_ubu?和bib_ibi?當(dāng)作訓(xùn)練參數(shù)的話,那么它倆的更新公式為bu+=η(eui?λbu)b_u += \eta (e_{ui} - \lambda b_u)bu?+=η(eui??λbu?) bi+=η(eui?λbi)b_i += \eta(e_{ui} - \lambda b_i)bi?+=η(eui??λbi?),而對于pu,kp_{u,k}pu,k?和pk,ip_{k,i}pk,i?,導(dǎo)數(shù)沒有變化,更新公式也沒有變化。
實現(xiàn)例子的代碼:
import numpy as np import randomclass SVD():def __init__(self, rating_data, F=5, alpha=0.1, lmbda=0.1, max_iter=100):self.F = Fself.P = dict()self.Q = dict()self.rating_data = rating_dataself.bi = dict()self.bu = dict()self.mu = 0.0self.alpha = alphaself.lmbda = lmbdaself.max_iter = max_itercnt = 0for user, items in self.rating_data.items():self.P[user] = [random.random() / np.sqrt(self.F) for i in range(self.F)]self.bu[user] = 0cnt += len(items)for item, rating in items.items():if item not in self.Q:self.Q[item] = [random.random() / np.sqrt(self.F) for i in range(self.F)]self.bi[item] = 0self.mu /= cntdef train(self):for step in range(self.max_iter):for user, items in self.rating_data.items():for item, rui in items.items():rhat_ui = self.predict(user, item)e_ui = rui - rhat_uiself.bu[user] += self.alpha*(e_ui-self.lmbda*self.bu[user])self.bi[item] += self.alpha*(e_ui-self.lmbda*self.bi[item])# 此處添加了正則化for k in range(self.F):self.P[user][k] += self.alpha*(e_ui*self.Q[item][k] - self.lmbda*self.P[user][k])self.Q[item][k] += self.alpha*(e_ui*self.P[user][k] - self.lmbda*self.Q[item][k])self.alpha *= 0.1def predict(self, user, item):return sum(self.P[user][i] * self.Q[item][i] for i in range(self.F)) + self.bu[user] + self.bi[item] + self.mudef load_data():data = {'A':{1:5, 2:3, 3:4, 4:4},'B':{1:3, 2:1, 3:2, 4:3, 5:3},'C':{1:4, 2:3, 3:4, 4:3, 5:5},'D':{1:3, 2:3, 3:1, 4:5, 5:4},'E':{1:1, 2:5, 3:5, 4:2, 5:1}}return datarating_data = load_data() basicsvd = SVD(rating_data, F=10) basicsvd.train() print(item, basicsvd.predict('A', 5))FM模型
FM模型的引入
邏輯回歸模型及其缺點
一般做CTR預(yù)估時最簡單的思路即將特征做線性回歸(邏輯回歸LR),但這樣本質(zhì)上是一個線性模型,由于sigmoid函數(shù)是一個單調(diào)增函數(shù)不會改變里面的線性模型的CTR預(yù)測順序,因此邏輯回歸的效果會比較差,即LR的缺點有:
[[二叉交叉項的考慮及改進]]
考慮到做特征交叉較為麻煩,于是考慮所有的二次交叉,于是將目標(biāo)函數(shù)由原來的y=w0+∑i=1nwixiy = w_0 + \sum_{i=1}^nw_ix_iy=w0?+i=1∑n?wi?xi?改為y=w0+∑i=1nwixi+∑in?1∑j=i+1nwi,jxixjy = w_0 + \sum_{i=1}^nw_ix_i+\sum_{i}^{n-1}\sum_{j=i+1}^nw_{i,j}x_ix_jy=w0?+i=1∑n?wi?xi?+i∑n?1?j=i+1∑n?wi,j?xi?xj?
但是針對上式存在一個問題即只有當(dāng)xix_ixi?與xjx_jxj?同時不為0時此二階交叉項才能起作用
于是提出FM,而FM將上述式子改為y=w0+∑i=1nwixi+∑in?1∑j=i+1n<vi,vj>xixjy = w_0 + \sum_{i=1}^nw_ix_i+\sum_{i}^{n-1}\sum_{j=i+1}^n<v_i,v_j>x_ix_jy=w0?+i=1∑n?wi?xi?+i∑n?1?j=i+1∑n?<vi?,vj?>xi?xj?
此處的解釋為,在這里是對每個xix_ixi?計算一個embeddingembeddingembedding,接著將兩個embeddingembeddingembedding計算內(nèi)積即<vi,vj><v_i,v_j><vi?,vj?>來代替之前的wi,jw_{i,j}wi,j?,好處是這個模型的泛化能力強,即使存在有兩個特征從未在訓(xùn)練集中同時出現(xiàn)過,我們也可以計算出它們的wi,jw_{i,j}wi,j?,我們只需要xix_ixi?和其他的xkx_kxk?同時在訓(xùn)練集中出現(xiàn)過則可計算出xix_ixi?的EmbeddingEmbeddingEmbedding
FM公式的理解
對于FM公式而言,模型表達能力大于LR,只有當(dāng)交叉項參數(shù)wijw_{ij}wij?全為0的時候,才會退化為LR,而且后面的二階交叉項的數(shù)量一共有1+2+3+?+n?1=n(n?1)21+2+3+\cdots + n-1 = \frac{n(n-1)}{2}1+2+3+?+n?1=2n(n?1)?,且任意兩個參數(shù)之間是獨立的。
def 任意一個實對稱矩陣([[正定矩陣]])WWW都存在一個矩陣VVV,使得W=V?VTW = V \cdot V^TW=V?VT
y^(X)=w0+∑i=1nwixi+∑in?1∑j=i+1n<vi,vj>xixj\hat{y}(X) = w_0 + \sum_{i=1}^nw_ix_i+\sum_{i}^{n-1}\sum_{j=i+1}^n<v_i,v_j>x_ix_jy^?(X)=w0?+i=1∑n?wi?xi?+i∑n?1?j=i+1∑n?<vi?,vj?>xi?xj?
其中,需要估計的參數(shù)有w0∈R,wi∈R,V∈R,<?,?>w_0 \in R, w_i \in R, V \in R, <\cdot, \cdot>w0?∈R,wi?∈R,V∈R,<?,?>是兩個長度為k的向量的內(nèi)積
對于FM模型而言,在[[二叉交叉項的考慮及改進]]中,我們提出了使用<?,?><\cdot,\cdot><?,?>來代替wijw_{ij}wij?的改進,從而使二次項的參數(shù)數(shù)量減少為knknkn個,遠遠少于多項式模型的二項式參數(shù),此外,參數(shù)因子化使得xhxix_hx_ixh?xi?與xixjx_ix_jxi?xj?不再是獨立的。
FM模型是一個通用的擬合模型,可以采用不同的損失函數(shù)用以解決regression,classification問題。
FM的理解:FM可以用于解決大型稀疏數(shù)據(jù)中的特征組合問題。對于MF而言,只存在兩個兩個特征信息,而FM可以將兩個特征進行二階交叉組合,形成一個高階特征。具體可以參考推薦系統(tǒng)之FM與MF傻傻分不清楚。
MF其實算是FM的特例,只有兩個特征的特例,給出一個矩陣來幫助理解,希望自己之后看到這個例子可以想起來
| item1 | 1 | 2 | 3 |
| item2 | 2 | 3 | 4 |
| item3 | 3 | 4 | 5 |
這個是MF的輸入矩陣,而轉(zhuǎn)化為FM的格式就變?yōu)?/p>
| 1 | 0 | 0 | 1 | 0 | 0 | 1 |
| 1 | 0 | 0 | 0 | 1 | 0 | 2 |
| 1 | 0 | 0 | 0 | 0 | 1 | 3 |
| 0 | 1 | 0 | 1 | 0 | 0 | 2 |
| 0 | 1 | 0 | 0 | 1 | 0 | 3 |
| 0 | 1 | 0 | 0 | 0 | 1 | 4 |
| 0 | 0 | 1 | 1 | 0 | 0 | 3 |
| 0 | 0 | 1 | 0 | 1 | 0 | 4 |
| 0 | 0 | 1 | 0 | 0 | 1 | 5 |
總結(jié)
以上是生活随笔為你收集整理的推荐系统——矩阵分解FM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨境电子商务营销策略分析以速卖通为例
- 下一篇: 《手机音频》参数与选择