線性回歸適用於資料成線性分布的回歸問題,如果樣本是非線性分布,線性回歸就不再使用,轉而可以採用非線性模型進行回歸,比如多項式回歸
多項式回歸模型定義
與線性模型,多項式模型引入了高次項:
y =w
0+w1
x+w2
x2+w
3x3+
...+
wnxn
y = w_0 + w_1x + w_2x^2 + w_3x^3 + ... + w_nx^n
y=w0+
w1x
+w2
x2+w
3x3
+...
+wn
xn即:y=∑
i=1n
wixi
y = \sum_^w_ix^i
y=i=1∑
nwi
xi
多項式回歸模型與線性模型的關係1,
x2,x
3x_1,x_2,x_3
x1,x2
,x3
三個特徵,分別表示房子的長,寬,高,則房屋**可以使用線性回歸模型表示為:
y =w
0+w1
x1+w
2x2+
w3x3
y = w_0 + w_1x_1 + w_2x_2 + w_3x_3
y=w0+
w1x
1+w
2x2
+w3
x3
對於房屋**同樣也可以使用房屋的體積表示,即使用多項式回歸模型表示為:
y =w
0+w1
x+w2
x2+w
3x3y = w_0 + w_1x + w_2x^2 + w_3x^3
y=w0+
w1x
+w2
x2+w
3x3
因此,n元一次線性模型和一元n次多項式模型一定程度上可以相互轉換。
對於多項式回歸模型同樣使用梯度下降對損失函式進行優化,尋找到最優的一組引數w0,
w1,w
2,..
,wnw_0, w_1, w_2, .. , w_n
w0,w1
,w2
,..
,wn
就可以將一元n次多項式轉換為n元一次多項式進而求線性回歸。
多項式回歸簡單實現(sklearn)
import numpy as np
import sklearn.linear_model as lm
import sklearn.metrics as sm
import matplotlib.pyplot as plt
import sklearn.pipeline as pl # 管線模組
import sklearn.preprocessing as sp
train_x, train_y =
,with
open
('d:\python\data\poly_sample.txt'
,'r'
)as f:
for line in f.readlines():
data =
[float
(substr)
for substr in line.split(
',')]:
-1])
-1])
# 將資料轉換為numpy陣列格式
train_x = np.array(train_x)
train_y = np.array(train_y)
# 鏈結兩個模型(可以看出,實現此多項式回歸正是基於線性回歸模型擴充套件得到)
model = pl.make_pipeline(sp.polynomialfeatures(3)
, lm.linearregression())
# 利用資料訓練多項式回歸器
model.fit(train_x, train_y)
# 根據訓練模型**輸出
pred_y = model.predict(train_x)
# 評估模型(使用r2係數)
score_r2 = sm.r2_score(train_y, pred_y)
print
('score_r2: %f'
%score_r2)
# score_r2: 0.903666
# 測試模型
test_x = np.linspace(train_x.
min(
), train_x.
max(),
1000
)pred_test_y = model.predict(test_x.reshape(-1
,1))
print
('--------視覺化--------'
)plt.figure(
'polynomial regression'
, facecolor=
'gray'
)plt.title(
'polynomial regression'
, fontsize=18)
plt.xlabel(
'x', fontsize=18)
plt.ylabel(
'y', fontsize=18)
plt.tick_params(labelsize=10)
plt.grid(linestyle=
':')
plt.scatter(train_x, train_y, c=
'red'
, alpha=
0.8, s=
60, label=
'sample'
)plt.plot(test_x, pred_test_y, c=
'blue'
, label=
'regression'
)plt.legend(
)plt.show(
)
多項式回歸
import numpy as np import matplotlib.pyplot as plt x np.random.uniform 3,3,size 100 x x.reshape 1,1 y 0.5 x 2 x 2 np.random.normal 0,1,100 plt.scatter...
多項式回歸
多項式回歸 import torch import numpy defmake features x 獲取 x,x 2,x 3 的矩陣 x x.unsqueeze 1 將一維資料變為 n,1 二維矩陣形式 return torch.cat x i for i in range 1 4 1 按列拼接 ...
多項式回歸
多項式回歸 import torch import numpy defmake features x 獲取 x,x 2,x 3 的矩陣 x x.unsqueeze 1 將一維資料變為 n,1 二維矩陣形式 return torch.cat x i for i in range 1 4 1 按列拼接 ...