MATLAB实现多元非线性回归

简单多元非线性回归算例

现有以下数据

i x1 x2 x3 y
1 1.1 2 3.2 10.1
2 1 2 3.2 10.2
3 1.2 1.8 3 10
4 1.1 1.9 2.9 10.1
5 0.9 2.1 2.9 10

假如有以下模型:

y = a x 1 + b x 2 + c x 3 2 y=ax_1+bx_2+cx_3^2 y=ax1+bx2+cx32

可以基于最小二乘法原理建立如下法方程组,其解则是上述系数.
∑ j = 0 n ( φ j , φ k ) a j = ( f , φ k ) , k = 0 , 1 , … n \sum_{j=0}^{n}(φ_j,φ_k ) a_j=(f,φ_k ),k=0,1,…n j=0n(φj,φk)aj=(f,φk),k=0,1,n
其中 n = 2 , φ 0 = x 1 , φ 1 = x 2 , φ 2 = x 3 , f = y n=2, φ_0=x1,φ_1=x2,φ_2=x3,f=y n=2,φ0=x1φ1=x2φ2=x3,f=y.
MATLAB代码如下

x1=[1.1 1 1.2 1.1 0.9]';
x2=[2 2 1.8 1.9 2.1]';
x3=[3.2 3.2 3 2.9 2.9]';
y=[10.1 10.2 10 10.1 10]';
G=[x1,x2,x3.^2];
z=G\y;

得到 z = ( 3.296 , 3.4404 , − 0.0141 ) T z=(3.296, 3.4404, -0.0141)^T z=(3.296,3.4404,0.0141)T
所以有所以有
y = 3.296 x 1 + 3.4404 x 2 − 0.0141 x 3 2 y=3.296x_1+3.4404x_2-0.0141x_3^2 y=3.296x1+3.4404x20.0141x32

或者可以调用MATLAB中的nlinfit函数。

[beta,r]=nlinfit(X,y,myfun,beta0);

其中输入参数X是自变量,y是因变量,myfun 是函数模型,beta0是初始迭代系数向量,返回值beta是模型的系数向量,r是每个点的残差。
先定义myfun

function y=myfun(beta,x)
y=beta(1)*x(:,1)+beta(2)*x(:,2)+beta(3)*x(:,3).^2;

然后主程序

x1=[1.1 1 1.2 1.1 0.9]';
x2=[2 2 1.8 1.9 2.1]';
x3=[3.2 3.2 3 2.9 2.9]';
y=[10.1 10.2 10 10.1 10]';
X=[x1,x2,x3];
beta0=[1,1,1];
[beta,r]=nlinfit(X,y,'myfun',beta0);

得到 b e t a = ( 3.296 , 3.4404 , − 0.0141 ) T beta=(3.296, 3.4404, -0.0141)^T beta=(3.296,3.4404,0.0141)T
所以有
y = 3.296 x 1 + 3.4404 x 2 − 0.0141 x 3 2 y=3.296x_1+3.4404x_2-0.0141x_3^2 y=3.296x1+3.4404x20.0141x32
这边只涉及到如何获得回归方程中的系数,至于回归方程的优劣性判断,暂不做讨论。

你可能感兴趣的:(数值分析)