推薦系統(tǒng)和協(xié)同過濾算法

推薦系統(tǒng)是目前非常流行的機(jī)器學(xué)習(xí)應(yīng)用。
特征值對機(jī)器學(xué)習(xí)是非常重要的,而對特征值的選擇會直接影響到算法的好壞,推薦系統(tǒng)能夠自動幫助學(xué)習(xí)一些優(yōu)良的特征值,幫助更好的實現(xiàn)算法。

舉例說明

以電影評分和推薦電影為例

先定義幾個變量:
n_u=用戶人數(shù)
n_m=電影數(shù)量
r(i,j)=1 表示用戶j評價了電影i
y(i,j)= 用戶j對電影i的評分,只有在r(i,j)=1的時候才會有
m^{(j)}=用戶j評價過的電影數(shù)量

首先電影評分分為0-5星。我們有4個用戶和5部電影:

電影 Alice(1) Bob(2) Carol(3) Dave(4)
Love at last(1) 5 5 0 0
Romance forever(2) 5 ? ? 0
Cute puppies of love(3) ? 4 0 ?
Nonstop car chases(4) 0 0 5 4
Swords vs. karate(5) 0 0 5 ?

上表中n_u=4,n_m=5,電影i=1,2,3為愛情片,i=4,5為動作片,打問號的表示沒有評分。

上面的表格中可以看到Alice和Bob對愛情電影評分很高,對動作片評分很低,Carol和Dave則相反。

現(xiàn)在給每部電影添加兩個特征值:x_1表示浪漫指數(shù),x_2表示動作指數(shù):

電影 Alice(1) Bob(2) Carol(3) Dave(4) x_1(浪漫) x_2(動作)
Love at last(1) 5 5 0 0 0.9 0
Romance forever(2) 5 ? ? 0 1 0.01
Cute puppies of love(3) ? 4 0 ? 0.99 0
Nonstop car chases(4) 0 0 5 4 0.1 1
Swords vs. karate(5) 0 0 5 ? 0 1

用矩陣的形式來表示每個電影的特征值:
x^{(1)}=\left[ \begin{matrix} 0 \\\ 0.9 \\\ 0 \end{matrix} \right], x^{(2)}=\left[ \begin{matrix} 0 \\\ 1 \\\ 0.01 \end{matrix} \right], x^{(3)}=\left[ \begin{matrix} 0 \\\ 0.99 \\\ 0 \end{matrix} \right], x^{(4)}=\left[ \begin{matrix} 0 \\\ 0.1 \\\ 1 \end{matrix} \right], x^{(5)}=\left[ \begin{matrix} 0 \\\ 0 \\\ 1 \end{matrix} \right]

想要預(yù)測問號的值,這是一個線性回歸的問題。
對于用戶j來說,要預(yù)測他對電影i的評分值,應(yīng)用線性回歸的模型,當(dāng)通過算法獲得來一個參數(shù)\theta^{(j)},通過這個參數(shù),計算(\theta^{(j)})^T \cdot x^{(i)},即可預(yù)測出評分值。

假設(shè)要預(yù)測用戶1對電影3的評分:用戶1的參數(shù)\theta^{(1)} = \left[ \begin{matrix} 0 \\\ 5 \\\ 0 \end{matrix} \right],計算他對電影3的評分:(\theta^{(1)})^T \cdot x^{(3)} = 4.95,即可預(yù)測他的評分為5星。

下面就是對每個用戶,應(yīng)用線性回歸模型即可預(yù)測出他們對電影的評分。

用公式來表示一下:
對一個用戶j,他的線性回歸公式:
min_{\theta^{(j)}} = \frac{1}{2m^{(j)}} \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})^2 + \frac{\lambda}{2m^{(j)}}\sum_{k=1}^n(\theta_k^{(j)})^2
這就是常用的線性回歸模型。

下面在公式上約去常數(shù)m^{(j)}項,這并不影響最小化代價函數(shù):
min_{\theta^{(j)}} = \frac{1}{2} \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{k=1}^n(\theta_k^{(j)})^2

然后計算所有用戶加在一起的代價函數(shù)公式:
min_{\theta^{(1)},...,\theta^{(n_u)}} = \frac{1}{2} \sum_{j=1}^{n_u} \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n(\theta_k^{(j)})^2

對該公式應(yīng)用梯度下降求最小值:
當(dāng)k=0
\theta_k^{(j)} := \theta_k^{(j)} - \alpha \left( \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)} \right)

當(dāng)k \not= 0
\theta_k^{(j)} := \theta_k^{(j)} - \alpha \left( \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)} + \lambda\theta_k^{(j)} \right)

協(xié)同過濾(Collaborative Filtering)

在一個電影網(wǎng)站中,很難去獲得一部電影的浪漫指數(shù)和動作指數(shù)是多少,這個參數(shù)很難人為的去判斷。為了解決這個問題,可以使用特征尋找器(feature finders.

現(xiàn)在我們不知道電影的特征值是多少,x^{(i)}=\left[ \begin{matrix} 0 \\\ ? \\\ ? \end{matrix} \right],但是我們通過某種途徑得知用戶對各種類型電影的喜愛程度,是喜歡動作電影還是喜歡愛情電影。\theta_1表示喜歡愛情電影的參數(shù),\theta_2表示喜歡動作電影的參數(shù)

電影 Alice(1) Bob(2) Carol(3) Dave(4)
Love at last(1) 5 5 0 0
Romance forever(2) 5 ? ? 0
Cute puppies of love(3) ? 4 0 ?
Nonstop car chases(4) 0 0 5 4
Swords vs. karate(5) 0 0 5 ?
\theta_1(浪漫) 5 5 0 0
\theta_2(動作) 0 0 5 5

用矩陣的形式來表示每個用戶的關(guān)于電影特征的參數(shù)值:
\theta^{(1)}=\left[ \begin{matrix} 0 \\\ 5 \\\ 0 \end{matrix} \right], \theta^{(2)}=\left[ \begin{matrix} 0 \\\ 5 \\\ 0 \end{matrix} \right], \theta^{(3)}=\left[ \begin{matrix} 0 \\\ 0 \\\ 5 \end{matrix} \right], \theta^{(4)}=\left[ \begin{matrix} 0 \\\ 0 \\\ 5 \end{matrix} \right]

對一個電影i,要獲得它的特征值x^{(i)}=\left[ \begin{matrix} ? \\\ ? \\\ ? \end{matrix} \right],也可以看作一個線性回歸問題。
同樣的預(yù)測函數(shù)可以寫作:h = (\theta^{(j)})^T \cdot x^{(i)} = (x^{(i)})^T \cdot \theta^{(j)}

那么對一個電影i,它的代價函數(shù)則是:
min_{x^{(i)}} = \frac{1}{2} \sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{k=1}^n(x_k^{(i)})^2

然后計算所有電影加在一起的代價函數(shù)公式:
min_{x^{(1)},...,x^{(n_m)}} = \frac{1}{2} \sum_{i=1}^{n_m} \sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2

同樣的應(yīng)用梯度下降來最小化代價函數(shù)。

通過上面的說明:
當(dāng)我們有電影的特征值x時,可以預(yù)測出用戶的屬性\theta;當(dāng)有用戶的屬性\theta可以預(yù)測出電影的特征值x,這樣交替運(yùn)行,就可以使系統(tǒng)更加完善。這就是基本的協(xié)同過濾算法。

算法公式

將上面的兩個式子合并,同時最小化特征值和參數(shù):
J(x,\theta)=\frac{1}{2} \sum_{(i,j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})^2 + \frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2 + \frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2

PS:該式子中的x\theta都是n維的向量,它們的偏差單元x_0\theta_0都被移除了。

算法步驟

  1. 隨機(jī)初始化x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta^{(n_u)}一個很小的值。
  2. 使用梯度下降算法來最小化代價函數(shù)J。

x_k^{(i)} := x_k^{(i)} - \alpha \frac{\partial}{\partial x_k^{(i)} }J(x,\theta) := x_k^{(i)} - \alpha \left( \sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)} + \lambda x_k^{(i)} \right)

\theta_k^{(j)} := x_k^{(i)} - \alpha \frac{\partial}{\partial \theta_k^{(j)} }J(x,\theta) := \theta_k^{(j)} - \alpha \left( \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)} - y^{(i,j)})x_k^{(i)} + \lambda\theta_k^{(j)} \right)

這樣下來可以對用戶尚未評分的電影,通過預(yù)測評分大小來推薦電影。
對用戶已評分的電影,可以根據(jù)評分和用戶的屬性參數(shù)來獲得更好的電影特征值。

其他應(yīng)用

協(xié)同過濾算法還可以用來推薦相似的產(chǎn)品,假如當(dāng)用戶看了一個電影i之后,可以判斷其他電影和該電影的相似度來推薦,相似度的公式為||x^{(i)} - x^{(j)}||,當(dāng)該式子越小時相似度越高,就可以據(jù)此來推薦電影。

其他事項

在上述電影網(wǎng)站中,除了上面的四個用戶,又有一個新用戶加入,他沒有對任何電影評分,要預(yù)測他對某一個電影的評分,通常采用的方法取評過該電影評分的平均值\mu來當(dāng)作預(yù)測值。

轉(zhuǎn)載自:
https://codeeper.com/2020/02/07/tech/machine_learning/recommender_system.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容