Octave fminunc 不收敛

Octave fminunc doesn't converge

我试图在 Octave 中使用 fminunc 来解决逻辑问题,但它不起作用。它说我没有定义变量,但实际上我定义了。如果我直接在 costFunction 中定义变量,而不是在 main 中,它不会产生任何问题,但该函数实际上不起作用。事实上 exitFlag 等于 -3 并且根本不收敛。

这是我的函数:

function [jVal, gradient] = cost(theta, X, y)

X = [1,0.14,0.09,0.58,0.39,0,0.55,0.23,0.64;1,-0.57,-0.54,-0.16,0.21,0,-0.11,-0.61,-0.35;1,0.42,0.45,-0.41,-0.6,0,-0.44,0.38,-0.29];
y = [1;0;1];
theta = [0.8;0.2;0.6;0.3;0.4;0.5;0.6;0.2;0.4];


jVal = 0;
jVal = costFunction2(X, y, theta);   %this is another function that gives me jVal. I'm quite sure it is 
                                     %correct because I use it also with other algorithms and it  
                                     %works perfectly
m = length(y);
xSize = size(X, 2);
gradient = zeros(xSize, 1);
sig = X * theta;
h = 1 ./(1 + exp(-sig));
  
  for i = 1:m
  
    for j = 1:xSize    
    gradient(j) =  (1/m) * sum(h(i) - y(i)) .* X(i, j);      
    end
    
   end

这是我的主要内容:

theta = [0.8;0.2;0.6;0.3;0.4;0.5;0.6;0.2;0.4];
options = optimset('GradObj', 'on', 'MaxIter', 100);
[optTheta, functionVal, exitFlag] = fminunc(@cost, theta, options)

如果我编译它:

optTheta =

   0.80000
   0.20000
   0.60000
   0.30000
   0.40000
   0.50000
   0.60000
   0.20000
   0.40000

functionVal =  0.15967
exitFlag = -3

我该如何解决这个问题?

您实际上没有正确使用 fminunc。来自文档:

 -- fminunc (FCN, X0)
 -- fminunc (FCN, X0, OPTIONS)

     FCN should accept a vector (array) defining the unknown variables,
     and return the objective function value, optionally with gradient.
     'fminunc' attempts to determine a vector X such that 'FCN (X)' is a
     local minimum.

您传递的不是接受单个向量参数的函数句柄。相反,您传递的(即 @cost)是一个函数句柄,该函数接受 三个 个参数。

您需要将此 'convert' 转换为仅需要 一个 输入的函数句柄,并在后台执行您想要的操作。最简单的方法是将成本函数 'wrapping' 转换为只接受一个参数的匿名函数,并以适当的方式调用 cost 函数,例如

fminunc( @(t) cost(t, X, y), theta, options )

注意:这假设 X 和 y 是在您执行此操作的范围内定义的 'wrapping' 业务