2. 正規方程組
上一節的梯度下降是一種最小化成本函數
2.1 矩陣導數
對於一個函數
舉個例子,如果
根據矩陣偏導公式可求得:
我們引入矩陣的跡,寫作“
如果a是一個實數(也可看成1-by-1矩陣),有
跡操作符的下列性質也容易證明。其中
結合矩陣的跡和矩陣導數,可以給出下列公式:
其中(4)只在矩陣A爲滿秩矩陣時成立。
2.2 二顧最小方差
瞭解了矩陣導數這一工具後,爲了實現最小化
給定一個訓練集,我們將其以m-by-n矩陣
同時將包含所有目標值的
因爲
對於一個向量
最後要最小化
爲了最小化
那麼權重矩陣
舉個例子,硝酸鈉的溶解度試驗中,測得不同溫度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 |
求
從上面的數據中可以,寫出輸入特徵矩陣
代入公式
於是所求的線性迴歸假設爲:
下圖將訓練樣本和迴歸函數繪製在一起:
實現的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()
在特徵維度少的情況下,正規方程組的計算會比梯度下降法快很多,推薦計算線性迴歸時多使用該方法。