多項式回歸

2021-10-17 16:13:50 字數 3232 閱讀 3598

線性回歸適用於資料成線性分布的回歸問題,如果樣本是非線性分布,線性回歸就不再使用,轉而可以採用非線性模型進行回歸,比如多項式回歸

多項式回歸模型定義

與線性模型,多項式模型引入了高次項:

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​+

w1​x

+w2​

x2+w

3​x3

+...

+wn​

xn即:y=∑

i=1n

wixi

y = \sum_^w_ix^i

y=i=1∑

n​wi

​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​+

w1​x

1​+w

2​x2

​+w3

​x3​

對於房屋**同樣也可以使用房屋的體積表示,即使用多項式回歸模型表示為:

y =w

0+w1

x+w2

x2+w

3x3y = w_0 + w_1x + w_2x^2 + w_3x^3

y=w0​+

w1​x

+w2​

x2+w

3​x3

因此,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 按列拼接 ...