單變量線性回歸
在這個文檔中將會介紹單變量線性回歸模型的建立和公式推倒,通過實例的代碼實現算法來加深理解
一.模型推導
1-1 線性回歸模型
設定樣本描述為
\[x=(x_1;x_2;...;x_d) \]
預測函數為
\[f(\boldsymbol x)=w_1x_1+w_2x_2+...+w_dx_d+b \]
一般向量形式
\[f(\boldsymbol x)=\boldsymbol w^Tx+b \]
\[\boldsymbol w=(w_1;w_2;...;w_d) \]
1-2 單變量線性回歸
最小二乘法模型
單變量線性回歸中,樣本的特征只有一個,所以回歸模型為
\[f(\boldsymbol x)=wx+b \tag{1} \]
為了使得模型預測的性能更好,這里使用均方誤差最小化進行評估
\[E_{(w,b)}= \frac{1}{m} \sum^m_{i=1}(f(x_i)-y_i)^2=\frac{1}{m}\sum^m_{i=1}(y_i-wx_i-b)^2 \tag{2} \\ \]
為了讓均方誤差最小,就等價於下式
\[(w^*,b^*)=min\sum^m_{i=1}(f(x_i)-y_i)^2=min\sum^m_{i=1}(y_i-wx_i-b)^2 \]
誤差分別對w和b求導,得
\[\begin{align} \frac{\partial E_{(w,b)}}{\partial w}=& 2\left(w\sum^m_{i=1}x_i^2 - \sum^m_{i=1}(y_i-b)x_i\right) \tag{3} \\ \frac{\partial E_{(w,b)}}{\partial b}=& 2\left(mb - \sum^m_{i=1}(y_i-wx_i)\right) \tag{4} \end{align} \]
令(3)和(4)為零,聯立解方程,詳細步驟如下
\[\left\{ \begin{array}{} \frac{\partial E_{(w,b)}}{\partial w}=0 \\ \frac{\partial E_{(w,b)}}{\partial b}=0 \end{array} \right. \]
- 先令(4)為零,解得
\[b=\frac{1}{m}\sum^m_{i=1}(y_i-wx_i) \tag{5} \]
- 再將(5)式代入(3)得
\[\begin{align} \frac{\partial E_{(w,b)}}{\partial w} &= 2\left(w\sum^m_{i=1}x_i^2 - \sum^m_{i=1}(y_i-b)x_i\right) \\ &= 2\left(w\sum^m_{i=1}x_i^2 - \sum^m_{i=1}\left(y_i-\frac{1}{m}\sum^m_{i=1}(y_i-wx_i)\right)x_i\right) \\ &= 2\left(w\sum^m_{i=1}x_i^2 - \sum^m_{i=1}\left(y_i-\frac{1}{m}\sum^m_{i=1}y_i + \frac{w}{m}\sum^m_{i=1}x_i\right)x_i\right) \\ &= 2\left(w\sum^m_{i=1}x_i^2 - \sum^m_{i=1}\left(y_i-\frac{1}{m}\sum^m_{i=1}y_i\right)x_i - \frac{w}{m}\sum^m_{i=1}(\sum^m_{i=1}x_i)x_i\right) \\ &= 2\left(w\sum^m_{i=1}x_i^2 - \sum^m_{i=1}\left(x_i-\frac{1}{m}\sum^m_{i=1}x_i\right)y_i - \frac{w}{m}(\sum^m_{i=1}x_i)^2\right) \\ &= 2\left(w \left(\sum^m_{i=1}x_i^2 - \frac{1}{m}(\sum^m_{i=1}x_i)^2 \right) - \sum^m_{i=1}\left(x_i-\frac{1}{m}\sum^m_{i=1}x_i\right)y_i \right) = 0 \\ \end{align} \]
\[w =\frac{\sum^m_{i=1}\left(x_i-\frac{1}{m}\sum^m_{i=1}x_i\right)y_i} {\sum^m_{i=1}x_i^2 - \frac{1}{m}(\sum^m_{i=1}x_i)^2} = \frac{\sum^m_{i=1}y_i\left(x_i- \overline{x} \right)} {\sum^m_{i=1}x_i^2 - \frac{1}{m}(\sum^m_{i=1}x_i)^2} \tag{6} \]
因此得到最后的公式(5)和(6),即可求解出單變量線性回歸模型的參數。
#### 梯度下降法
在吳恩達的機器學習課程中,有說明:在特征值的數量低於1萬的時候,使用正規方程比較合適。大於1萬的時候,使用梯度下降比較合適。 在后面的機器學習中,更多的還是使用梯度下降算法。
(梯度下降相關內容,后續補上)
二、實例代碼
例題1
假設存在已知的輸入數據
X = [x1, x2, ... , x10] = [1, 2, 4, 5, 6, 7, 8, 9, 10]
已知的輸出的數據
y = [20.52, 27.53, 29.84, 36.92, 38.11, 37.21, 40.96, 46.37, 49.78, 50.22]
求解以下問題
- 利用最小二乘法求解出線性模型 y = wx +b 中的參數w和b,並計算出訓練均方誤差E
- 在得到最小二乘模型的基礎上,若模型輸入新數據x'=[11, 12, 13],請計算出模型的預測值y'
- 若模型輸入新數據x'=[11, 12, 13],實際測量值y=[52.38, 55,66, 58.31]
代碼:Matlab
x = [1 2 3 4 5 6 7 8 9 10];
y = [20.52 27.53 29.84 36.92 38.11 37.21 40.96 46.37 49.78 50.22];
%% 根據上面的公式(5)(6)計算w和b
w = sum(y.*(x-mean(x)))/(sum(x.^2)-1/10*(sum(x))^2);
b = 1/10*sum(y-w*x);
%% 繪制圖形
plot(x,y,'o');hold on
plot(x,w*x+b);hold on
legend('native', 'predict', 'Location', 'NorthWest')
%% 根據公式(2)計算訓練誤差
Et = sum((w*x+b-y).^2)/10
%% 輸入新的數據,進行預測
x_ = [11 12 13];
y_ = w*x_+b
ym = [52.38 55.66 58.31];
figure;
plot(x_,y_,'r-.',x_,ym,'b');hold on
legend('predict', 'native')
Ep = sum((y_-ym).^2)/3
運行結果
實際數據和預測數據
輸入新的數據和預測值
### 代碼:Python
這里再次強調一下上面的公式,可以更好結合代碼
\[\begin{align} w&=\frac{\sum^m_{i=1}y_i\left(x_i- \overline{x} \right)} {\sum^m_{i=1}x_i^2 - \frac{1}{m}(\sum^m_{i=1}x_i)^2} \\ b&=\frac{1}{m}\sum^m_{i=1}(y_i-wx_i) \end{align} \]
import numpy as np
import math
import matplotlib.pyplot as plt
%matplotlib inline
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.array([20.52, 27.53, 29.84, 36.92, 38.11, 37.21, 40.96, 46.37, 49.78, 50.22])
def fit(x, y):
w = 0.0
b = 0.0
if(len(x) != len(y) or len(x) == 0):
print('input data is error!')
return w,b
w = np.sum(y*(x - np.mean(x)))/(np.sum(x*x) - (1/len(x))*pow(np.sum(x), 2))
b = (1/len(x))*np.sum(y - w*x)
return w,b
w, b = fit(x, y)
print('w :', w)
print('b :', b)
y_ = w*x +b
x_new = np.array([11, 12, 13])
y_new = np.array([52.38, 55.66, 58.31])
y_new_ = w*x_new + b
# 誤差
E = np.sum(pow((y - y_), 2))/len(x)
E_new = np.sum(pow((y_new - y_new_), 2))/len(x_new)
print('E :',E)
print('E_:',E_new)
# 繪圖
plt.subplot(121)
plt.scatter(x, y, label='native')
plt.plot(x, y_, 'red', label='predict')
plt.legend(loc='best')
plt.subplot(122)
plt.plot(x_new, y_new, label='native')
plt.plot(x_new, y_new_, '-.', color = 'r', label='predict')
plt.legend(loc='best')
plt.show()
運行結果
三、總結
- 主要介紹了單變量線性回歸的原理,公式推倒和代碼實現
- 為了對比驗證結果是否正常,采用的兩種編程語言,后面更多的會使用Python
- 后續繼續整理多變量線性回歸