無約束最優化 fminunc
求無約束多變量函數的最小值
語法
x = fminunc(fun,x0) % 最基本的用法,給定起始點求出局部最優解
x = fminunc(fun,x0,options) % 添加參數 options,指定一些如‘最優化方式’,‘迭代次數’等信息
x = fminunc(problem) % 用於求解問題矩陣
[x,fval] = fminunc(___) % 略
[x,fval,exitflag,output] = fminunc(___) % 略
[x,fval,exitflag,output,grad,hessian] = fminunc(___) % 略
以求解logistic regression問題下的代價函數為例。
在運用梯度下降時,操作如下
\[\left\{ \begin{align} J(\theta) &= -\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\log(h_\theta(x)) + (1-y^{(i)})\log(1-h_\theta(x))) + \frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^2 \\ \theta_j &= \theta_j - \alpha * \frac{\part{J(\theta)}}{\part{\theta_j}} \end{align} \right. \]
運用fminunc函數不需要自定義梯度下降的求法,但需要為fminunc提供
-
函數句柄
% 實現定義 costFunction % function [J,grad] = costFunction(theta,X,y,lambda) % % % 創建句柄,自變量定為 t fun = @(t) costFunction(t,X,y,lambda);
-
初始theta值
% 對於簡單的Logistic Regression,只需要將theta矩陣全部置0即可 % 需要提前將X添加 x0 屬性 % % Init_theta = zeros(size(X,2),1);
-
操作參數
% options 中 'GradObj' 指定 fminunc 的求解最優化方式為 '梯度下降' , 'MaxIter' 指定迭代次數為400 options = optimset('GradObj', 'on', 'MaxIter', 400);
運用fminuc
[theta, J, exit_flag] = ...
fminunc(@(t)(costFunction(t, x, y, lambda)), initial_theta, options);