meiyongyuandeze 发表于 2011-4-20 08:50

有关拟合中fittype及初值选取的问题!

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

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


x=;
y=;想要对其进行拟合,采用指数拟合。
1.版主qibbxxt采用cftool根据箱进行了拟合,结果如下:

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

>> f=fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});
>> =fit(x',y',f)
Warning: Start point not provided, choosing random start point.
> In fit>handlewarn at 705
In fit at 321
c =
General model:
c(x) = a*exp(b*x)+c*exp(d*x)
Coefficients (with 95% confidence bounds):
a = 0.00362 (-0.02079, 0.02803)
b = 0.1983 (-0.107, 0.5036)
c = -3.244e-010 (-1.577e-008, 1.512e-008)
d = 0.7468 (-0.7801, 2.274)
gof2 =
sse: 1.7698
rsquare: -282.6509
dfe: 22
adjrsquare: -321.3306

rmse: 0.28363.Chaching执行如下的命令,得到结果:

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



qibbxxt 发表于 2011-4-20 09:20

是初值的问题f=fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});
st_ = ;
=fit(x',y',f,'Startpoint',st_)c =

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

gof2 =

         sse: 1.6681e-006
       rsquare: 0.9997
         dfe: 22
    adjrsquare: 0.9997
          rmse: 2.7536e-004

meiyongyuandeze 发表于 2011-4-20 09:22

本帖最后由 meiyongyuandeze 于 2011-4-20 13:12 编辑

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


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


meiyongyuandeze 发表于 2011-4-20 10:39

本帖最后由 meiyongyuandeze 于 2011-4-20 14:11 编辑

我用最小二乘方法来算了下,代码如下:
建立残差公式:
function EPS=My_ee(a,x,y)
x=x(:);
y=y(:);
EPS=sum((y-a(1)*exp(a(2)*x) - a(3)*exp(a(4)*x)).^2);用优化手段来计算:
x=;
y=;
a0=;%猜的
options=optimset('fminsearch')      
    for i=1:10%优化10次            
    a1=fminsearch(@My_ee,a0,options,x,y);
    a0=a1;
    i=i+1;
end
a(1,1:4)=a1;再用自己的拟合函数,采用a为初值来拟合:

f=fittype('a*exp(b*x)+c*exp(d*x)','coeff',{'a','b','c','d'});
>> =fit(x',y',f,'Startpoint',a)

c =
   General model:
       c(x) = a*exp(b*x)+c*exp(d*x)
   Coefficients (with 95% confidence bounds):
       a =       0.192(0.1796, 0.2045)
       b =   -0.3197(-0.3381, -0.3013)
       c =   0.04081(0.03824, 0.04338)
       d =    -0.04496(-0.04768, -0.04224)

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




dingd 发表于 2011-4-20 11:21

拟合的初值问题还是1stOpt处理的最好,基本不需要猜了。

meiyongyuandeze 发表于 2011-4-20 11:48

本帖最后由 meiyongyuandeze 于 2011-4-20 16:03 编辑

回复 5 # dingd 的帖子

是,谢谢,但主要是自己对1stOpt不熟,还需要恶补下!

ChaChing 发表于 2011-4-20 22:14

本帖最后由 ChaChing 于 2011-4-20 22:15 编辑

回复 5 # dingd 的帖子

个人除非真的难以理解或没辙了, 基本上还是比较喜欢猜下!:@)
因为真的不了解为何可以不需要猜了!? 呵呵:@L

meiyongyuandeze 发表于 2011-4-21 08:51

本帖最后由 meiyongyuandeze 于 2011-4-21 08:51 编辑

回复 5 # dingd 的帖子

看了下以前你对1stOpt的讨论,确实是这方面的高手;1stOpt解非线性问题对初值要求不高,能不能大概给说下是基于什么样的一种算法或者逻辑来处理初值问题呢!
页: [1]
查看完整版本: 有关拟合中fittype及初值选取的问题!