Matlab优化函数中options选项的修改
關(guān)于非線(xiàn)性?xún)?yōu)化fminbnd函數(shù)的說(shuō)明(僅供新手參考)
初學(xué)matlab優(yōu)化,迭代中止后,經(jīng)常一頭霧水。參看幫助后仍似懂非懂。下面關(guān)于fminbnd函數(shù)的說(shuō)明(也可作為fmincon函數(shù)的參考)對(duì)于新手也許會(huì)有幫助,不當(dāng)之處請(qǐng)指正。
目標(biāo)函數(shù)fun:
需要最小化的目標(biāo)函數(shù)。fun函數(shù)需要輸入標(biāo)量參數(shù)x,返回x處的目標(biāo)函數(shù)標(biāo)量值f。可以將fun函數(shù)指定為命令行,如
x = fminbnd(inline('sin(x*x)'),x0)
同樣,fun參數(shù)可以是一個(gè)包含函數(shù)名的字符串。對(duì)應(yīng)的函數(shù)可以是M文件、內(nèi)部函數(shù)或MEX文件。若fun='myfun',則M文件函數(shù)myfun.m
有下面的形式
function f = myfun(x)
??f = ...? ?? ?? ?? ?%計(jì)算x處的函數(shù)值。
若fun函數(shù)的梯度可以算得,且options.GradObj設(shè)為'on'(用下式設(shè)定),
options = optimset('GradObj','on')
則fun函數(shù)必須返回解x處的梯度向量g到第二個(gè)輸出變量中去。注意,當(dāng)被調(diào)用的fun函數(shù)只需要一個(gè)輸出變量時(shí)(如算法只需要目標(biāo)函數(shù)的值而不需要其梯度值時(shí)),可以通過(guò)核對(duì)nargout的值來(lái)避免計(jì)算梯度值。
function [f,g] = myfun(x)
f = ...? ?? ?? ? %計(jì)算x處得函數(shù)值。
if nargout > 1? ?%調(diào)用fun函數(shù)并要求有兩個(gè)輸出變量。
g = ...? ?? ? %計(jì)算x處的梯度值
end
若Hessian矩陣也可以求得,并且options.Hessian設(shè)為'on',即,
options = optimset('Hessian','on')
則fun函數(shù)必須返回解x處的Hessian對(duì)稱(chēng)矩陣H到第三個(gè)輸出變量中去。注意,當(dāng)被調(diào)用的fun函數(shù)只需要一個(gè)或兩個(gè)輸出變量時(shí)(如算法只需要目標(biāo)函數(shù)的值f和梯度值g而不需要Hessian矩陣H時(shí)),可以通過(guò)核對(duì)nargout的值來(lái)避免計(jì)算Hessian矩陣
function [f,g,H] = myfun(x)
f = ...? ???% 計(jì)算x處得函數(shù)值。
if nargout > 1? ?% 調(diào)用fun函數(shù)并要求有兩個(gè)輸出變量。
g = ...? ? % 計(jì)算x處的梯度值。
? ?if nargout > 2
? ?H = ...? ? % 計(jì)算x處的Hessian矩陣。
End
優(yōu)化參數(shù)選項(xiàng)options:
? ?? ???可以通過(guò)optimset函數(shù)設(shè)置或改變這些參數(shù)。其中有的參數(shù)適用于所有的優(yōu)化算法,有的則只適用于大型優(yōu)化問(wèn)題,另外一些則只適用于中型問(wèn)題。
? ?? ?首先描述適用于大型問(wèn)題的選項(xiàng)。這僅僅是一個(gè)參考,因?yàn)槭褂么笮蛦?wèn)題算法有一些條件。對(duì)于fminunc函數(shù)來(lái)說(shuō),必須提供梯度信息。
LargeScale?–?當(dāng)設(shè)為'on'時(shí)使用大型算法,若設(shè)為'off'則使用中型問(wèn)題的算法。
? ?? ?適用于大型和中型算法的參數(shù):
Diagnostics?–?打印最小化函數(shù)的診斷信息。
Display?–?顯示水平。選擇'off',不顯示輸出;選擇'iter',顯示每一步迭代過(guò)程的輸出;選擇'final',顯示最終結(jié)果。打印最小化函數(shù)的診斷信息。
GradObj?–?用戶(hù)定義的目標(biāo)函數(shù)的梯度。對(duì)于大型問(wèn)題此參數(shù)是必選的,對(duì)于中型問(wèn)題則是可選項(xiàng)。
MaxFunEvals?–?函數(shù)評(píng)價(jià)的最大次數(shù)。
MaxIter?–?最大允許迭代次數(shù)。
TolFun?–?函數(shù)值的終止容限。
TolX?–?x處的終止容限。
??只用于大型算法的參數(shù):
Hessian?–?用戶(hù)定義的目標(biāo)函數(shù)的Hessian矩陣。
??HessPattern?–用于有限差分的Hessian矩陣的稀疏形式。若不方便求fun函數(shù)的稀疏Hessian矩陣H,可以通過(guò)用梯度的有限差分獲得的H的稀疏結(jié)構(gòu)(如非零值的位置等)來(lái)得到近似的Hessian矩陣H。若連矩陣的稀疏結(jié)構(gòu)都不知道,則可以將HessPattern設(shè)為密集矩陣,在每一次迭代過(guò)程中,都將進(jìn)行密集矩陣的有限差分近似(這是缺省設(shè)置)。這將非常麻煩,所以花一些力氣得到Hessian矩陣的稀疏結(jié)構(gòu)還是值得的。
MaxPCGIter?–?PCG迭代的最大次數(shù)。
??PrecondBandWidth?–?PCG前處理的上帶寬,缺省時(shí)為零。對(duì)于有些問(wèn)題,增加帶寬可以減少迭代次數(shù)。
??TolPCG?–?PCG迭代的終止容限。
??TypicalX?–?典型x值。
??
??只用于中型算法的參數(shù):
DerivativeCheck?–?對(duì)用戶(hù)提供的導(dǎo)數(shù)和有限差分求出的導(dǎo)數(shù)進(jìn)行對(duì)比。
DiffMaxChange?–?變量有限差分梯度的最大變化。
DiffMinChange - 變量有限差分梯度的最小變化。
LineSearchType?–?一維搜索算法的選擇。
exitflag:描述退出條件
exitflag>0 表示目標(biāo)函數(shù)收斂于解x處。
exitflag=0 表示已經(jīng)達(dá)到函數(shù)評(píng)價(jià)或迭代的最大次數(shù)。
exitflag<0 表示目標(biāo)函數(shù)不收斂。
output:
? ?? ?該參數(shù)包含下列優(yōu)化信息:
output.iterations?–?迭代次數(shù)。
output.algorithm?–?所采用的算法。
output.funcCount?–?函數(shù)評(píng)價(jià)次數(shù)。
output.cgiterations?–?PCG迭代次數(shù)(只適用于大型規(guī)劃問(wèn)題)。
output.stepsize?–?最終步長(zhǎng)的大小(只用于中型問(wèn)題)。
??output.firstorderopt?–?一階優(yōu)化的度量:解x處梯度的范數(shù)。
[?本帖最后由 yxzjs 于 2008-1-9 23:09 編輯?]?
建議:
1.對(duì)于求解平方和的問(wèn)題,fminunc函數(shù)不是最好的選擇,用lsqnonlin函數(shù)效果更佳。
2.使用大型方法時(shí),必須通過(guò)將options.GradObj設(shè)置為'on'來(lái)提供梯度信息,否則將給出警告信息。
關(guān)于算法:
大型優(yōu)化算法??若用戶(hù)在fun函數(shù)中提供梯度信息,則缺省時(shí)函數(shù)將選擇大型優(yōu)化算法,該算法是基于內(nèi)部映射牛頓法的子空間置信域法,理論描述可參見(jiàn)文獻(xiàn)[8],[9]。計(jì)算中的每一次迭代涉及到用PCG法求解大型線(xiàn)性系統(tǒng)得到的近似解。
中型優(yōu)化算法??此時(shí)fminunc函數(shù)的參數(shù)options.LargeScale設(shè)置為'off'。該算法采用的是基于二次和三次混合插值一維搜索法的BFGS擬牛頓法。該法通過(guò)BFGS公式來(lái)更新Hessian矩陣。通過(guò)將HessUpdate參數(shù)設(shè)置為'dfp',可以用DFP公式來(lái)求得Hessian矩陣逆的近似。通過(guò)將HessUpdate參數(shù)設(shè)置為'steepdesc',可以用最速下降法來(lái)更新Hessian矩陣。但一般不建議使用最速下降法。
缺省時(shí)的一維搜索算法,當(dāng)options.LineSearchType 設(shè)置為'quadcubic'時(shí),將采用二次和三次混合插值法。將options.LineSearchType設(shè)置為'cubicpoly'時(shí),將采用三次插值法。第二種方法需要的目標(biāo)函數(shù)計(jì)算次數(shù)更少,但梯度的計(jì)算次數(shù)更多。這樣,如果提供了梯度信息,或者能較容易地算得,則三次插值法是更佳的選擇
局限性:
1.目標(biāo)函數(shù)必須是連續(xù)的。fminunc函數(shù)有時(shí)會(huì)給出局部最優(yōu)解。
2.fminunc函數(shù)只對(duì)實(shí)數(shù)進(jìn)行優(yōu)化,即x必須為實(shí)數(shù),而且f(x)必須返回實(shí)數(shù)。當(dāng)x為復(fù)數(shù)時(shí),必須將它分解為實(shí)部和虛部。
3.在使用大型算法時(shí),用戶(hù)必須在fun函數(shù)中提供梯度(options參數(shù)中GradObj屬性必須設(shè)置為'on')。
4.目前,若在fun函數(shù)中提供了解析梯度,則options參數(shù)DerivativeCheck不能用于大型算法以比較解析梯度和有限差分梯度。通過(guò)將options參數(shù)的MaxIter 屬性設(shè)置為0來(lái)用中型方法核對(duì)導(dǎo)數(shù)。然后重新用大型方法求解問(wèn)題。
通常在使用Matlab優(yōu)化工具箱中的函數(shù)時(shí),需要根據(jù)不同要求修改優(yōu)化選項(xiàng),例如最大迭代次數(shù)、x處的終止容限等等。可通過(guò) optimset 語(yǔ)句來(lái)修改優(yōu)化選項(xiàng)參數(shù):
options=optimset(‘optionName’,’optionValue’);如:
options=optimset('tolx',1e-100);
????options=optimset(options,'tolfun',1e-100);
后面還可以依此法添加很多選項(xiàng)信息。
下面舉一個(gè)完整例子:求取f=4*x(1)^2+5*x(1)*x(2)+2*x(2)^2的最小值
---------------------------------------------------------------------------------------------function [f,g]=ff3(x)
f=4*x(1)^2+5*x(1)*x(2)+2*x(2)^2;
if nargut >1
?????g(1)=8*x(1)+5*x(2);
?????g(2)=5*x(1)+4*x(2);
end
通過(guò)下面將優(yōu)化選項(xiàng)結(jié)構(gòu)options.GradObj設(shè)置為’on’來(lái)得到梯度值。
???????options=optimset(‘Gradobj’,’on’);
???????x0=[1,1];
[x,fval,exitflag]=fminunc(@ff3,x0,options)
---------------------------------------------------------------------------------------------
?
Options的參數(shù)描述(OPTIMSET):
%OPTIMSET PARAMETERS
�rivativeCheck - Compare user supplied derivatives (gradients or Jacobian)
%??????????????????to finite-differencing derivatives??[ on | {off}]
%Diagnostics - Print diagnostic information about the function to be
%??????????????minimized or solved [ on | {off}]
%DiffMaxChange - Maximum change in variables for finite difference gradients
%??????????????[ positive scalar??| {1e-1} ]
%DiffMinChange - Minimum change in variables for finite difference gradients
%??????????????[ positive scalar??| {1e-8} ]
%Display - Level of display [ off | iter | notify | final ]?
%GoalsExactAchieve - Number of goals to achieve exactly (do not over- or
%????????????????????under-achieve) [ positive scalar integer | {0}]
%GradConstr - Gradients for the nonlinear constraints defined by user
%????????????????????[ on | {off} ]
%GradObj - Gradient(s) for the objective function(s) defined by user
%????????????????????[ on | {off}]
%Hessian - Hessian for the objective function defined by user??[ on | {off} ]
%HessMult - Hessian multiply function defined by user
%????????????????????[ function | {[]} ]
%HessPattern - Sparsity pattern of the Hessian for finite-differencing
%??????????????[ sparse matrix ]
%HessUpdate - Quasi-Newton updating scheme
%?????????????[ {bfgs} | dfp | gillmurray | steepdesc ]
%Jacobian - Jacobian for the objective function defined by user
%????????????????????[ on | {off}]
%JacobMult - Jacobian multiply function defined by user
%????????????????????[ function | {[]} ]
%JacobPattern - Sparsity pattern of the Jacobian for finite-differencing
%???????????????[ sparse matrix ]
%LargeScale - Use large-scale algorithm if possible [ {on} | off ]
%LevenbergMarquardt - Chooses Levenberg-Marquardt over Gauss-Newton algorithm
%?????????????????????[ on | off]
%LineSearchType - Line search algorithm choice [ cubicpoly | {quadcubic} ]
%MaxFunEvals - Maximum number of function evaluations allowed
%?????????????????????[ positive integer ]
%MaxIter - Maximum number of iterations allowed [ positive integer ]
%MaxPCGIter - Maximum number of PCG iterations allowed [positive integer]
%MeritFunction - Use goal attainment/minimax merit function
%?????????????????????[ {multiobj} | singleobj ]
%MinAbsMax - Number of F(x) to minimize the worst case absolute values
%?????????????????????[ positive scalar integer | {0} ]
%PrecondBandWidth - Upper bandwidth of preconditioner for PCG
%????????????????????[ positive integer | Inf | {0} ]
%TolCon - Termination tolerance on the constraint violation [ positive scalar ]
%TolFun - Termination tolerance on the function value [ positive scalar ]
%TolPCG - Termination tolerance on the PCG iteration
%?????????[ positive scalar | {0.1} ]
%TolX - Termination tolerance on X [ positive scalar ]
%TypicalX - Typical X values [ vector ]
---------------------------------------------------------------------------------------------
注:
優(yōu)化問(wèn)題求解時(shí)常常需要對(duì)相對(duì)誤差,使用算法等進(jìn)行設(shè)置.Matlab提供了options向量來(lái)對(duì)優(yōu)化函數(shù)進(jìn)行參數(shù)設(shè)置,options向來(lái)由18個(gè)元素.目前已經(jīng)被optimset和optimget代替,詳情可查閱函數(shù)optimset和optimget
下面逐個(gè)說(shuō)明各個(gè)參數(shù)的功能和取值.
Options(1)=0(默認(rèn)值)
功能:控制顯示,優(yōu)化過(guò)程中控制輸出信息,0表示不顯示;1表示顯示;-1表隱藏信息.
Options(2)=1e-4
功能:控制x的精度,自變量x的最低精度終止條件.當(dāng)所有終止條件都滿(mǎn)足的時(shí)候,優(yōu)化終止.
Options(3)=1e-4
功能:控制 f?精度,目標(biāo)函數(shù)f的最低精度終止條件.當(dāng)所有終止條件都滿(mǎn)足的時(shí)候,優(yōu)化終止.
options(4)=1e-7
功能:約束g的最低精度終止判別條件.當(dāng)所有的終止條件都滿(mǎn)足的時(shí)候,優(yōu)化終止.
options(5)=0
功能:選擇主要優(yōu)化算法.
options(6)=0
功能:SD算法控制.選擇搜索方向算法.
options(7)=0
功能:搜索算法控制.選擇線(xiàn)性搜索算法.
options(8)=N/A
功能:函數(shù)值,算法結(jié)束時(shí)極值點(diǎn)的函數(shù)值,attgoal和minimax而言,它包含一個(gè)到達(dá)因子.
options(9)=0
功能:梯度檢查控制.當(dāng)值為1時(shí),在最初的幾個(gè)迭代周期,梯度將與有限差分計(jì)算的結(jié)果比較,此時(shí),梯度函數(shù)必須存在.
options(10)=N/A
功能:函數(shù)計(jì)算計(jì)數(shù).
options(11)=N/A
功能:梯度計(jì)算計(jì)數(shù).
options(12)=N/A
功能:限定計(jì)數(shù),限定函數(shù)梯度計(jì)算或差分梯度計(jì)算的次數(shù).
options(13)=0
功能:等式約束個(gè)數(shù),等式約束必須放在g的前幾個(gè)元素中.
options(14)=0*n
功能:最大迭代次數(shù),該值缺省時(shí)被置為n的100倍,n為自變量x的個(gè)數(shù),在fmins中,缺省為n的200倍,在fminu中,為500n.
options(15)=0
功能:目標(biāo)數(shù),盡可能接近goals的目標(biāo)數(shù),由函數(shù)attgoal使用.
options(16)=1e-8
功能:最小攝動(dòng)控制.有限差分梯度計(jì)算中的最小變化.對(duì)函數(shù)的梯度計(jì)算而言,實(shí)際使用的攝動(dòng)將自動(dòng)調(diào)整以提高精度,它將在最小攝動(dòng)和最大攝動(dòng)之間變化.
options(17)=0,1
有限差分梯度計(jì)算中變量的最大變化.
options(18)=N/A
功能:步長(zhǎng)控制,在第一步迭代被賦值為1或更小
http://blog.sina.com.cn/s/blog_68b0c65f0100mq5m.html
http://www.ilovematlab.cn/thread-99442-1-1.html
總結(jié)
以上是生活随笔為你收集整理的Matlab优化函数中options选项的修改的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Machine Learning 网络资
- 下一篇: [OpenCV] -- win7下配置O