正規方程組(The normal equations)

2. 正規方程組

上一節的梯度下降是一種最小化成本函數J 的方法。這一節我們將介紹另一種算法也可以實現該功能且不需要使用迭代。正規方程組通過計算成本函數對每個θj 的偏導數,求出偏導爲零的點來成本函數的最小值。爲了不必寫大量的代數式和矩陣導數,讓我們約定一些矩陣計算的符號。


2.1 矩陣導數

對於一個函數f:Rm×nR ,它將m*n的矩陣映射爲一個實數,我們定義f 對A的偏導爲:

Af(A)=fA11fAm1fA1nfAmn

舉個例子,如果A=[A11A21A12A22] 是一個2*2的矩陣,函數f 定義如下:

f(A)=32A11+5A212+A21A22.

根據矩陣偏導公式可求得:

Af(A)=32A2210A12A21

我們引入矩陣的跡,寫作“tr ”。對於一個n階方陣A,它的跡是其對角線元素之和:

trA=i=1nAii

如果a是一個實數(也可看成1-by-1矩陣),有tra=a 。跡操作符有這樣的性質:如果矩陣AB 滿足AB 是方陣,則有trAB=trBA ,由此可推得:

trABC=trCAB=trBCAtrABCD=trDABC=trCDAB=trBCDA

跡操作符的下列性質也容易證明。其中AB 是方陣,a 是實數:

trAtr(A+B)traA=trAT=trA+trB=atrA

結合矩陣的跡和矩陣導數,可以給出下列公式:

AtrABATf(A)AtrABATCA|A|=BT=(Af(A))T=CAB+CTABT=|A|(A1)T(1)(2)(3)(4)

其中(4)只在矩陣A爲滿秩矩陣時成立。


2.2 二顧最小方差

瞭解了矩陣導數這一工具後,爲了實現最小化J(θ) 的目標,我們先設法將成本函數J 用向量表示。
給定一個訓練集,我們將其以m-by-n矩陣X 的形式表示,其中每一行代表一個訓練樣本:

X=(x(1))T(x(2))T(x(m))T

同時將包含所有目標值的y⃗  表示爲一個m維的列向量:

y⃗ =y(1)y(2)y(m)

因爲hθ(x(i))=(x(i))Tθ ,我們可以很容易地證明:

Xθy⃗ =(x(1))Tθ(x(m))Tθy(1)y(m)=hθ(x(1))y(1)hθ(x(m))y(m)

對於一個向量z ,有zTz=iz2i ,則:

12(Xθy⃗ )T(Xθy⃗ )=12i=1m(hθ(x(i))y(i))2=J(θ)

最後要最小化J ,我們要求解它關於θ 的導數:

θJ(θ)=θ12(Xθy⃗ )T(Xθy⃗ )=12θ(θTXTXθθTXTy⃗ y⃗ TXθ+y⃗ Ty⃗ )=12θtr(θTXTXθθTXTy⃗ y⃗ TXθ+y⃗ Ty⃗ )=12θ(trθTXTXθ2try⃗ TXθ)=12(XTXθ+XTXθ2XTy⃗ )=XTXθXTy⃗ 

爲了最小化J(θ) ,我們要設法使其偏導數爲零,這樣就可推出正規方程

XTXθ=XTy⃗ 

那麼權重矩陣θ ,應該調整爲:

θ=(XTX)1XTy⃗ 

舉個例子,硝酸鈉的溶解度試驗中,測得不同溫度x(單位:C)下,硝酸鈉溶解於水中的溶解度y%的數據如下:

溫度 0 4 10 15 21 29 36 51 68
溶解度(%) 66.7 71.0 76.3 80.6 85.7 92.9 99.4 113.6 125.1

yx 的經驗迴歸函數。

從上面的數據中可以,寫出輸入特徵矩陣X 和目標變量矩陣y⃗ 

Xy⃗ =[1014110115121129136151168]T=[66.771.076.380.685.792.999.4113.6125.1]T

代入公式θ=(XTX)1XTy⃗  中求解權重θ 的值,得:

θ0=67.5078,θ1=0.8706

於是所求的線性迴歸假設爲:

y=67.5078+0.8706x.

下圖將訓練樣本和迴歸函數繪製在一起:
線性迴歸

實現的python代碼如下:

# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np

# 輸入特徵溫度和標籤溶解度
X = np.array([0 , 4, 10, 15, 21, 29, 36, 51, 68])
y = np.array([[66.7, 71.0, 76.3, 80.6, 85.7, 92.9, 99.4, 113.6, 125.1]])
# X轉化爲n*1的矩陣
X_0 = np.ones(len(X)).astype(dtype=np.int)
X_new = np.array([X_0, X])

# 根據求參數公式theta = (X.T * X)^-1 * X.T * y求解
temp = np.matrix(np.dot(X_new, X_new.T))
ans_matrix = temp ** -1 * X_new * y.T
# 訓練後的模型,提取截距和係數
intercept = np.array(ans_matrix)[0][0]
coef = np.array(ans_matrix)[1][0]
# x從0到70,y=ax+b
lx = np.arange(0, 70)
ly = coef * lx + intercept

# 繪製擬合直線
plt.plot(lx, ly, color='blue')
# 繪製數據點和x軸y軸標題
plt.scatter(X, y, c='red', s=40, marker='o')
plt.xlabel('Temperature(C)')
plt.ylabel('Solubility(%)')
plt.show()

在特徵維度少的情況下,正規方程組的計算會比梯度下降法快很多,推薦計算線性迴歸時多使用該方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章