现有以下数据
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=0∑n(φ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.4404x2−0.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.4404x2−0.0141x32
这边只涉及到如何获得回归方程中的系数,至于回归方程的优劣性判断,暂不做讨论。