MATLAB实例:多元函数拟合(线性与非线性)
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
更多请看:随笔分类 - MATLAB作图
之前写过一篇博文,是关于一元非线性曲线拟合,自定义曲线函数。
现在用最小二乘法拟合多元函数,实现线性拟合与非线性拟合,其中非线性拟合要求自定义拟合函数。
下面给出三种拟合方式,第一种是多元线性拟合(回归),第二三种是多元非线性拟合,实际中第二三种方法是一个意思,任选一种即可,推荐第二种拟合方法。
1. MATLAB程序
fit_nonlinear_data.m
1function [beta, r]=fit_nonlinear_data(X, Y, choose) 2% Input: X 自变量数据(N, D), Y 因变量(N, 1),choose 1-regress, 2-nlinfit 3-lsqcurvefit 3if choose==1 4 X1=[ones(length(X(:, 1)), 1), X]; 5 [beta, bint, r, rint, states]=regress(Y, X1) 6 % 多元线性回归 7 % y=beta(1)+beta(2)*x1+beta(3)*x2+beta(4)*x3+... 8 % beta—系数估计 9 % bint—系数估计的上下置信界 10 % r—残差 11 % rint—诊断异常值的区间 12 % states—模型统计信息 13 rcoplot(r, rint) 14 saveas(gcf,sprintf('线性曲线拟合_残差图.jpg'),'bmp'); 15elseif choose==2 16 beta0=ones(7, 1); 17 % 初始值的选取可能会导致结果具有较大的误差。 18 [beta, r, J]=nlinfit(X, Y, @myfun, beta0) 19 % 非线性回归 20 % beta—系数估计 21 % r—残差 22 % J—雅可比矩阵 23 [Ypred,delta]=nlpredci(@myfun, X, beta, r, 'Jacobian', J) 24 % 非线性回归预测置信区间 25 % Ypred—预测响应 26 % delta—置信区间半角 27 plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r'); 28 saveas(gcf,sprintf('非线性曲线拟合_1.jpg'),'bmp'); 29elseif choose==3 30 beta0=ones(7, 1); 31 % 初始值的选取可能会导致结果具有较大的误差。 32 [beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@myfun,beta0,X,Y) 33 % 在最小二乘意义上解决非线性曲线拟合(数据拟合)问题 34 % beta—系数估计 35 % resnorm—残差的平方范数 sum((fun(x,xdata)-ydata).^2) 36 % r—残差 r=fun(x,xdata)-ydata 37 % J—雅可比矩阵 38 [Ypred,delta]=nlpredci(@myfun, X, beta, r, 'Jacobian', J) 39 plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r'); 40 saveas(gcf,sprintf('非线性曲线拟合_2.jpg'),'bmp'); 41end 42end 43 44 45function yy=myfun(beta,x) %自定义拟合函数 46yy=beta(1)+beta(2)*x(:, 1)+beta(3)*x(:, 2)+beta(4)*x(:, 3)+beta(5)*(x(:, 1).^2)+beta(6)*(x(:, 2).^2)+beta(7)*(x(:, 3).^2); 47end
demo.m
1clear 2clc 3X=[1 13 1.5; 1.4 19 3; 1.8 25 1; 2.2 10 2.5;2.6 16 0.5; 3 22 2; 3.4 28 3.5; 3.5 30 3.7]; 4Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5]; 5choose=1; 6fit_nonlinear_data(X, Y, choose)
2. 结果
(1)多元线性拟合(regress)
choose=1:
1>> demo 2 3beta = 4 5 0.200908829282537 6 0.044949392540298 7 -0.003878606875016 8 0.070813489681112 9 10 11bint = 12 13 -0.026479907290565 0.428297565855639 14 -0.057656451966002 0.147555237046598 15 -0.017251051845827 0.009493838095795 16 0.000201918738160 0.141425060624065 17 18 19r = 20 21 0.028343433030705 22 -0.066584917256987 23 0.038333946339215 24 0.037954851676187 25 -0.082126284727611 26 0.058945364984698 27 -0.010982985302994 28 -0.003883408743214 29 30 31rint = 32 33 -0.151352966773048 0.208039832834458 34 -0.188622801533810 0.055452967019837 35 -0.090283529625345 0.166951422303776 36 -0.090266067743345 0.166175771095720 37 -0.108068661106325 -0.056183908348897 38 -0.130409602930181 0.248300332899576 39 -0.206254481234707 0.184288510628719 40 -0.184329400080620 0.176562582594191 41 42 43states = 44 45 0.768591079367914 4.428472778943478 0.092289917768436 0.004625488283939

(2)多元非线性拟合(nlinfit)
choose=2:
1>> demo 2 3beta = 4 5 0.312525876099987 6 0.015300533415459 7 -0.036942272680920 8 0.299760796634952 9 0.009412595106141 10 0.000976411370591 11 -0.062931846673372 12 13 14r = 15 16 1.0e-03 * 17 18 -0.047521336834000 19 0.127597019984715 20 -0.092883949615763 21 -0.040370056416994 22 0.031209476614974 23 0.211856736183458 24 -0.727835090583939 25 0.537947200592082 26 27 28J = 29 30 1.0e+02 * 31 32 0.010000000000266 0.010000000001236 0.129999999998477 0.014999999999641 0.010000000007909 1.689999999969476 0.022499999999756 33 0.010000000000266 0.014000000006524 0.189999999999301 0.029999999999283 0.019600000006932 3.609999999769248 0.089999999999024 34 0.010000000000266 0.018000000011811 0.249999999990199 0.009999999999965 0.032399999999135 6.250000000033778 0.010000000000377 35 0.009999999999679 0.022000000005116 0.099999999998065 0.025000000000218 0.048400000003999 1.000000000103046 0.062500000001264 36 0.009999999999972 0.025999999998421 0.159999999998889 0.004999999999982 0.067599999997174 2.559999999999039 0.002499999999730 37 0.009999999999679 0.029999999991726 0.219999999999713 0.019999999999930 0.089999999993269 4.839999999890361 0.040000000000052 38 0.009999999999092 0.033999999985031 0.279999999990611 0.034999999998348 0.115599999997155 7.839999999636182 0.122500000000614 39 0.010000000000266 0.034999999992344 0.299999999994194 0.037000000000420 0.122499999994626 8.999999999988553 0.136899999999292 40 41 42Ypred = 43 44 0.330047521336834 45 0.335872402980015 46 0.294092883949616 47 0.476040370056417 48 0.208968790523385 49 0.450788143263817 50 0.482727835090584 51 0.499462052799408 52 53 54delta = 55 56 0.011997285626178 57 0.011902559677366 58 0.011954353934643 59 0.012001513980794 60 0.012005923574387 61 0.011706970437467 62 0.007666390995581 63 0.009878186927507

(3)多元非线性拟合(lsqcurvefit)
choose=3:
1>> demo 2 3beta = 4 5 0.312525876070457 6 0.015300533464733 7 -0.036942272680581 8 0.299760796608728 9 0.009412595094407 10 0.000976411370579 11 -0.062931846666179 12 13 14resnorm = 15 16 8.937848643213721e-07 17 18 19r = 20 21 1.0e-03 * 22 23 0.047521324135769 24 -0.127597015215197 25 0.092883952947764 26 0.040370060121864 27 -0.031209466218374 28 -0.211856745335304 29 0.727835089662676 30 -0.537947200236699 31 32 33J = 34 35 1.0e+02 * 36 37 (1,1) 0.010000000000000 38 (2,1) 0.010000000000000 39 (3,1) 0.010000000000000 40 (4,1) 0.010000000000000 41 (5,1) 0.010000000000000 42 (6,1) 0.010000000000000 43 (7,1) 0.010000000000000 44 (8,1) 0.010000000000000 45 (1,2) 0.010000000000000 46 (2,2) 0.014000000059605 47 (3,2) 0.017999999970198 48 (4,2) 0.022000000029802 49 (5,2) 0.026000000014901 50 (6,2) 0.030000000000000 51 (7,2) 0.034000000059605 52 (8,2) 0.035000000000000 53 (1,3) 0.130000000000000 54 (2,3) 0.190000000000000 55 (3,3) 0.250000000000000 56 (4,3) 0.100000000000000 57 (5,3) 0.160000000000000 58 (6,3) 0.220000000000000 59 (7,3) 0.280000000000000 60 (8,3) 0.300000000000000 61 (1,4) 0.015000000000000 62 (2,4) 0.030000000000000 63 (3,4) 0.010000000000000 64 (4,4) 0.025000000000000 65 (5,4) 0.005000000000000 66 (6,4) 0.020000000000000 67 (7,4) 0.035000000000000 68 (8,4) 0.036999999880791 69 (1,5) 0.010000000000000 70 (2,5) 0.019599999934435 71 (3,5) 0.032399999983609 72 (4,5) 0.048400000035763 73 (5,5) 0.067599999997765 74 (6,5) 0.090000000000000 75 (7,5) 0.115600000023842 76 (8,5) 0.122500000000000 77 (1,6) 1.690000000000000 78 (2,6) 3.610000000000000 79 (3,6) 6.250000000000000 80 (4,6) 1.000000000000000 81 (5,6) 2.560000000000000 82 (6,6) 4.840000000000000 83 (7,6) 7.840000000000000 84 (8,6) 9.000000000000000 85 (1,7) 0.022500000000000 86 (2,7) 0.090000000000000 87 (3,7) 0.010000000000000 88 (4,7) 0.062500000000000 89 (5,7) 0.002500000000000 90 (6,7) 0.040000000000000 91 (7,7) 0.122500000000000 92 (8,7) 0.136899999976158 93 94 95Ypred = 96 97 0.330047521324136 98 0.335872402984785 99 0.294092883952948 100 0.476040370060122 101 0.208968790533782 102 0.450788143254665 103 0.482727835089663 104 0.499462052799763 105 106 107delta = 108 109 0.011997285618724 110 0.011902559623756 111 0.011954353977139 112 0.012001513949620 113 0.012005923574975 114 0.011706970418735 115 0.007666391016173 116 0.009878186931566

注意:多元非线性函数拟合中参数的初始值需要提前设置,有些情况下,参数的初始选取对函数拟合结果影响极大,需要谨慎处理。第二三种方法中,由于数据是多维的,因此只展示了第一个维度的拟合函数图。如有需要,可自行修改。