【问题标题】:matlab creating nonlinear model fit: two independent variables linear and nonmatlab创建非线性模型拟合:两个自变量线性和非
【发布时间】:2016-03-23 23:12:06
【问题描述】:

我正在尝试用两个预测变量拟合非线性回归模型。我在编写模型时遇到问题。

z = 因变量 x = 定义了与 z 关系的自变量:a*tanh(-b*x/a)+c

y 与 z 的关系是线性的。但由于我的数据范围,只有线性

这是我目前所拥有的:

a*tanh(-b*x/a)+c + (d*y)

理想情况下,我希望有一个第三分类自变量,它可以用 0 或 1 数字表示

提前感谢您的帮助!

【问题讨论】:

  • 我不完全理解你的问题,但是如果你有权限的话,看看 Matlab 的曲线拟合工具箱cftool。除其他外,它还允许您拟合自定义方程。

标签: matlab model


【解决方案1】:

请参阅 Matlab 文档以获取 fitnlm,这是他们用于非线性回归分析的最全面和主流的工具。它于 2013b 年推出。旧函数是nlinfit

使用它的一种方法是,来自上面链接的文档

mdl = fitnlm(X, y, modelfun, beta0)

这里的X = [x1, x2] 是一个由向量​​x1x2 构建的矩阵,其中包含预测变量的数据(您的xy)。上面的y 是带有响应数据的向量(您的z)。 modelfun 是您提供功能依赖的地方。这可以通过两种方式完成,下面我使用更简单的“字符串语法”。在您的z = a*tanh(-b*x/a)+c + (d*y) 的情况下,建模功能是

modelfun = `y~(b1*tanh(-b2*x1/b1)+b3+b4*x2)`

请注意,这是准确的语法,'y~(...)'。请参阅上面链接的fitnlm 页面上“示例”下的“使用模型字符串语法指定非线性回归”。

最后,beta0 是具有未知系数初始值的向量。 (为此获得合理的值对于成功建模非常关键。) 所以你要确定的系数是(b1, b2, b3, b4),向量beta0应该有它们的初始值,开始拟合。

然后,假设您已经使用您的数据构建了X = [x1, x2] 矩阵并为beta0 选择了值,

modfun = 'y~(b1*tanh(-b2*x1/b1)+b3+b4*x2)';
nlm =  fitnlm(X, y, modfun, beta0);
display(nlm);

这应该会显示系数和一些统计数据的拟合值。

有用的页面可以在non-linear regression 和这个overview 上,并带有资源链接。

【讨论】:

  • 谢谢,我会深入研究 fitlm 函数!
  • 我已经跳过了分类变量的添加,因为它似乎不是非线性模型拟合的选项。所以,我只有两个非线性模型(两个数据集),它们工作得很好。我至少可以通过在另一个上绘制来直观地比较两者。
  • 非常感谢您的跟进。我想我已经到了那里。我为 'modelfun' 创建了一个函数句柄:'modelfunj = @(b,xj)b(1).*tanh((b(2).*xj(:,1))./360)+b(3) +b(4).*(xj(:,2));'这似乎完美无缺。但是,我将使用 compare 与您的语法。再次感谢。
  • @CMil Nice :) 我使用字符串语法只是为了让它更简单。 (至少可以说,这并没有更好。)再次对不合适的原始帖子表示抱歉。
【解决方案2】:

文档指出 fitnlm 不适用于分类数据

fitnlm reference

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 2019-05-04
    • 1970-01-01
    • 2015-05-26
    • 2022-10-25
    • 1970-01-01
    • 2018-11-19
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多