请对上述例子做非线性回归,请给出matlab代码

为了进一步分析非线性关系,我们可以使用 MATLAB 进行非线性回归。以下代码将展示如何对非线性关系

y=x2y = x^2 进行非线性回归,并绘制回归曲线与原始数据的对比图。


MATLAB 代码

matlab
复制
% 生成数据
x = -10:0.1:10;  % 自变量 x
y_nonlinear = x.^2 + randn(size(x)) * 10;  % 添加噪声的非线性关系

% 定义非线性模型:y = a * x^2 + b
model = @(a, b, x) a * x.^2 + b;

% 初始参数猜测
initialParams = [1, 0];  % a = 1, b = 0

% 使用 lsqcurvefit 进行非线性回归
options = optimoptions('lsqcurvefit', 'Display', 'off');
fittedParams = lsqcurvefit(model, initialParams, x, y_nonlinear, [], [], options);

% 提取拟合参数
a_fit = fittedParams(1);  % 拟合的 a 值
b_fit = fittedParams(2);  % 拟合的 b 值

% 计算拟合值
y_fit = model(a_fit, b_fit, x);

% 计算皮尔逊相关系数
r_nonlinear = corrcoef(x, y_nonlinear);
r_fit = corrcoef(x, y_fit);

% 显示结果
fprintf('原始数据的皮尔逊相关系数: %.4f\n', r_nonlinear(1, 2));
fprintf('拟合数据的皮尔逊相关系数: %.4f\n', r_fit(1, 2));
fprintf('拟合参数: a = %.4f, b = %.4f\n', a_fit, b_fit);

% 绘制散点图和拟合曲线
figure;
scatter(x, y_nonlinear, 50, 'r', 'filled');  % 原始数据散点图
hold on;
plot(x, y_fit, 'b-', 'LineWidth', 2);  % 拟合曲线
title(sprintf('非线性回归 (y = %.4f x^2 + %.4f)', a_fit, b_fit));
xlabel('x');
ylabel('y');
legend('原始数据', '拟合曲线', 'Location', 'northwest');
grid on;

代码说明

  1. 生成数据
    • 生成非线性关系

      y=x2y = x^2,并添加随机噪声以模拟真实数据。

  2. 定义非线性模型
    • 定义模型

      y=ax2+by = a x^2 + b,其中

      aa

      bb 是待拟合的参数。

  3. 初始参数猜测
    • 提供初始参数猜测值

      a=1a = 1

      b=0b = 0

  4. 非线性回归
    • 使用 lsqcurvefit 函数进行非线性最小二乘拟合。
    • lsqcurvefit 通过最小化残差平方和来找到最佳参数。
  5. 提取拟合参数
    • 从拟合结果中提取参数

      aa

      bb

  6. 计算拟合值
    • 使用拟合参数计算拟合值

      yfity_{\text{fit}}

  7. 计算皮尔逊相关系数
    • 计算原始数据和拟合数据的皮尔逊相关系数。
  8. 绘制散点图和拟合曲线
    • 使用 scatter 绘制原始数据的散点图。
    • 使用 plot 绘制拟合曲线。

运行结果

1. 拟合参数

  • 拟合参数

    aa

    bb 将接近真实值

    a=1a = 1

    b=0b = 0(由于噪声的存在,可能会有轻微偏差)。

2. 皮尔逊相关系数

  • 原始数据的皮尔逊相关系数接近 0,表明

    xx

    yy 之间没有线性关系。

  • 拟合数据的皮尔逊相关系数接近 1,表明拟合曲线能够很好地捕捉非线性关系。

3. 图形展示

  • 散点图显示原始数据的分布(红色点)。
  • 拟合曲线(蓝色线)很好地拟合了原始数据的非线性趋势。

总结

通过非线性回归,我们可以:

  1. 准确拟合非线性关系(如

    y=x2y = x^2)。

  2. 捕捉变量之间的非线性趋势,即使皮尔逊相关系数接近 0。
  3. 使用拟合参数量化非线性关系。

这段代码展示了如何通过非线性回归分析非线性关系,并结合散点图和拟合曲线直观展示结果。

代码报错:
错误使用 lsqcurvefit>initEvalErrorHandler
FUN must have two input arguments.

出错 lsqcurvefit (第 227 行)
userFcn_ME = initEvalErrorHandler(userFcn_ME,funfcn_x_xdata{3}, …

感谢指出问题!错误的原因是 lsqcurvefit 函数的输入格式不正确。lsqcurvefit 要求目标函数的输入参数必须包括两个部分:

  1. 参数向量(需要拟合的参数)。
  2. 自变量(输入数据)。

在之前的代码中,目标函数 model 的定义方式不符合 lsqcurvefit 的要求。我们需要调整目标函数的定义方式。

以下是修正后的代码:


修正后的 MATLAB 代码

matlab
复制
% 生成数据
x = -10:0.1:10;  % 自变量 x
y_nonlinear = x.^2 + randn(size(x)) * 10;  % 添加噪声的非线性关系

% 定义非线性模型:y = a * x^2 + b
% 注意:目标函数的输入参数必须为 (params, x)
model = @(params, x) params(1) * x.^2 + params(2);

% 初始参数猜测
initialParams = [1, 0];  % a = 1, b = 0

% 使用 lsqcurvefit 进行非线性回归
options = optimoptions('lsqcurvefit', 'Display', 'off');
fittedParams = lsqcurvefit(model, initialParams, x, y_nonlinear, [], [], options);

% 提取拟合参数
a_fit = fittedParams(1);  % 拟合的 a 值
b_fit = fittedParams(2);  % 拟合的 b 值

% 计算拟合值
y_fit = model(fittedParams, x);

% 计算皮尔逊相关系数
r_nonlinear = corrcoef(x, y_nonlinear);
r_fit = corrcoef(x, y_fit);

% 显示结果
fprintf('原始数据的皮尔逊相关系数: %.4f\n', r_nonlinear(1, 2));
fprintf('拟合数据的皮尔逊相关系数: %.4f\n', r_fit(1, 2));
fprintf('拟合参数: a = %.4f, b = %.4f\n', a_fit, b_fit);

% 绘制散点图和拟合曲线
figure;
scatter(x, y_nonlinear, 50, 'r', 'filled');  % 原始数据散点图
hold on;
plot(x, y_fit, 'b-', 'LineWidth', 2);  % 拟合曲线
title(sprintf('非线性回归 (y = %.4f x^2 + %.4f)', a_fit, b_fit));
xlabel('x');
ylabel('y');
legend('原始数据', '拟合曲线', 'Location', 'northwest');
grid on;

修正内容

  1. 目标函数定义
    • 将目标函数 model 的输入参数改为 (params, x),其中 params 是参数向量,x 是自变量。
    • 修改后的定义:model = @(params, x) params(1) * x.^2 + params(2);
  2. 调用 lsqcurvefit
    • 目标函数 model 的第一个输入参数是参数向量 params,第二个输入参数是自变量 x
    • 调用方式保持不变:fittedParams = lsqcurvefit(model, initialParams, x, y_nonlinear, [], [], options);

运行结果

1. 拟合参数

  • 拟合参数

    aa

    bb 将接近真实值

    a=1a = 1

    b=0b = 0(由于噪声的存在,可能会有轻微偏差)。

2. 皮尔逊相关系数

  • 原始数据的皮尔逊相关系数接近 0,表明

    xx

    yy 之间没有线性关系。

  • 拟合数据的皮尔逊相关系数接近 1,表明拟合曲线能够很好地捕捉非线性关系。

3. 图形展示

  • 散点图显示原始数据的分布(红色点)。
  • 拟合曲线(蓝色线)很好地拟合了原始数据的非线性趋势。

总结

修正后的代码解决了 lsqcurvefit 的输入格式问题,并成功实现了非线性回归。通过非线性回归,我们可以:

  1. 准确拟合非线性关系(如

    y=x2y = x^2)。

  2. 捕捉变量之间的非线性趋势,即使皮尔逊相关系数接近 0。
  3. 使用拟合参数量化非线性关系。

希望这段修正后的代码能够帮助您更好地理解非线性回归的应用!如果还有其他问题,请随时告诉我!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇