Optimization 倍频程fminunc“;“信任区域变得过小”;

Optimization 倍频程fminunc“;“信任区域变得过小”;,optimization,octave,region,trust,Optimization,Octave,Region,Trust,我正在尝试使用fminunc运行线性回归来优化我的参数。然而,虽然代码从未失败,但fminunc函数似乎只运行一次,不会收敛。fminunc函数返回的退出标志是-3,根据文档,这意味着“信赖域半径变得过小”。这意味着什么?我如何修复它 这是我的主要观点: load('data.mat'); % returns matrix X, a matrix of data % Initliaze parameters [m, n] = size(X); X = [ones(m, 1), X]; init

我正在尝试使用fminunc运行线性回归来优化我的参数。然而,虽然代码从未失败,但fminunc函数似乎只运行一次,不会收敛。fminunc函数返回的退出标志是-3,根据文档,这意味着“信赖域半径变得过小”。这意味着什么?我如何修复它

这是我的主要观点:

load('data.mat');
% returns matrix X, a matrix of data

% Initliaze parameters
[m, n] = size(X);
X = [ones(m, 1), X];
initialTheta = zeros(n + 1, 1); 
alpha = 1;
lambda = 0;

costfun = @(t) costFunction(t, X, surv, lambda, alpha);
options = optimset('GradObj', 'on', 'MaxIter', 1000);
[theta, cost, info] = fminunc(costfun, initialTheta, options);
以及成本函数:

function [J, grad] = costFunction(theta, X, y, lambda, alpha)

%COSTFUNCTION Implements a logistic regression cost function.
%   [J grad] = COSTFUNCTION(initialParameters, X, y, lambda) computes the cost
%   and the gradient for the logistic regression. 
% 

m = size(X, 1);

J = 0;
grad = zeros(size(theta));

% un-regularized
z = X * theta;
J = (-1 / m) * y' * log(sigmoid(z)) + (1 - y)' * log(1 - sigmoid(z));
grad = (alpha / m) * X' * (sigmoid(z) - y);

% regularization
theta(1) = 0;
J = J + (lambda / (2 * m)) * (theta' * theta);
grad = grad + alpha * ((lambda / m) * theta);

endfunction

非常感谢您的帮助。

以上代码存在一些问题:

使用fminunc意味着您不必提供alpha。从代码中删除它的所有实例,梯度函数应该如下所示

grad = (1 / m) * X' * (sigmoid(z) - y);

在梯度的正则化过程中,不能使用θ,因为对于j=0,不能加θ。有很多方法可以做到这一点,但这里有一个

temp = theta;
temp(1) = 0;
grad = grad + ((lambda / m) * temp);
您的成本函数缺少一组括号。(-1/m)仅适用于方程式其余部分。应该是这样的

J = (-1 / m) * ( y' * log(sigmoid(z)) + (1 - y)' * log(1 - sigmoid(z)) );

最后,作为nit,lambda值为0意味着正则化不起任何作用。

我不知道如何解决这个问题,但我怀疑数学上发生的是,函数的行为方式不可预测,因此该方法无法找到合适的解决方案,而是不断“缩小”信任区域,因为每个结果都比前一个结果更糟糕,直到它决定信任区域变得太小而没有任何实际用途。这可能只是因为如果你选择一个不同的起点远离问题区域,算法可能会表现得更好,从而收敛;你的函数肯定是一个连续可微函数,还是有间断性?另请注意fminunc中的位,该位表示
应用注意:如果目标函数是一个单变量非线性方程,则使用fminbnd通常是一个更好的选择。
如果函数具有不连续性,则最好使用无导数算法,如fminsearch。
α和在代码运行后,我刚刚将lambda放在0中进行优化。我看到我弄乱了括号,当我修复代码运行并产生新错误时,我将进行调查,但它似乎解决了信任区域问题。我认为缺少括号是导致函数无法收敛的原因。我已经接受了你的答案,并投了赞成票,但我的网站声誉的缺乏导致它没有显示。谢谢你的帮助!您的问题可能是alpha对于数据集来说太大。试试小一点的
J = (-1 / m) * ( y' * log(sigmoid(z)) + (1 - y)' * log(1 - sigmoid(z)) );