MATLAB数学建模-基础回归预测

线性模型

线性模型是一种用线性关系来建模自变量和因变量之间关系的统计学和机器学习方法。

一元回归 $$ Y = \beta_0 + \beta_1 \cdot X + \varepsilon $$ 多元回归 $$ Y = \beta_0 + \beta_1 \cdot X_1 + \beta_2 \cdot X_2 + \ldots + \beta_n \cdot X_n + \varepsilon $$ 其中,$Y$是因变量,$X_1, X_2, \ldots, X_n$是自变量,$\beta_0, \beta_1, \beta_2, \ldots, \beta_n$是回归模型的参数,$\varepsilon$表示误差项。

MATLAB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [2; 4; 5; 4; 5];

% 使用fitlm函数创建线性模型
model = fitlm(X, Y);

% 查看线性模型的拟合结果
disp(model);

% 绘制数据点和线性模型拟合线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
plot(X, model.Fitted, 'r-', 'DisplayName', 'Linear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

lmt230730

非线性模型

非性模型是指在统计学和机器学习中,自变量和因变量之间的关系不是线性的,而是通过非线性函数建模的方法。

MATLAB非线性回归函数

  • fitnlm:函数用于拟合一个非线性模型
  • lsqcurvefit:用于最小二乘法拟合非线性曲线。
  • fminsearch:用于最小化目标函数的非线性优化。
  • nlinfit:用于非线性最小二乘法拟合。
  • lsqnonlin:用于非线性最小二乘法非线性优化。
  • fsolve:用于求解非线性方程组。
函数 适用场景 输入参数 输出结果
fitnlm 拟合线性和非线性回归模型,支持统计性质和置信区间的计算 自变量、因变量数据、非线性模型函数、初始参数猜测值 回归模型对象,包含参数估计、统计信息等
lsqcurvefit 最小二乘法拟合非线性曲线 非线性模型函数、初始参数猜测值、自变量、因变量数据 最优的参数估计
fminsearch 最小化目标函数的非线性优化问题 目标函数、初始参数猜测值 最优的参数估计
nlinfit 非线性最小二乘法拟合,用于回归分析 自变量、因变量数据、非线性模型函数、初始参数猜测值 最优的参数估计,拟合结果的统计信息
lsqnonlin 最小二乘法非线性优化问题 目标函数、初始参数猜测值 最优的参数估计
fsolve 求解非线性方程组,用于非线性回归问题 非线性方程组函数、初始参数猜测值 方程组的数值解

这些函数在一定程度上可以用于非线性回归问题。fitnlm是专门用于统计性质的回归分析,支持线性和非线性模型,提供了丰富的统计信息。lsqcurvefitfminsearchnlinfitlsqnonlinfsolve则主要用于非线性优化问题,通过最小化目标函数或求解非线性方程组来拟合非线性模型。具体使用哪个函数,取决于问题的性质、需要的输出信息和个人偏好。

MATLAB代码示例

fitnlm

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [1.2; 2.8; 9.5; 23; 42];

% 自定义指数函数模型: Y = a * exp(b * X)
modelfun = @(b, X) b(1) * exp(b(2) * X);

% 初始参数猜测值
beta0 = [1, 0.5];

% 使用fitnlm函数拟合非线性回归模型
mdl = fitnlm(X, Y, modelfun, beta0);

% 查看模型拟合结果
disp(mdl);

% 绘制原始数据点和非线性回归模型拟合曲线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
X_fit = linspace(min(X), max(X), 100);
Y_fit = predict(mdl, X_fit');
plot(X_fit, Y_fit, 'r-', 'DisplayName', 'Nonlinear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

lsqcurvefit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [1.2; 2.8; 9.5; 23; 42];

% 自定义指数函数模型: Y = a * exp(b * X)
modelfun = @(b, X) b(1) * exp(b(2) * X);

% 初始参数猜测值
beta0 = [1, 0.5];

% 使用lsqcurvefit函数拟合非线性回归模型
beta_fit = lsqcurvefit(modelfun, beta0, X, Y);

% 计算拟合后的Y值
Y_fit = modelfun(beta_fit, X);

% 绘制原始数据点和非线性回归模型拟合曲线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
plot(X, Y_fit, 'r-', 'DisplayName', 'Nonlinear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

nlmt2307302

fminsearch

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [1.2; 2.8; 9.5; 23; 42];

% 自定义指数函数模型: Y = a * exp(b * X)
modelfun = @(b, X) b(1) * exp(b(2) * X);

% 定义目标函数,计算模型与数据的误差
objfun = @(b) sum((Y - modelfun(b, X)).^2);

% 初始参数猜测值
beta0 = [1, 0.5];

% 使用fminsearch函数拟合非线性回归模型
beta_fit = fminsearch(objfun, beta0);

% 计算拟合后的Y值
Y_fit = modelfun(beta_fit, X);

% 绘制原始数据点和非线性回归模型拟合曲线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
plot(X, Y_fit, 'r-', 'DisplayName', 'Nonlinear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

nlmt2307303

nlinfit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [1.2; 2.8; 9.5; 23; 42];

% 自定义指数函数模型: Y = a * exp(b * X)
modelfun = @(b, X) b(1) * exp(b(2) * X);

% 初始参数猜测值
beta0 = [1, 0.5];

% 使用nlinfit函数拟合非线性回归模型
beta_fit = nlinfit(X, Y, modelfun, beta0);

% 计算拟合后的Y值
Y_fit = modelfun(beta_fit, X);

% 绘制原始数据点和非线性回归模型拟合曲线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
plot(X, Y_fit, 'r-', 'DisplayName', 'Nonlinear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

nlmt2307304

lsqnonlin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [1.2; 2.8; 9.5; 23; 42];

% 自定义指数函数模型: Y = a * exp(b * X)
modelfun = @(b, X) b(1) * exp(b(2) * X);

% 定义目标函数,计算模型与数据的误差
objfun = @(b) Y - modelfun(b, X);

% 初始参数猜测值
beta0 = [1, 0.5];

% 使用lsqnonlin函数拟合非线性回归模型
beta_fit = lsqnonlin(objfun, beta0);

% 计算拟合后的Y值
Y_fit = modelfun(beta_fit, X);

% 绘制原始数据点和非线性回归模型拟合曲线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
plot(X, Y_fit, 'r-', 'DisplayName', 'Nonlinear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

nlmt2307305

fsolve

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
% 生成示例数据
X = [1; 2; 3; 4; 5];
Y = [1.2; 2.8; 9.5; 23; 42];

% 自定义指数函数模型: Y = a * exp(b * X)
modelfun = @(b, X) b(1) * exp(b(2) * X);

% 定义非线性方程组,计算模型与数据的误差
objfun = @(b) Y - modelfun(b, X);

% 初始参数猜测值
beta0 = [1, 0.5];

% 使用fsolve函数拟合非线性回归模型
beta_fit = fsolve(objfun, beta0);

% 计算拟合后的Y值
Y_fit = modelfun(beta_fit, X);

% 绘制原始数据点和非线性回归模型拟合曲线
scatter(X, Y, 'o', 'filled', 'DisplayName', 'Data');
hold on;
plot(X, Y_fit, 'r-', 'DisplayName', 'Nonlinear Model');
xlabel('X');
ylabel('Y');
legend('show');
grid on;

nlmt2307306

comments powered by Disqus