迴歸問題-多項式迴歸

多項式迴歸(Polynomial Regression)

區分一下多元迴歸多項式迴歸的區別:

多元迴歸可以分爲:多元線性迴歸和多元非線性迴歸,多元迴歸指的是:一個因變量(y)與多個自變量(x_{1},x_{2},...,x_{n})之間的關係。其中若y與x_{1},x_{2},...,x_{n}之間關係是線性的,那麼就叫做多元線性迴歸,可以用下面的公式表示多元線性迴歸:        

                                                                y = a_{1}x_{1}+a_{2}x_{2}+...a_{n}x_{n}+b 

其實,我們常說的線性迴歸通常都是這種形式。

那麼如果y與x_{1},x_{2},...,x_{n}之間不是線性的,而是非線性的關係,這時應該怎麼辦?解決辦法:將非線性變成線性關係

解決辦法應該是:

(1)降低維度:可以利用PCA等方法降低自變量維度,捨棄一些因素後,再利用線性關係解決

(2)做一些變量變換將非線性的轉成線性的,其中多項式迴歸就是其中一種

多項式迴歸模型:y=\beta_{0}+\beta_{1} x+\beta_{2} x^{2}+\ldots+\beta_{k} x^{k}+\varepsilon

即可以看作:x_{1}=x, x_{2}=x^{2}, \ldots, x_{k}=x^{k}

這樣就可以轉成多元線性迴歸:y=\beta_{0}+\beta_{1} x_{1}+\beta_{2} x_{2}+\ldots+\beta_{k} x_{k}+\varepsilon利用多元線性迴歸的方法解決

補充:(1)線性關係與非線性關係:線性關係指的是自變量與因變量之間關係可以用一條直線,即變量的一次方的形式表示出來;(2)線性相關與非線性相關:指的是自變量中每個因素之間的關係,數學定義如下:

向量x_{1}x_{2}x_{3},如果存在一組不全爲零的數k1,k2,k3,使得 k_{1}x_{1}+k_{2}x_{2}+k_{3}x_{3}=0,那麼這三個向量是線性相關的。如果只有k1=k2=k3=0時,k_{1}x_{1}+k_{2}x_{2}+k_{3}x_{3}=0等式才成立,那麼這三個向量就是線性無關的。

(3)線性不可分與線性可分:能否用一個平面或者直線將兩類不同的點分隔開,如果能夠分隔開則是線性可分的,反之爲線性不可分。

簡而言之,多項式迴歸是解決因變量與自變量之間的非線性關係的迴歸方法,通常做法是將非線性關係通過平方、冪指數等方式將非線性關係轉成線性關係從而求解。所以多項式迴歸可以稱作可化爲線性迴歸的曲線迴歸,除了多項式型外,以下也是常見的轉化方式。

(1)雙曲線型:y=a+\frac{b}{x},令t=\frac{1}{x},則y=a+bt

(2)冪函數型:y=a+x^{b},兩邊取對數,ln_{y}=ln_{a}+bln_{x},令z=ln_{y},t=ln_{x},則z=ln_{a}+bt

(3)指數型:y=a\cdot e^{bx},兩邊取對數,ln_{y}=ln_{a}+bx,令z=ln_{y},a_{0}=ln_{a},則z=a_{0}+bx

(4)S型曲線:y=\frac{1}{a+b e^{-x}},令\frac{1}{y}=a+b e^{-x}z=\frac{1}{y},則y=a+bx

實現

利用sklearn中的PolynomialFeatures來構造多項式特徵,再利用線性迴歸模型去做(sklearn中沒有直接封裝好的能用的多項式迴歸模型)

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt 
##構造數據集
x = np.linspace(-3,3,100) #產生100個0,1之間的隨機數
X = x.reshape(-1,1)
y = x**3 + np.random.normal(0,0.5,size = 100)
####線性模型擬合#####
model = LinearRegression()
model.fit(X,y)
y_predict = model.predict(X)

#######多項式擬合#######
Polynomial = PolynomialFeatures(degree = 3,\
                interaction_only=False,include_bias=False)
#interaction_only 默認值False
#include_bias 默認值 False
x_poly = Polynomial.fit_transform(X)
model.fit(x_poly,y)
y_poly_pre = model.predict(x_poly)

plt.scatter(X, y,color='blue',label='train_set')
plt.plot(X,y_predict,color = 'yellow',label='linear',linewidth = 4)
plt.plot(X,y_poly_pre,color = 'red',label='Polynomial',linewidth = 4)
plt.legend()
plt.show()

對比圖:

                                            

其中PolynomialFeatures類詳解可參考:https://blog.csdn.net/weixin_39175124/article/details/79475336

發佈了60 篇原創文章 · 獲贊 36 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章