声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 9459|回复: 7

[综合讨论] 有关拟合中fittype及初值选取的问题!

[复制链接]
发表于 2011-4-20 08:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
这个问题源自于本版块的另一个帖子:"matlab多参数指数拟合如何实现",http://forum.vibunion.com/thread-101750-1-1.html,在此向作者sophialll 表示感谢。

帖子中作者的问题貌似已经解决了,但自己在学习他的问题是又出现了一个新的问题,困惑了两天,所以此问题贴出来,请各位指教。
问题描述:
有两组数据:


  1. x=[5:30];
  2. y=[0.07187 0.05888 0.04987 0.04324 0.03815 0.03417 0.03093 0.02824 0.02598 0.02406 0.02241 0.02096 0.0197 0.01857 0.01757 0.01667 0.01585 0.01511 0.01444 0.01383 0.01326 0.01275 0.01226 0.01182 0.0114 0.01101];
复制代码
想要对其进行拟合,采用指数拟合。
1.版主qibbxxt采用cftool根据箱进行了拟合,结果如下:

  1. General model Exp2:
  2.      f(x) = a*exp(b*x) + c*exp(d*x)
  3. Coefficients (with 95% confidence bounds):
  4.        a =      0.1916  (0.1792, 0.204)
  5.        b =      -0.319  (-0.3373, -0.3006)
  6.        c =     0.04072  (0.03814, 0.04329)
  7.        d =    -0.04487  (-0.0476, -0.04214)
  8. Goodness of fit:
  9.   SSE: 1.669e-006
  10.   R-square: 0.9997
  11.   Adjusted R-square: 0.9997
  12.   RMSE: 0.0002754
复制代码
2.而我采用自己定义fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});函数,得到的结果却是如下:

  1. >> f=fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});
  2. >> [c,gof2]=fit(x',y',f)
  3. Warning: Start point not provided, choosing random start point.
  4. > In fit>handlewarn at 705
  5. In fit at 321
  6. c =
  7. General model:
  8. c(x) = a*exp(b*x)+c*exp(d*x)
  9. Coefficients (with 95% confidence bounds):
  10. a = 0.00362 (-0.02079, 0.02803)
  11. b = 0.1983 (-0.107, 0.5036)
  12. c = -3.244e-010 (-1.577e-008, 1.512e-008)
  13. d = 0.7468 (-0.7801, 2.274)
  14. gof2 =
  15. sse: 1.7698
  16. rsquare: -282.6509
  17. dfe: 22
  18. adjrsquare: -321.3306

  19. rmse: 0.2836
复制代码
3.Chaching执行如下的命令,得到结果:

  1. >> f=fittype('exp2');
  2. >> [c,gof2]=fit(x',y',f)
  3. c =
  4.      General model Exp2:
  5.        c(x) = a*exp(b*x) + c*exp(d*x)
  6.      Coefficients (with 95% confidence bounds):
  7.        a =      0.1916  (0.1792, 0.204)
  8.        b =      -0.319  (-0.3373, -0.3006)
  9.        c =     0.04072  (0.03814, 0.04329)
  10.        d =    -0.04487  (-0.0476, -0.04214)
  11. gof2 =
  12.            sse: 1.6686e-006
  13.        rsquare: 0.9997
  14.            dfe: 22
  15.     adjrsquare: 0.9997
  16.           rmse: 2.7540e-004
复制代码
对比1和3做法,可以知道应该是fittype的问题。三种操作,选择的model都是一样的,为什么我的自己定义的fittype在拟合的时候出现了这么大的问题,感觉问题应该是warning的问题吧,请教高手如何处理warning中的关于初值的设置呢!



评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2011-4-20 09:20 | 显示全部楼层
是初值的问题
  1. f=fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});
  2. st_ = [0.15243570612980811 -0.25709456653830987 0.033745642790019854 -0.038489626682204618 ];
  3. [c,gof2]=fit(x',y',f,'Startpoint',st_)
复制代码
  1. c =

  2.      General model:
  3.      c(x) = a*exp(b*x)+c*exp(d*x)
  4.      Coefficients (with 95% confidence bounds):
  5.        a =       0.192  (0.1796, 0.2045)
  6.        b =     -0.3196  (-0.338, -0.3012)
  7.        c =      0.0408  (0.03823, 0.04337)
  8.        d =    -0.04495  (-0.04767, -0.04222)

  9. gof2 =

  10.            sse: 1.6681e-006
  11.        rsquare: 0.9997
  12.            dfe: 22
  13.     adjrsquare: 0.9997
  14.           rmse: 2.7536e-004
复制代码
 楼主| 发表于 2011-4-20 09:22 | 显示全部楼层
本帖最后由 meiyongyuandeze 于 2011-4-20 13:12 编辑

回复 2 # qibbxxt 的帖子
请教st初值是怎么算出来的呢,我知道肯定是初值的问题,但就是不晓得初值应该怎么给!谢谢!
在cftool中找到了点信息,但也不知道他的计算初值是怎么定的。是不是用最小二乘方法确定呢!
QQ截图未命名.JPG

非常想弄明白,这个matlab中到底是用的什么方法来确定start point的!


 楼主| 发表于 2011-4-20 10:39 | 显示全部楼层
本帖最后由 meiyongyuandeze 于 2011-4-20 14:11 编辑

我用最小二乘方法来算了下,代码如下:
建立残差公式:
  1. function EPS=My_ee(a,x,y)
  2. x=x(:);
  3. y=y(:);
  4. EPS=sum((y-a(1)*exp(a(2)*x) - a(3)*exp(a(4)*x)).^2);
复制代码
用优化手段来计算:
  1. x=[5:30];
  2. y=[0.07187 0.05888 0.04987 0.04324 0.03815 0.03417 0.03093 0.02824 0.02598 0.02406 0.02241 0.02096 0.0197 0.01857 0.01757 0.01667 0.01585 0.01511 0.01444 0.01383 0.01326 0.01275 0.01226 0.01182 0.0114 0.01101];
  3. a0=[1 2 3 3];%猜的
  4. options=optimset('fminsearch')        
  5.     for i=1:10%优化10次            
  6.     a1=fminsearch(@My_ee,a0,options,x,y);
  7.     a0=a1;
  8.     i=i+1;
  9. end
  10. a(1,1:4)=a1;
复制代码
再用自己的拟合函数,采用a为初值来拟合:

  1. f=fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});
  2. >> [c,gof2]=fit(x',y',f,'Startpoint',a)

  3. c =
  4.      General model:
  5.        c(x) = a*exp(b*x)+c*exp(d*x)
  6.      Coefficients (with 95% confidence bounds):
  7.        a =       0.192  (0.1796, 0.2045)
  8.        b =     -0.3197  (-0.3381, -0.3013)
  9.        c =     0.04081  (0.03824, 0.04338)
  10.        d =    -0.04496  (-0.04768, -0.04224)

  11. gof2 =
  12.            sse: 1.6681e-006
  13.        rsquare: 0.9997
  14.            dfe: 22
  15.     adjrsquare: 0.9997
  16.           rmse: 2.7536e-004
复制代码
这样得到的结果看起来就多了,但感觉很是麻烦。
操作了一通好像找到了一个参数拟合的办法,直接就用优化函数来拟合这几个参数,也就是将优化的次数多几次,比如100次或者更多,下面是优化100次以后的结果:
  1. a =0.1920
  2. b =-0.3197
  3. c =0.0408
  4. d =-0.0450
复制代码
感觉已经和fit出的结果相差不大了!
但仍然不是清matlab中的初始值如何选取,上面的做法就当熟悉matlab吧。




评分

1

查看全部评分

发表于 2011-4-20 11:21 | 显示全部楼层
拟合的初值问题还是1stOpt处理的最好,基本不需要猜了。
 楼主| 发表于 2011-4-20 11:48 | 显示全部楼层
本帖最后由 meiyongyuandeze 于 2011-4-20 16:03 编辑

回复 5 # dingd 的帖子

是,谢谢,但主要是自己对1stOpt不熟,还需要恶补下!
发表于 2011-4-20 22:14 | 显示全部楼层
本帖最后由 ChaChing 于 2011-4-20 22:15 编辑

回复 5 # dingd 的帖子

个人除非真的难以理解或没辙了, 基本上还是比较喜欢猜下!:@)
因为真的不了解为何可以不需要猜了!? 呵呵:@L
 楼主| 发表于 2011-4-21 08:51 | 显示全部楼层
本帖最后由 meiyongyuandeze 于 2011-4-21 08:51 编辑

回复 5 # dingd 的帖子

看了下以前你对1stOpt的讨论,确实是这方面的高手;1stOpt解非线性问题对初值要求不高,能不能大概给说下是基于什么样的一种算法或者逻辑来处理初值问题呢!

点评

好像在网上查的是说基于全局优化的什么原理,具体还真的不是了解!主任,3楼中的matlab计算时取得的那个Start point 是怎么得到呢,您知道吗?我很困恼,这个问题查了很多资料还没解决!  发表于 2011-4-21 09:05
这个应该是封装的,不需要初值正是1stOpt的过人之处  发表于 2011-4-21 09:01
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 20:32 , Processed in 0.085615 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表