整理自Andrew Ng的machine learning 課程 week 9.算法
目錄:網絡
推薦系統在機器學習領域是一個很流行的應用。機器學習
好比說,咱們嘗試向用戶推薦電影。咱們可使用如下定義:函數
咱們能夠定義兩個特徵$x_1$和$x_2$,分別表明電影的浪漫程度和動做程度(值在0-1之間);學習
一個預測電影評分的作法能夠是,對每個用戶作linear regression,獲得每一個用戶的$\theta^{(j)} \in R^3$(這裏自動加入了$x_0=1$),這樣對用戶j對電影i的評分的預測值就是$(\theta^{(j)})^Tx^{(i)}$;優化
對於用戶j,電影i,預測的評分即爲$(\theta^{(j)})^Tx^{(i)}$spa
爲了學習參數向量$\theta^{(j)}$(用戶j的參數向量),咱們做以下操做:orm
$min_{\theta^{(j)}} \quad \frac{1}{2} \sum_{i:r(i,j)=1}{(\theta^{(j)}x^{(i)}-y^{(i,j)})}^2+\frac{\lambda}{2}\sum_{k=1}^{n}{(\theta_k^{(j)})}^2$blog
這實際上是和線性迴歸的相似的損失函數同步
爲了學習全部用戶的參數向量:
$min_{\theta^{(1)},...,\theta^{(n_u)}} \quad \frac{1}{2} \sum_{j=1}^{n_u} \sum_{i:r(i,j)=1}{(\theta^{(j)}x^{(i)}-y^{(i,j)})}^2+\frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n}{(\theta_k^{(j)})}^2$
以上的損失函數和線性迴歸中的損失函數同樣,因此咱們也能夠用線性迴歸的梯度降低法去更新參數:
$\theta_k^{(j)} = \theta_k^{(j)} - \alpha \sum_{i:r(i,j)=1} ((\theta^(j))^Tx^{(i)} - y^{(i,j)}) x_k^{(i)} \quad k=0$
$\theta_k^{(j)} = \theta_k^{(j)} - \alpha (\sum_{i:r(i,j)=1} ((\theta^(j))^Tx^{(i)} - y^{(i,j)}) x_k^{(i)} + \lambda \theta_k^{(j)}) \quad k \neq 0$
這裏惟一與線性迴歸中的不一樣就是省略掉的常數m是不同的。
實際中很難去定義和計算一部電影的浪漫度和動做度,爲了解決這個問題,可使用feature finder;
能夠在以前詢問用戶對不一樣種類的電影的喜好程度,直接提供$\theta$參數;
而後就能夠經過參數推算特徵了:
$min_{x^{(1)},...,x^{(n_m)}} \quad \frac{1}{2} \sum_{i=1}^{n_m} \sum_{j:r(i,j)=1}{(\theta^{(j)}x^{(i)}-y^{(i,j)})}^2+\frac{\lambda}{2} \sum_{i=1}^{n_m} \sum_{k=1}^{n}{(x_k^{(i)})}^2$
你也能夠隨機的猜想一些$\theta$的值,而後用這些$\theta$的值去計算特徵的值,這樣重複的計算,最後也能夠收斂到比較好的特徵的值
依據上述:
這就是協同過濾(Collaborative Filtering)。
爲了加快計算的速度,咱們其實能夠在最小化時同步的計算參數和特徵:
$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_{j=1}^{n_u} \sum_{k=1}^{n}{(\theta_k^{(j)})}^2 + \frac{lambda}{2} \sum_{i=1}^{n_m} \sum_{k=1}^n {(x^{(i)})}^2$
這個式子看起來比較複雜,其實只是結合了參數$\theta$和特徵x的損失函數,因爲算法能夠學習,因此不須要設定一個$x_0=1$,所以$x \in R^n, \theta \in R^n$;
完整算法以下:
3. 對於一個參數爲$\theta$的用戶和特徵爲x的電影,那麼預測的評分爲$(\theta)^Tx$
爲了實現向量化的計算,公式以下:$Y=X\Theta^T$
一個m*n的矩陣的秩r若是很低,那麼這個矩陣能夠分解爲一個m*r和一個r*n的矩陣相乘(有點相似SVD分解),因此Y能夠直接分解獲得X和$\Theta$
如何定義電影i和電影j的相關度?
$||x_i-x_j||$,這個值越小,說明電影i和電影j的類似度越大。
考慮一個問題,若是一個用戶沒有給任何一部電影評分,那麼經過以前的方法計算出來的此用戶對任何一部電影的評分都會是0,這顯然是不對的,那麼如何解決這個問題呢?
實際上,咱們能夠經過Mean Normalization去處理評分矩陣,獲得一個新的評分矩陣$Y’=Y-\mu$,對這個新的矩陣利用協同過濾算法,計算出用戶參數矩陣和特徵矩陣,再進行預測評分,此時預測時須要在結果上再加上一個均值,由於咱們的評分矩陣是通過處理的,因此求預測時,也須要再把這個以前減去的均值再加回來。