程式碼示例:
fit_nonlinear_data.m
function [beta, r]=fit_nonlinear_data(X, Y, choose)
% Input: X 自變數資料(N, D), Y 因變數(N, 1),choose 1-regress, 2-nlinfit 3-lsqcurvefit
if choose==1
X1=[ones(length(X(:, 1)), 1), X];
[beta, bint, r, rint, states]=regress(Y, X1)
% 多元線性迴歸
% y=beta(1)+beta(2)*x1+beta(3)*x2+beta(4)*x3+...
% beta—係數估計
% bint—係數估計的上下置信界
% r—殘差
% rint—診斷異常值的區間
% states—模型統計資訊
rcoplot(r, rint)
saveas(gcf,sprintf("線性曲線擬合_殘差圖.jpg"),"bmp");
elseif choose==2
beta0=ones(7, 1);
% 初始值的選取可能會導致結果具有較大的誤差。
[beta, r, J]=nlinfit(X, Y, @myfun, beta0)
% 非線性迴歸
% J—雅可比矩陣
[Ypred,delta]=nlpredci(@myfun, X, beta, r, "Jacobian", J)
% 非線性迴歸預測置信區間
% Ypred—預測響應
% delta—置信區間半形
plot(X(:, 1), Y, "k.", X(:, 1), Ypred, "r");
saveas(gcf,sprintf("非線性曲線擬合_1.jpg"),"bmp");
elseif choose==3
[beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@myfun,beta0,X,Y)
% 在最小二乘意義上解決非線性曲線擬合(資料擬合)問題
% resnorm—殘差的平方範數 sum((fun(x,xdata)-ydata).^2)
% r—殘差 r=fun(x,xdata)-ydata
saveas(gcf,sprintf("非線性曲線擬合_2.jpg"),"bmp");
end
function yy=myfun(beta,x) %自定義擬合函式
yy=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);
demo.m
clear
clc
X=[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];
Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];
choose=1;
fit_nonlinear_data(X, Y, choose)
程式碼示例:
fit_nonlinear_data.m
function [beta, r]=fit_nonlinear_data(X, Y, choose)
% Input: X 自變數資料(N, D), Y 因變數(N, 1),choose 1-regress, 2-nlinfit 3-lsqcurvefit
if choose==1
X1=[ones(length(X(:, 1)), 1), X];
[beta, bint, r, rint, states]=regress(Y, X1)
% 多元線性迴歸
% y=beta(1)+beta(2)*x1+beta(3)*x2+beta(4)*x3+...
% beta—係數估計
% bint—係數估計的上下置信界
% r—殘差
% rint—診斷異常值的區間
% states—模型統計資訊
rcoplot(r, rint)
saveas(gcf,sprintf("線性曲線擬合_殘差圖.jpg"),"bmp");
elseif choose==2
beta0=ones(7, 1);
% 初始值的選取可能會導致結果具有較大的誤差。
[beta, r, J]=nlinfit(X, Y, @myfun, beta0)
% 非線性迴歸
% beta—係數估計
% r—殘差
% J—雅可比矩陣
[Ypred,delta]=nlpredci(@myfun, X, beta, r, "Jacobian", J)
% 非線性迴歸預測置信區間
% Ypred—預測響應
% delta—置信區間半形
plot(X(:, 1), Y, "k.", X(:, 1), Ypred, "r");
saveas(gcf,sprintf("非線性曲線擬合_1.jpg"),"bmp");
elseif choose==3
beta0=ones(7, 1);
% 初始值的選取可能會導致結果具有較大的誤差。
[beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@myfun,beta0,X,Y)
% 在最小二乘意義上解決非線性曲線擬合(資料擬合)問題
% beta—係數估計
% resnorm—殘差的平方範數 sum((fun(x,xdata)-ydata).^2)
% r—殘差 r=fun(x,xdata)-ydata
% J—雅可比矩陣
[Ypred,delta]=nlpredci(@myfun, X, beta, r, "Jacobian", J)
plot(X(:, 1), Y, "k.", X(:, 1), Ypred, "r");
saveas(gcf,sprintf("非線性曲線擬合_2.jpg"),"bmp");
end
end
function yy=myfun(beta,x) %自定義擬合函式
yy=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);
end
demo.m
clear
clc
X=[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];
Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];
choose=1;
fit_nonlinear_data(X, Y, choose)