多變量線性回歸(Linear Regression with Multiple Variables)
多維特征

n 代表特征的數(shù)量
{x^{\left( i \right)}}代表第 i 個(gè)訓(xùn)練實(shí)例,是特征矩陣中的第i行,是一個(gè)向量(vector)。
比方說(shuō),上圖的
{x}^{(2)}\text{=}\begin{bmatrix} 1416\\ 3\\ 2\\ 40 \end{bmatrix},
{x}_{j}^{\left( i \right)}代表特征矩陣中第 i 行的第 j 個(gè)特征,也就是第 i 個(gè)訓(xùn)練實(shí)例的第 j 個(gè)特征。
如上圖的x_{2}^{\left( 2 \right)}=3,x_{3}^{\left( 2 \right)}=2,
支持多變量的假設(shè) h 表示為:
h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}},
這個(gè)公式中有n+1個(gè)參數(shù)和n個(gè)變量,為了簡(jiǎn)化表示,引入x_{0}=1,則公式轉(zhuǎn)化為:h_{\theta} \left( x \right)={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
此時(shí)模型中的參數(shù)和任何一個(gè)訓(xùn)練實(shí)例都是n+1維的向量, 因此公式可以簡(jiǎn)化為:h_{\theta} \left( x \right)={\theta^{T}}X(其中上標(biāo)T代表矩陣轉(zhuǎn)置)。
多變量梯度下降
與單變量線性回歸類似,在多變量線性回歸中,我們也構(gòu)建一個(gè)代價(jià)函數(shù),則這個(gè)代價(jià)函數(shù)是所有建模誤差的平方和,即:J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}} ,
其中:h_{\theta}\left( x \right)=\theta^{T}X={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}} ,

我們的目標(biāo)和單變量線性回歸問(wèn)題中一樣,是要找出使得代價(jià)函數(shù)最小的一系列參數(shù)。 多變量線性回歸的批量梯度下降算法為:

即:

求導(dǎo)后得到:

當(dāng)n>=1時(shí), {{\theta }*{0}}:={{\theta }*{0}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}*{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x*{0}^{(i)}
{{\theta }*{1}}:={{\theta }*{1}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}*{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x*{1}^{(i)}
{{\theta }*{2}}:={{\theta }*{2}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}*{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x*{2}^{(i)}
我們開(kāi)始隨機(jī)選擇一系列的參數(shù)值,計(jì)算所有的預(yù)測(cè)結(jié)果后,再給所有的參數(shù)一個(gè)新的值,如此循環(huán)直到收斂。
代碼示例:
計(jì)算代價(jià)函數(shù) J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {h_{\theta}}\left( {x^{(i)}} \right)-{y^{(i)}} \right)}^{2}}} 其中:{h_{\theta}}\left( x \right)={\theta^{T}}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
Python 代碼:
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
梯度下降法實(shí)踐1-特征縮放
在我們面對(duì)多維特征問(wèn)題的時(shí)候,我們要保證這些特征都具有相近的尺度,這將幫助梯度下降算法更快地收斂。
以房?jī)r(jià)問(wèn)題為例,假設(shè)我們使用兩個(gè)特征,房屋的尺寸和房間的數(shù)量,尺寸的值為 0-2000平方英尺,而房間數(shù)量的值則是0-5,以兩個(gè)參數(shù)分別為橫縱坐標(biāo),繪制代價(jià)函數(shù)的等高線圖能,看出圖像會(huì)顯得很扁,梯度下降算法需要非常多次的迭代才能收斂。

解決的方法是嘗試將所有特征的尺度都盡量縮放到-1到1之間。這個(gè)范圍根據(jù)經(jīng)驗(yàn)來(lái)定,比如-3到3或者-\frac{1}{3}到\frac{1}{3}可以接受,但若是-0.001到0.001或者-100到100就太大了。如圖:

最簡(jiǎn)單的方法是令:normalized feature: {{x}_{n}}=\frac{{{x}_{n}}-{{\mu}_{n}}}{{{s}_{n}}},其中 {\mu_{n}}是平均值,{s_{n}}是標(biāo)準(zhǔn)差或者范圍(最大值-最小值)。
梯度下降法實(shí)踐2-學(xué)習(xí)率
梯度下降算法收斂所需要的迭代次數(shù)根據(jù)模型的不同而不同,我們不能提前預(yù)知,我們可以繪制迭代次數(shù)和代價(jià)函數(shù)的圖表來(lái)觀測(cè)算法在何時(shí)趨于收斂。

可以看出300到400次迭代后接近收斂。
也有一些自動(dòng)測(cè)試是否收斂的方法,例如將代價(jià)函數(shù)的變化值與某個(gè)閥值\epsilon(例如0.001)進(jìn)行比較,但通常合適閥值比較難以確定。所以看圖更清晰。
正確的J(θ)曲線每次迭代應(yīng)該是下降的。
梯度下降算法的每次迭代受到學(xué)習(xí)率的影響,如果學(xué)習(xí)率\alpha過(guò)小,則達(dá)到收斂所需的迭代次數(shù)會(huì)非常高。
(If α is too small: slow convergence)
如果學(xué)習(xí)率\alpha過(guò)大,每次迭代可能不會(huì)減小代價(jià)函數(shù),會(huì)越過(guò)局部最小值導(dǎo)致無(wú)法收斂。
(If α is too large: J(θ) may not decrease on every iterration, may not converge)

合適的學(xué)習(xí)率保證了正確和效率。
通??梢钥紤]嘗試些學(xué)習(xí)率:
(按3倍)
\alpha=0.001,0.003,0.01,0.03,0.1,0.3,1,3,10
特征和多項(xiàng)式回歸
如房?jī)r(jià)預(yù)測(cè)問(wèn)題,

h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}\times{frontage}+{\theta_{2}}\times{depth}
{x_{1}}=frontage(臨街寬度),{x_{2}}=depth(縱向深度),我們選擇更合適的 x=frontage*depth=area(面積)作為特征,則:{h_{\theta}}\left( x \right)={\theta_{0}}+{\theta_{1}}x。 線性回歸并不適用于所有數(shù)據(jù),有時(shí)我們需要曲線來(lái)適應(yīng)我們的數(shù)據(jù),比如一個(gè)二次方模型:h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2} 或者三次方模型: h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}+{\theta_{3}}{x_{3}^3}
選擇合適的特征和得到更適合的模型。
要根據(jù)數(shù)據(jù)模型選擇合適的函數(shù)模型來(lái)擬合。
注:如果我們采用多項(xiàng)式回歸模型,在運(yùn)行梯度下降算法前,特征縮放非常有必要。
正規(guī)方程(normal equation)
到目前為止,我們都在使用梯度下降算法,但是對(duì)于某些線性回歸問(wèn)題,正規(guī)方程方法是更好的解決方案。如:
先假設(shè)θ屬于實(shí)數(shù):

正規(guī)方程是通過(guò)求解下面的方程來(lái)找出使得代價(jià)函數(shù)最小的參數(shù)的:\frac{\partial}{\partial{\theta_{j}}}J\left( {\theta_{j}} \right)=0 。 假設(shè)我們的訓(xùn)練集特征矩陣為 X(包含了 {{x}_{0}}=1)并且我們的訓(xùn)練集結(jié)果為向量 y,則利用正規(guī)方程解出向量 \theta ={{\left( {X^T}X \right)}^{-1}}{X^{T}}y 。 上標(biāo)T代表矩陣轉(zhuǎn)置,上標(biāo)-1 代表矩陣的逆。設(shè)矩陣A={X^{T}}X,則:{{\left( {X^T}X \right)}^{-1}}={A^{-1}} 以下表示數(shù)據(jù)為例:

即:

運(yùn)用正規(guī)方程方法求解參數(shù):

在 Octave 中,正規(guī)方程寫(xiě)作:
pinv(X'*X)*X'*y
pinv計(jì)算逆矩陣
注: 正規(guī)方程不需要特征縮放。
注:對(duì)于那些不可逆的矩陣(通常是因?yàn)樘卣髦g不獨(dú)立,如同時(shí)包含英尺為單位的尺寸和米為單位的尺寸兩個(gè)特征,也有可能是特征數(shù)量大于訓(xùn)練集的數(shù)量),正規(guī)方程方法是不能用的。
梯度下降與正規(guī)方程的比較:
| 梯度下降 | 正規(guī)方程 |
|---|---|
| 需要選擇學(xué)習(xí)率 | 不需要 |
| 需要多次迭代 | 一次運(yùn)算得出 |
| 當(dāng)特征數(shù)量大時(shí)也能較好適用 | 需要計(jì)算 ({X}^{T}X)^{-1},如果特征數(shù)量n較大則運(yùn)算代價(jià)大,因?yàn)榫仃嚹娴挠?jì)算時(shí)間復(fù)雜度為O(n^3),通常來(lái)說(shuō)當(dāng)小于10000 時(shí)還是可以接受的 |
| 適用于各種類型的模型 | 只適用于線性模型,不適合邏輯回歸模型等其他模型 |
Conclusion: 只要特征變量的數(shù)目并不大,標(biāo)準(zhǔn)方程是一個(gè)很好的計(jì)算參數(shù)的替代方法。具體地說(shuō),只要特征變量數(shù)量小于一萬(wàn),我通常使用標(biāo)準(zhǔn)方程法,而不使用梯度下降法。
隨著我們要講的學(xué)習(xí)算法越來(lái)越復(fù)雜,例如,當(dāng)我們講到分類算法,像邏輯回歸算法,我們會(huì)看到,實(shí)際上對(duì)于那些算法,并不能使用標(biāo)準(zhǔn)方程法。對(duì)于那些更復(fù)雜的學(xué)習(xí)算法,我們將不得不仍然使用梯度下降法。因此,梯度下降法是一個(gè)非常有用的算法,可以用在有大量特征變量的線性回歸問(wèn)題?;蛘呶覀円院笤谡n程中,會(huì)講到的一些其他的算法,因?yàn)闃?biāo)準(zhǔn)方程法不適合或者不能用在它們上。但對(duì)于這個(gè)特定的線性回歸模型,標(biāo)準(zhǔn)方程法是一個(gè)比梯度下降法更快的替代算法。所以,根據(jù)具體的問(wèn)題,以及你的特征變量的數(shù)量,這兩種算法都是值得學(xué)習(xí)的。
正規(guī)方程的python實(shí)現(xiàn):
def normalEqn(X, y):
theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等價(jià)于X.T.dot(X)
return theta
正規(guī)方程及不可逆性(選修)
當(dāng)計(jì)算 θ=inv(X'X ) X'y,那對(duì)于矩陣的結(jié)果是不可逆的情況咋辦呢? 如果你懂一點(diǎn)線性代數(shù)的知識(shí),你或許會(huì)知道,有些矩陣可逆,而有些矩陣不可逆。我們稱那些不可逆矩陣為奇異或退化矩陣。 問(wèn)題的重點(diǎn)在于的不可逆的問(wèn)題很少發(fā)生,在Octave里,如果你用它來(lái)實(shí)現(xiàn)的計(jì)算,你將會(huì)得到一個(gè)正常的解。在Octave里,有兩個(gè)函數(shù)可以求解矩陣的逆,一個(gè)被稱為pinv(),另一個(gè)是inv(),這兩者之間的差異是些許計(jì)算過(guò)程上的,一個(gè)是所謂的偽逆,另一個(gè)被稱為逆。即便矩陣是不可逆的,使用pinv() 函數(shù)也可計(jì)算出值。
在線性代數(shù)中的定義:
奇異矩陣指矩陣的行列式|A|是等于0,稱矩陣A為奇異矩陣;若不等于0,稱矩陣A為非奇異矩陣。 同時(shí),由|A|≠0可知矩陣A可逆,這樣可以得出另外一個(gè)重要結(jié)論:可逆矩陣就是非奇異矩陣,非奇異矩陣也是可逆矩陣。 如果A為奇異矩陣,則AX=0有無(wú)窮解,AX=b有無(wú)窮解或者無(wú)解。如果A為非奇異矩陣,則AX=0有且只有唯一零解,AX=b有唯一解。
如果矩陣中有一些多余的特征,比如是線性相關(guān)的,像x_1是以英尺為尺寸規(guī)格計(jì)算的房子,x_2是以平方米為尺寸規(guī)格計(jì)算的房子,兩個(gè)特征值將始終滿足約束:x_1=x_2*(3.28)^{2},那么矩陣是不可逆的,就可以刪除這些重復(fù)特征。因此,首先應(yīng)該通過(guò)觀察所有特征檢查是否有多余的特征,盡量用較少的特征來(lái)反映盡可能多內(nèi)容,否則我會(huì)考慮使用正規(guī)化方法。 如果矩陣是不可逆的,(通常來(lái)說(shuō),不會(huì)出現(xiàn)這種情況),如果在Octave里,可以用偽逆函數(shù)pinv() 來(lái)計(jì)算。這種使用不同的線性代數(shù)庫(kù)的方法被稱為偽逆。即使的結(jié)果是不可逆的,但算法執(zhí)行的流程是正確的。
正規(guī)方程公式的推導(dǎo):
\theta ={{\left( {X^{T}}X \right)}^{-1}}{X^{T}}y 的推導(dǎo)過(guò)程:
J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {h_{\theta}}\left( {x^{(i)}} \right)-{y^{(i)}} \right)}^{2}}} 其中:{h_{\theta}}\left( x \right)={\theta^{T}}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
將向量表達(dá)形式轉(zhuǎn)為矩陣表達(dá)形式,則有J(\theta )=\frac{1}{2}{{\left( X\theta -y\right)}^{2}} ,其中X為m行n列的矩陣(m為樣本個(gè)數(shù),n為特征個(gè)數(shù)),\theta為n行1列的矩陣,y為m行1列的矩陣,對(duì)J(\theta )進(jìn)行如下變換
J(\theta )=\frac{1}{2}{{\left( X\theta -y\right)}^{T}}\left( X\theta -y \right)
? =\frac{1}{2}\left( {{\theta }^{T}}{{X}^{T}}-{{y}^{T}} \right)\left(X\theta -y \right)
? =\frac{1}{2}\left( {{\theta }^{T}}{{X}^{T}}X\theta -{{\theta}^{T}}{{X}^{T}}y-{{y}^{T}}X\theta -{{y}^{T}}y \right)
接下來(lái)對(duì)J(\theta )偏導(dǎo),需要用到以下幾個(gè)矩陣的求導(dǎo)法則:
-\frac{dAB}{dB}={{A}^{T}},\frac{d{{X}^{T}}AX}{dX}=2AX
(可以看:閑話矩陣求導(dǎo),
求導(dǎo)規(guī)則參考:http://files.cnblogs.com/files/leoleo/matrix_rules.pdf)
所以有:
\frac{\partial J\left( \theta \right)}{\partial \theta }=\frac{1}{2}\left(2{{X}^{T}}X\theta -{{X}^{T}}y -{}({{y}^{T}}X )^{T}-0 \right)
=\frac{1}{2}\left(2{{X}^{T}}X\theta -{{X}^{T}}y -{{X}^{T}}y -0 \right)
? ={{X}^{T}}X\theta -{{X}^{T}}y
令\frac{\partial J\left( \theta \right)}{\partial \theta }=0,
則有\theta ={{\left( {X^{T}}X \right)}^{-1}}{X^{T}}y
常用數(shù)學(xué)符號(hào)的 LaTeX 表示方法
本文數(shù)學(xué)公式使用 LaTeX
(以下內(nèi)容主要摘自“一份不太簡(jiǎn)短的 LATEX2e 介紹”)
1、指數(shù)和下標(biāo)可以用^和_后加相應(yīng)字符來(lái)實(shí)現(xiàn)。比如:

2、平方根(square root)的輸入命令為:\sqrt,n 次方根相應(yīng)地為: \sqrt[n]。方根符號(hào)的大小由LATEX自動(dòng)加以調(diào)整。也可用\surd 僅給出
符號(hào)。比如:
3、命令\overline 和\underline 在表達(dá)式的上、下方畫(huà)出水平線。比如:
4、命令\overbrace 和\underbrace 在表達(dá)式的上、下方給出一水平的大括號(hào)。
5、向量(Vectors)通常用上方有小箭頭(arrow symbols)的變量表示。這可由\vec 得到。另兩個(gè)命令\overrightarrow 和\overleftarrow在定義從A 到B 的向量時(shí)非常有用。
6、分?jǐn)?shù)(fraction)使用\frac{...}{...} 排版。一般來(lái)說(shuō),1/2 這種形式更受歡迎,因?yàn)閷?duì)于少量的分式,它看起來(lái)更好些。
7、積分運(yùn)算符(integral operator)用\int 來(lái)生成。求和運(yùn)算符(sum operator)由\sum 生成。乘積運(yùn)算符(product operator)由\prod 生成。上限和下限用^ 和_來(lái)生成,類似于上標(biāo)和下標(biāo)。
附加小菜: (小技巧)
- 分?jǐn)?shù)
(\frac{1}{m+\frac{1}{2}})
\left(\frac{1}{m+\frac{1}{2}} \right)
\left(\frac{1}{2} \right)
用\left( \right)括起來(lái)就可以把分?jǐn)?shù)包的很好,很漂亮。
- 矩陣
bmatrix:
{x}^{(2)}\text{=}\begin{bmatrix} 數(shù)字 \end{bmatrix}
{x}^{(2)}\text{=}\begin{bmatrix} 1416\\ 3\\ 2\\ 40 \end{bmatrix},
matrix:
{x}^{(2)}\text{=}\begin{matrix} 數(shù)字 \end{matrix}
{x}^{(2)}\text{=}\begin{matrix} 1416\\ 3\\ 2\\ 40 \end{matrix},
求和符號(hào)
\sum_{k=1}^N k^2
\sum_{k=1}^N k^2
\sum\limits_{i=1}^{m} k^2
\sum\limits_{i=1}^{m} k^2代碼
如果要標(biāo)記一小段行內(nèi)代碼,你可以用反引號(hào)把它包起來(lái),例如:
Use the `printf()` function.
Use theprintf()function.
一大段則使用 ```code ```
code