Matlab 比较函数fminunc和BFGS方法进行logistic回归
我正在构建一个算法,它使用BFGS方法来寻找八度二进制数据集的逻辑回归中的参数 现在,我正在努力解决一个我认为是不合适的问题。我对几个数据集运行了该算法,它实际上收敛到与倍频程的fminunc函数相同的结果。然而,对于一种特殊的“数据集类型”,该算法收敛到非常高的参数值,这与fminunc相反,fminunc给出了这些参数的可调值。我添加了一个正则化项,我实际上实现了我的算法收敛到相同的fminunc值 这种特殊类型的数据集具有可以用直线完全分隔的数据。我的问题是:为什么这对BFGS方法来说是个问题,而对fminunc来说不是问题?如果没有正则化,该函数如何避免此问题?我可以在我的算法中实现这个吗 我的算法代码如下:Matlab 比较函数fminunc和BFGS方法进行logistic回归,matlab,machine-learning,octave,cross-validation,Matlab,Machine Learning,Octave,Cross Validation,我正在构建一个算法,它使用BFGS方法来寻找八度二进制数据集的逻辑回归中的参数 现在,我正在努力解决一个我认为是不合适的问题。我对几个数据集运行了该算法,它实际上收敛到与倍频程的fminunc函数相同的结果。然而,对于一种特殊的“数据集类型”,该算法收敛到非常高的参数值,这与fminunc相反,fminunc给出了这些参数的可调值。我添加了一个正则化项,我实际上实现了我的算法收敛到相同的fminunc值 这种特殊类型的数据集具有可以用直线完全分隔的数据。我的问题是:为什么这对BFGS方法来说是个
function [beta] = Log_BFGS(data, L_0)
clc
close
%************************************************************************
%************************************************************************
%Loading the data:
[n, e] = size(data);
d = e - 1;
n; %Number of observations.
d; %Number of features.
Y = data(:, e); %Labels´ values
X_o = data(:, 1:d);
X = [ones(n, 1) X_o]; %Features values
%Initials conditions:
beta_0 = zeros(e, 1);
beta = [];
beta(:, 1) = beta_0;
N = 600; %Max iterations
Tol = 1e-10; %Tolerance
error = .1;
L = L_0; %Regularization parameter
B = eye(e);
options = optimset('GradObj', 'on', 'MaxIter', 600);
[beta_s] = fminunc(@(t)(costFunction(t, X, Y, L)), beta_0, options);
disp('Beta obtained with the fminunc function');
disp("--------------");
disp(beta_s)
k = 1;
a_0 = 1;
% Define the sigmoid function
h = inline('1.0 ./ (1.0 + exp(-z))');
while (error > Tol && k < N)
beta_k = beta(:, k);
x_0 = X*beta_k;
h_0 = h(x_0);
beta_r = [0 ; beta(:, k)(2:e, :)];
g_k = ((X)'*(h_0 - Y) + L*beta_r)/n;
d_k = -pinv(B)*g_k;
a = 0.1; %I´ll implement an Armijo line search here (soon)
beta(:, k+1) = beta(:, k) + a*d_k;
beta_k_1 = beta(:, k+1);
x_1 = X*beta_k_1;
h_1 = h(x_1);
beta_s = [0 ; beta(:, k+1)(2:e, :)];
g_k_1 = (transpose(X)*(h_1 - Y) + L*beta_s)/n;
s_k = beta(:, k+1) - beta(:, k);
y_k = g_k_1 - g_k;
B = B - B*s_k*s_k'*B/(s_k'*B*s_k) + y_k*y_k'/(s_k'*y_k);
k = k + 1;
error = norm(d_k);
endwhile
%Accuracy of the logistic model:
p = zeros(n, 1);
for j = 1:n
if (1./(1. + exp(-1.*(X(j, :)*beta(:, k)))) >= 0.5)
p(j) = 1;
else
p(j) = 0;
endif
endfor
R = mean(double(p == Y));
beta = beta(:, k);
%Showing the results:
disp("Estimation of logistic regression model Y = 1/(1 + e^(beta*X)),")
disp("using the algorithm BFGS =")
disp("--------------")
disp(beta)
disp("--------------")
disp("with a convergence error in the last iteration of:")
disp(error)
disp("--------------")
disp("and a total number of")
disp(k-1)
disp("iterations")
disp("--------------")
if k == N
disp("The maximum number of iterations was reached before obtaining the desired error")
else
disp("The desired error was reached before reaching the maximum of iterations")
endif
disp("--------------")
disp("The precision of the logistic regression model is given by (max 1.0):")
disp("--------------")
disp(R)
disp("--------------")
endfunction
function[beta]=Log\u BFGS(数据,L\u 0)
clc
关闭
%************************************************************************
%************************************************************************
%加载数据:
[n,e]=尺寸(数据);
d=e-1;
n、 %观察次数。
d、 %功能的数量。
Y=数据(:,e);%标签价值
X_o=数据(:,1:d);
X=[一(n,1)X_o];%特征值
%首字母缩写条件:
beta_0=零(e,1);
β=[];
β(:,1)=β0;
N=600;%最大迭代次数
Tol=1e-10;%容忍
误差=.1;
L=L_0;%正则化参数
B=眼睛(e);
options=optimset('GradObj','on','MaxIter',600);
[beta_s]=fminunc(@(t)(成本函数(t,X,Y,L)),beta_0,选项);
disp(“使用fminunc函数获得的Beta”);
disp(“--------------”;
显示(测试版)
k=1;
a_0=1;
%定义sigmoid函数
h=内联('1.0./(1.0+exp(-z)));
而(错误>Tol&&k=0.5)
p(j)=1;
其他的
p(j)=0;
恩迪夫
外循环
R=平均值(双(p==Y));
β=β(:,k);
%显示结果:
disp(“逻辑回归模型的估计Y=1/(1+e^(β*X)),”)
disp(“使用算法BFGS=”)
disp(“--------------”)
显示(测试版)
disp(“--------------”)
disp(“在最后一次迭代中出现收敛错误:”)
显示(错误)
disp(“--------------”)
disp(“和总数”)
disp(k-1)
disp(“迭代”)
disp(“--------------”)
如果k==N
disp(“在获得所需错误之前已达到最大迭代次数”)
其他的
disp(“在达到最大迭代次数之前已达到所需的错误”)
恩迪夫
disp(“--------------”)
disp(“逻辑回归模型的精度由(max 1.0)给出):”
disp(“--------------”)
显示(R)
disp(“--------------”)
端功能
我得到的数据集结果如下图所示。如果您需要在这种情况下使用的数据,请让我知道
检查目标
解向量的值很好,但整个优化是由目标驱动的。您说的是fminunc,它给出了这些参数的合理值
,但该模型中未定义合理值。
这不是不可能的,您的低价值和高价值解决方案都允许几乎相同的目标。而这正是那些求解者唯一关心的(当使用无调节项时)
因此,重要的问题是:是否有一个独特的解决方案(应该禁止这些结果)?仅当您的数据集具有满秩时!因此,可能您的数据排名不足,您得到了两个同样好的解决方案。当然,由于数值问题,可能会有细微的差异,而数值问题始终是误差的来源,尤其是在更复杂的优化算法中 检查目标
解向量的值很好,但整个优化是由目标驱动的。您说的是fminunc,它给出了这些参数的合理值
,但该模型中未定义合理值。
这不是不可能的,您的低价值和高价值解决方案都允许几乎相同的目标。而这正是那些求解者唯一关心的(当使用无调节项时)
因此,重要的问题是:是否有一个独特的解决方案(应该禁止这些结果)?仅当您的数据集具有满秩时!因此,可能您的数据排名不足,您得到了两个同样好的解决方案。当然,由于数值问题,可能会有细微的差异,而数值问题始终是误差的来源,尤其是在更复杂的优化算法中 我明白你的意思。我已经读到,若数据是线性可分的,那个么模型的权重趋于无穷大,这会导致过度拟合。用正则化惩罚高权重可以防止这种情况。正则化参数控制数据拟合良好和具有良好正则化/小权重之间的折衷。Fminunc似乎可以避免在没有正则化的情况下过度拟合,这就是我想弄明白的。当我在代价函数中使用适当的L值时,我的算法和fminunc得到了相同的答案。我已经给出了我的推理,涵盖了你的问题。不要将正则化模型与非正则化模型进行比较。阿尔索