MATLAB:使用 fittype 的曲线拟合工具箱中的分段函数

标签 matlab plot curve-fitting linear-regression least-squares

首先忽略红色拟合曲线。我想得到蓝色数据点的曲线。我知道第一部分(在这种情况下最多 y~200)是线性的,然后是不同的曲线(两个对数曲线的组合,但也可以以不同的方式近似),然后它在大约 250 或 255 处饱和。我这样尝试:

func = fittype('(x>=0 & x<=xTrans1).*(A*x+B)+(x>=xTrans1 & x<=xTrans2).*(C*x+D)+(x>=xTrans2).*E*255');
freg = fit(foundData(:,1), foundData(:,2), func);
plot(freg, foundData(:,1), foundData(:,2))

好吧,显然我的健身类型可以改进,但为什么它实际上那么糟糕/错误? 我尝试了另一个更简单的模型:

func = fittype('(x>=0 & x<=xTrans1).*(A*x+B)+(x>=xTrans1).*(C*x+D)')
freg = fit(foundData(:,1), foundData(:,2), func);
plot(freg, foundData(:,1), foundData(:,2))

至少我希望有两个线性函数,我得到的是:

或者只是图是错误的,因为拟合的输出是:

 General model:
 f_fit(x) = (x>=0 & x<=xTrans1).*(A*x+B)+(x>=xTrans1).*(C*x+D)
 Coefficients (with 95% confidence bounds):
   A =      0.6491
   B =      0.7317
   C =   0.0007511
   D =       143.5
   xTrans1 =       0.547

这至少产生了一个很好的xTrans1(但我在图中看不到它)!


编辑 感谢您指出对函数进行编程以适应的更清晰的方法,我尝试了以下方法(具有两个过渡点的三个不同的线性函数):

function y = singleRegression_ansatzfunktion(x,xtrans1,xtrans2,a,b,c,d,e,f)
y = zeros(size(x));

% 3 Geradengleichungen:
for i = 1:length(x)
    if x(i) < xtrans1
        y(i) = a + b.* x(i);
    elseif(x(i) < xtrans2)
        y(i) = c + d.* x(i);
    else
        y(i) = e + f.* x(i);
    end
end

这样调用装配工:

freg = fit(foundData(:,1), foundData(:,2), 'singleRegression_ansatzfunktion(x,xtrans1,xtrans2,a,b,c,d,e,f)');
plot(freg, foundData(:,1), foundData(:,2))

结果:

 General model:
 f(x) = singleRegression_ansatzfunktion(x,xtrans1,xtrans2,a,b,c,d,e,f)
 Coefficients (with 95% confidence bounds):
   a =      0.7655
   b =      0.7952
   c =      0.1869
   d =      0.4898
   e =       159.2
   f =   0.0005512
   xtrans1 =      0.7094
   xtrans2 =      0.7547

!!!奇怪!!!


编辑2 当不让 MATLAB 优化过渡点而是自己输入它们时,就像我不久在 cftool 中所做的那样(应该与调用 fit 相同,但更快地弄清楚)通过自定义方程:

(x>=0 & x<=2.9e4).*(A*x+B)+(x>2.9e4 & x<=1.3e5).*(B*x+D)+(x>1.3e5).*255

效果非常好。我不知道为什么 MATLAB 不能自己完成此操作,但是好吧...结果如下:

所以至少我现在修复了它,但我仍然怀疑为什么 MATLAB 本身无法做到这一点。

最佳答案

您尝试过 fittype 中的方法吗?文档页面(“拟合由文件定义的曲线”示例),即定义您的函数以适合文件以查看它是否有影响?

我能想到的另一种方法是将数据拆分为两个(或更多)不同的数据集,并对每个 block 进行两次单独的拟合(但假设您知道转换的先验位置)点是或可以在拟合之前解决)。

关于MATLAB:使用 fittype 的曲线拟合工具箱中的分段函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20285780/

相关文章:

python - 使用 matplotlib 绘制 4D numpy 数据

algorithm - 具有两个给定点和成本函数的抛物线拟合

python - scipy curve_fit 返回初始估计

matlab - 强制评估 MATLAB 匿名函数中的变量

matlab - 如何以编程方式调用 MatLab 中的缩放事件?

pandas - TypeError: Empty 'DataFrame' : 在国家 shp 文件中绘制 Mirai 感染情况时,没有可以在 Geopandas 中绘制的数字数据

python - curve_fit似乎高估了估计参数的误差

matlab - 编译后运行matlab代码出错

matlab - 如果 FFT 有很多 0,则寻找卷积核?

pandas - 如何删除 Dataframe.plot 中的特定图例标签?