如何使用梯度下降来解决逻辑回归?

时间:2015-04-03 09:07:13

标签: artificial-intelligence octave logistic-regression gradient-descent

我正在解决机器学习在线课程表格课程的练习。问题陈述是:

假设一所高中有一个数据集,代表4​​0名入读大学的学生和40名未被录取的学生。每个( x(i), y(i) )培训示例包含学生在两个标准化考试中的分数以及该学生是否被录取的标签。

我们的任务是建立一个二元分类模型,根据学生在两门考试中的分数来估算大学入学机会。在training data

一个。 x数组的第一列代表所有Test 1分数,第二列代表所有Test 2分数。

y向量使用“1”标记被录取的学生,使用“0”标记未被录取的学生。

我通过使用名为fminunc的预定义函数解决了这个问题。现在,我通过使用梯度下降来解决它,但我的成本与迭代次数的图表不是对话,即成本函数值不随着迭代次数而减少。我的theta值也与我应该得到的答案不匹配。

我得到的theta值:

  

[ - 0.085260 0.047703 -0.022851]

我应该得到的theta值(回答):

  

[ - 16.38 0.1483 0.1589]

我的源代码:

clear ; close all; clc
x = load('/home/utlesh/Downloads/ex4x.txt'); 
y = load('/home/utlesh/Downloads/ex4y.txt');
theta = [0,0,0];
alpha = 0.00002;
a = [0,0,0];
m = size(x,1);

x = [ones(m,1) x];
n = size(x,2);
y_hyp = y*ones(1,n);

for kk = 1:100000
  hyposis = 1./(1 + exp(-(x*theta')));
  x_hyp = hyposis*ones(1,n);
  theta = theta - alpha*1/m*sum((x_hyp - y_hyp).*x);
  a(kk,:) = theta ;
end

cost = [0];
for kk = 1:100000
  h = 1./(1 + exp(-(x*a(kk,:)')));
  cost(kk,:) = sum(-y .* log(h) - (1 - y) .* log(1 - h));
end

x_axis = [0];
for kk = 1:100000
  x_axis(kk,:) = kk;
end

plot(x_axis,cost);

我得到的图形看起来像1 / x;

请告诉我我在哪里做错了。如果有什么我误解的请告诉我。

1 个答案:

答案 0 :(得分:0)

我可以看到缺少的是学习率和权重的使用。可以在线和批量两种模式调整权重。

权重应在[-0.01,0.01]之间随机分配。在我的硕士学位期间,我做了一次练习作为我的HW的一部分。以下是摘录:

将值分配给[-0.01,0.01]之间的权重,即不。重量值将是,否。功能+ 1:

weights = -.01 + 0.02 * rand(3,1);
learnRate = 0.001;

这里运行设定迭代次数的代码:(它也在100次迭代中收敛)。

while iter < 100
    old_output = new_output;
    delta = zeros(cols-1,1);
        for t = 1:rows
           input = 0;
           for j = 1:cols-1 
               input = input + weights(j) * numericdata(t,j);
           end
           new_output(t) = (1 ./ (1 + exp(-input)));
           for j = 1:cols-1 
               delta(j) = delta(j) + (numericdata(t,4)-new_output(t)) * numericdata(t,j);
           end
        end

#Adjusting weights (Batch Mode):

    for j=1:cols-1
        weights(j) = weights(j) + learnRate * (delta(j));
    end

    error = abs(numericdata(:,4) - new_output);
    errorStr(i) = (error(:));
    error = 0;
    iter = iter + 1;
    i = i + 1;
end

另外,我在研究时与我的教授进行了交谈。他说,如果给定的数据集具有收敛的属性,那么当你随机运行不同的迭代次数时,你会看到它。