机器学习 一元非线性回归模型

实际问题中,变量之间常常不是直线。这时,通常是选配一条比较接近的曲线,通过变量替换把非线性方程加以线性化,然后按照线性回归的方 法进行拟合。

#常见的可转化一元线性回归的模型#

  • 倒幂函数曲线 y = a + b ⋅ 1 x y=a+b \cdot \dfrac{1}{x} y=a+bx1
    x ′ = 1 x {x}'=\dfrac{1}{x} x=x1, 则得 y = a + b ⋅ x ′ y=a+b \cdot {x}' y=a+bx.
  • 双曲线 1 y = a + b ⋅ 1 x \dfrac{1}{y}=a+b \cdot \dfrac{1}{x} y1=a+bx1
    x ′ = 1 x , y ′ = 1 y {x}'=\dfrac{1}{x}, {y}'=\dfrac{1}{y} x=x1,y=y1, 则得 y ′ = a + b ⋅ x ′ {y}'=a+b \cdot {x}' y=a+bx.
  • 幂函数曲线 y = d ⋅ x b y=d \cdot x^b y=dxb
    y ′ = I n y , x ′ = I n x , a = I n d {y}'=Iny, {x}'=Inx, a=Ind y=Iny,x=Inx,a=Ind, 则得 y ′ = a + b x ′ {y}'=a+b{x}' y=a+bx.
  • 指数曲线 y = d ⋅ e b x y=d \cdot e^{bx} y=debx
    y ′ = I n y , a = I n d {y}'=Iny, a=Ind y=Iny,a=Ind, 则得 y ′ = a + b x {y}'=a+bx y=a+bx.
  • 倒指数曲线 y = d ⋅ e b x y=d \cdot e^{\dfrac{b}{x}} y=dexb
    y ′ = I n y , x ′ = 1 x , a = I n d {y}'=Iny, {x}'=\dfrac{1}{x}, a=Ind y=Iny,x=x1,a=Ind, 则得 y ′ = a + b x ′ {y}'=a+b{x}' y=a+bx.

综上所述,许多曲线都可以通过变换化为直线,于是可以按直线拟合的方法来处理。对变换后的数据进行线性回归分析,之后将得到的结果再代回原方程。因而,回归分析是对变换后的数据进行的,所得结果仅对变换后的数据来说是最佳拟合,当再变换回原数据坐标时,所得的回归曲线严格地说并不是最佳拟合,不过,其拟合程度通常是令人满意的。

#一元多项式回归模型#
不是所有的一元非线性函数都能转换成一元线性方程,但任何复杂的一元连续函数都可用高阶多项式近似表示,因此对于那些较难直线化的一元函数,可用下式来拟合。

分析
y ^ = b 0 + b 1 x + b 2 x 2 + ⋯ + b n x n \hat{y}=b_{0}+b_{1}x+b_{2}x^2+\cdots+b_{n}x^n y^=b0+b1x+b2x2++bnxn
如果令 X 1 = x , X 2 = x 2 , ⋯   , X n = x n X_{1}=x,X_{2}=x^2,\cdots,X_{n}=x^n X1=x,X2=x2,,Xn=xn,则上式可以转化为多元线性方程。
y ^ = b 0 + b 1 X 1 + b 2 X 2 + ⋯ + b n X n \hat{y}=b_{0}+b_{1}X_{1}+b_{2}X_{2}+\cdots+b_{n}X_{n} y^=b0+b1X1+b2X2++bnXn
这样就可以用多元线性回归分析求出系数 b 0 , b 1 , ⋯   , b n b_{0},b_{1},\cdots,b_{n} b0,b1,,bn。(求解方法是最小二乘法)

虽然多项式的阶数越高,回归方程与实际数据拟合程度越高,但阶数越高,回归计算过程中的舍入误差的积累也越大,所以当阶数 n n n过高时,回归方程的精确度反而会降低,甚至得不到合理的结果。故一般取 n = 3 ∼ 4 n=3\sim4 n=34

下面我们看一个例子。

已知某种半成品在生产过程中的废品率 y y y与它的某种化学成分 x x x有关,试验数据如下表所示。试根据散点图特点选配一条合适的拟合曲线关系。
| x x x | 34 | 36 | 37 | 38 | 39 | 39 | 39 | 40 | 40 | 41 | 42 | 43 | 43 | 45 | 47 | 48 |
| ------------- |:-------------? -----?
| y y y | 1.30 | 1.00 | 0.73 | 0.90 | 0.81 | 0.70 | 0.60 | 0.50 | 0.44 | 0.56 | 0.30 | 0.42 | 0.35 | 0.40 | 0.41 | 0.60 |
解:二次多项式回归模型为
y = b 0 + b 1 x + b 2 x 2 + ε y=b_{0}+b_{1}x+b_{2}x^2+\varepsilon y=b0+b1x+b2x2+ε
X 1 = x , X 2 = x 2 X_{1}=x, X_{2}=x^2 X1=x,X2=x2,则上式可以转化为二元线性方程:
y ^ = b 0 + b 1 X 1 + b 2 X 2 \hat{y }=b_{0}+b_{1}X_{1}+b_{2}X_{2} y^=b0+b1X1+b2X2
##参数估计:选用最小二乘法##
根据表中数据,得
β ^ = ( b 0 b 1 b 2 ) = ( X T X ) − 1 X T Y \hat{\beta }=\begin{pmatrix}b_{0}\\ b_{1}\\ b_{2}\end{pmatrix}=\left(X^TX\right)^{-1}X^TY β^=b0b1b2=(XTX)1XTY
M a t l a b Matlab Matlab程序求得
β ^ = ( 18.2642 − 0.8097 0.0092 ) \hat{\beta }=\begin{pmatrix}18.2642\\-0.8097\\0.0092\end{pmatrix} β^=18.26420.80970.0092
所以回归方程为
y = 18.2642 − 0.8097 x + 0.0092 x 2 y=18.2642-0.8097x+0.0092x^2 y=18.26420.8097x+0.0092x2
##方差分析表及相关性检验##
假设 H 0 : b 1 = b 2 = 0 H_{0}: b_{1}=b_{2}=0 H0:b1=b2=0
由方差检验,及 M a t l a b Matlab Matlab程序求得

机器学习 一元非线性回归模型_第1张图片

由于 F = 48.2196 > F 0.01 ( 2 , 13 ) = 6.7010 F=48.2196>F_{0.01}(2,13)=6.7010 F=48.2196>F0.01(2,13)=6.7010,说明回归方程在 α = 0.01 \alpha=0.01 α=0.01水平上是高度显著的。
下面是求解的一些统计量:
机器学习 一元非线性回归模型_第2张图片
拟合的图像如下图所示。
机器学习 一元非线性回归模型_第3张图片
显然,从拟合的图像可以看出,拟合的效果比较好。
##Matlab代码

clear all;
clc

X1=[34;36;37;38;39;39;39;40;40;41;42;43;43;45;47;48];
x1=X1;
x2=X1.*X1;
X=[ones([size(X1,1),1]),x1,x2];
Y=[1.30;1.00;0.73;0.90;0.81;0.70;0.60;0.50;0.44;0.56;0.30;0.42;0.35;0.40;0.41;0.60];

beta=inv((X'*X))*X'*Y;  %回归系数
disp('偏回归系数');
disp(beta);

%回归分析
z1=X;
z1(:,1)=[];
n=size(Y,1);    %观察单位数
m=size(X,2);    
p=m-1;          %自变量个数

alpha=0.05;  
yhat=X*beta;


%方差分析表(F检验)
SSR=(yhat-mean(Y))'*(yhat-mean(Y));  %回归平方和
SSE=(yhat-Y)'*(yhat-Y);        %残差平方和
SST=(Y-mean(Y))'*(Y-mean(Y));    %总平方和
Fb=(SSR/(m-1))/(SSE/(n-m));       %显著性检验的统计量
Fa=finv(1-0.01,2,13);
Falpha=2*(1-fcdf(abs(Fb),m-1,n-m));   %P值

table1=cell(4,7);    %创建元胞
table1(1,:)={'模型','偏差平方和','自由度','均方','F值','Fa','F.Sig'};
table1(2,1:7)={'回归',SSR,m-1,SSR/(m-1),Fb,Fa,Falpha};
table1(3,1:7)={'残差',SSE,n-m,SSE/(n-m),[],[],[]};
table1(4,1:3)={'总和',SST,n-1};

%决定系数检验
R2=SSR/SST;   %决定系数
R=sqrt(R2);   %复相关系数
disp('复相关系数');
disp(R);
Sy=sqrt(SSE/(n-m));      %剩余标准差
disp('估计的标准误差');
disp(Sy);

disp('方差分析表');
disp(table1);

xl=min(X1);xr=max(X1);
xx=linspace(xl,xr,1000);
yy=polyval(fliplr(beta'),xx);
plot(X1,Y,'k*',xx,yy,'-k');

你可能感兴趣的:(机器学习)