系列博客,原文在筆者所維護的github上:https://aka.ms/beginnerAI,
點擊star加星不要吝嗇,星越多筆者越努力。python
英文名是 Normal Equations。git
對於線性迴歸問題,除了前面提到的最小二乘法能夠解決一元線性迴歸的問題外,也能夠解決多元線性迴歸問題。github
對於多元線性迴歸,能夠用正規方程來解決,也就是獲得一個數學上的解析解。它能夠解決下面這個公式描述的問題:網絡
\[y=a_0+a_1x_1+a_2x_2+\dots+a_kx_k \tag{1}\]函數
在作函數擬合(迴歸)時,咱們假設函數H爲:spa
\[h(w,b) = b + x_1 w_1+x_2 w_2+...+x_n w_n \tag{2}\]code
令\(b=w_0\),則:orm
\[h(w) = w_0 + x_1 \cdot w_1 + x_2 \cdot w_2+...+ x_n \cdot w_n\tag{3}\]get
公式3中的x是一個樣本的n個特徵值,若是咱們把m個樣本一塊兒計算,將會獲得下面這個矩陣:博客
\[H(w) = X \cdot W \tag{4}\]
公式5中的X和W的矩陣形狀以下:
\[ X = \begin{pmatrix} 1 & x_{1,1} & x_{1,2} & \dots & x_{1,n} \\ 1 & x_{2,1} & x_{2,2} & \dots & x_{2,n} \\ \dots \\ 1 & x_{m,1} & x_{m,2} & \dots & x_{m,n} \end{pmatrix} \tag{5} \]
\[ W= \begin{pmatrix} w_0 \\ w_1 \\ \dots \\ w_n \end{pmatrix} \tag{6} \]
而後咱們指望假設函數的輸出與真實值一致,則有:
\[H(w) = X \cdot W = Y \tag{7}\]
其中,Y的形狀以下:
\[ Y= \begin{pmatrix} y_1 \\ y_2 \\ \dots \\ y_m \end{pmatrix} \tag{8} \]
直觀上看,W = Y/X,可是這裏三個值都是矩陣,而矩陣沒有除法,因此須要獲得X的逆矩陣,用Y乘以X的逆矩陣便可。可是又會遇到一個問題,只有方陣纔有逆矩陣,而X不必定是方陣,因此要先把左側變成方陣,就可能會有逆矩陣存在了。因此,先把等式兩邊同時乘以X的轉置矩陣,以便獲得X的方陣:
\[X^T X W = X^T Y \tag{9}\]
其中,\(X^T\)是X的轉置矩陣,\(X^T X\)必定是個方陣,而且假設其存在逆矩陣,把它移到等式右側來:
\[W = (X^T X)^{-1}{X^T Y} \tag{10}\]
至此能夠求出W的正規方程。
咱們仍然使用均方差損失函數:
\[J(w,b) = \sum (z_i - y_i)^2 \tag{11}\]
把b看做是一個恆等於1的feature,並把z=XW計算公式帶入,並變成矩陣形式:
\[J(w) = \sum (x_i w_i -y_i)^2=(XW - Y)^T \cdot (XW - Y) \tag{12}\]
對w求導,令導數爲0,就是W的最小值解:
\[ \begin{aligned} {\partial J(w) \over \partial w} &= {\partial \over \partial w}[(XW - Y)^T \cdot (XW - Y)] \\ &={\partial \over \partial w}[(X^TW^T - Y^T) \cdot (XW - Y)] \\ &={\partial \over \partial w}[(X^TXW^TW -X^TW^TY - Y^TXW + Y^TY)] \end{aligned} \tag{13} \]
求導後:
第一項的結果是:\(2X^TXW\)
第二項和第三項的結果都是:\(X^TY\)
第四項的結果是:0
再令導數爲0:
\[ J'(w)=2X^TXW - 2X^TY=0 \tag{14} \]
\[ X^TXW = X^TY \tag{15} \]
\[ W=(X^TX)^{-1}X^TY \tag{16} \]
結論和公式10同樣。
以上推導的基本公式能夠參考第0章的公式60-69。
逆矩陣\((X^TX)^{-1}\)可能不存在的緣由是:
以上兩點在咱們這個具體的例子中都不存在。
咱們把表5-1的樣本數據帶入方程內。根據公式(5),咱們應該創建以下的X,Y矩陣:
\[ X = \begin{pmatrix} 1 & 10.06 & 60 \\ 1 & 15.47 & 74 \\ 1 & 18.66 & 46 \\ 1 & 5.20 & 77 \\ \dots \\ \end{pmatrix} \tag{17} \]
\[ Y= \begin{pmatrix} 302.86 \\ 393.04 \\ 270.67 \\ 450.59 \\ \dots \\ \end{pmatrix} \tag{18} \]
根據公式(10):
\[W = (X^T X)^{-1}{X^T Y} \tag{10}\]
if __name__ == '__main__': reader = SimpleDataReader() reader.ReadData() X,Y = reader.GetWholeTrainSamples() num_example = X.shape[0] one = np.ones((num_example,1)) x = np.column_stack((one, (X[0:num_example,:]))) a = np.dot(x.T, x) # need to convert to matrix, because np.linalg.inv only works on matrix instead of array b = np.asmatrix(a) c = np.linalg.inv(b) d = np.dot(c, x.T) e = np.dot(d, Y) #print(e) b=e[0,0] w1=e[1,0] w2=e[2,0] print("w1=", w1) print("w2=", w2) print("b=", b) # inference z = w1 * 15 + w2 * 93 + b print("z=",z)
w1= -2.0184092853092226 w2= 5.055333475112755 b= 46.235258613837644 z= 486.1051325196855
咱們獲得了兩個權重值和一個偏移值,而後獲得房價預測值z=486萬元。
至此,咱們獲得瞭解析解。咱們能夠用這個作爲標準答案,去驗證咱們的神經網絡的訓練結果。
ch05, Level1