回归问题-多项式回归

多项式回归(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

发布了56 篇原创文章 · 获赞 29 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/foneone/article/details/96843129