八度 fminunc "trust region become excessively small"
Octave fminunc "trust region become excessively small"
我正在尝试 运行 使用 fminunc 的线性回归来优化我的参数。然而,虽然代码永远不会失败,但 fminunc 函数似乎只 运行ning 一次并且没有收敛。 fminunc 函数 returns 的退出标志是 -3,根据文档,这意味着 "The trust region radius became excessively small"。这是什么意思,我该如何解决?
这是我的主要内容:
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);
和
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)) );
最后,作为 nit,lambda 值为 0 意味着您的正则化不执行任何操作。
我正在尝试 运行 使用 fminunc 的线性回归来优化我的参数。然而,虽然代码永远不会失败,但 fminunc 函数似乎只 运行ning 一次并且没有收敛。 fminunc 函数 returns 的退出标志是 -3,根据文档,这意味着 "The trust region radius became excessively small"。这是什么意思,我该如何解决?
这是我的主要内容:
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);
和
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)) );
最后,作为 nit,lambda 值为 0 意味着您的正则化不执行任何操作。