八度音节“信任区域变得过小”

时间:2018-08-01 00:17:03

标签: 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];
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

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

上面的代码存在一些问题:

使用功能键意味着您不必提供Alpha。从代码中删除它的所有实例,您的渐变函数应如下所示

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

grad = grad + ((lambda / m) * theta);  % This isn't quite correct, see below

在grad的正则化中,您不能使用theta,因为您没有为j = 0添加theta。有很多方法可以做到这一点,但这是一个

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)) );

最后,作为单位,lambda值为0表示您的正则化不执行任何操作。