Matlab 梯度下降的所有权重在特征展开时变为0

Matlab 梯度下降的所有权重在特征展开时变为0,matlab,machine-learning,gradient-descent,Matlab,Machine Learning,Gradient Descent,我有两个功能,我将其展开,以包含订单6下两个功能的所有可能组合。当我执行MATLAB的fminunc时,它返回一个权重向量,其中所有元素都是0 数据集是 数据包含两列行,后跟第三列0/1值 使用的函数是:newfeature返回扩展的功能,并regcostfunction计算成本。当我对默认功能使用相同的方法时,它起到了作用,我认为这里的问题与一些编码问题有关。您是否也可以发布您的函数,否则我们无法重现您描述的行为您需要定义问题。如果它不是凹形,梯度下降将不起作用。或者你的代码有问题。但是我们需

我有两个功能,我将其展开,以包含订单6下两个功能的所有可能组合。当我执行MATLAB的
fminunc
时,它返回一个权重向量,其中所有元素都是0

数据集是

数据
包含两列行,后跟第三列0/1值


使用的函数是:
newfeature
返回扩展的功能,并
regcostfunction
计算成本。当我对默认功能使用相同的方法时,它起到了作用,我认为这里的问题与一些编码问题有关。

您是否也可以发布您的函数,否则我们无法重现您描述的行为您需要定义问题。如果它不是凹形,梯度下降将不起作用。或者你的代码有问题。但是我们需要有足够的时间@我编辑了大卫,以复制error@user3656142我不确定是否存在编码问题,当前发布的代码正在工作,并且在更改
new_data=newfeature(数据(:,1),数据(:,2),X)时也是如此X=2,3,4权重不都是0(但对于X=5,6,7..),它们都是。我认为在做了
newfeature()
之后,问题不再是凸的,因此停留在起点0是的,我认为当我有太多的特征时,一些数学特征的权重变为)。对于有限的特征,权重是非零的@戴维斯:谢谢你检查代码。
clear all;
clc;
data = load("P2-data1.txt");
m = length(data);
para = 0; % regularization parameter

%% Augment Feature
y = data(:,3);
new_data = newfeature(data(:,1), data(:,2), 3);

[~, n] = size(new_data);
betas1 = zeros(n,1); % initial weights
options = optimset('GradObj', 'on', 'MaxIter', 400);
[beta_new, cost] = fminunc(@(t)(regucostfunction(t, new_data, y, para)), betas1, options);

fprintf('Cost at theta found by fminunc: %f\n', cost);
fprintf('theta: \n');
fprintf(' %f \n', beta_new); % get all 0 here
% Compute accuracy on our training set
p_new = predict(beta_new, new_data);
fprintf('Train Accuracy after feature augmentation: %f\n', mean(double(p_new == y)) * 100);
fprintf('\n');

%% the functions are defined below
function g = sigmoid(z) % running properly

    g = zeros(size(z));
    g=ones(size(z))./(ones(size(z))+exp(-z));
end

function [J,grad] = regucostfunction(theta,x,y,para) % CalculateCost(x1,betas1,y);
    m = length(y); % number of training examples
    J = 0;
    grad = zeros(size(theta));
    hyp = sigmoid(x*theta);
    err = (hyp - y)';
    grad = (1/m)*(err)*x;
    sum = 0;
    for k = 2:length(theta)
        sum = sum+theta(k)^2;
    end
    J = (1/m)*((-y' * log(hyp) - (1 - y)' * log(1 - hyp)) + para*(sum) );
end

function p = predict(theta, X)
    m = size(X, 1); % Number of training examples
    p = zeros(m, 1);
    index = find(sigmoid(theta'*X') >= 0.5);
    p(index,1) = 1;
end

function out = newfeature(X1, X2, degree)
    out = ones(size(X1(:,1)));
    for i = 1:degree
        for j = 0:i
            out(:, end+1) = (X1.^(i-j)).*(X2.^j);
        end
    end

end