使用梯度下降法的逻辑回归

我正在尝试使用梯度下降法实现逻辑回归,

我得到了迭代次数的成本函数 j_theta,幸运的是,当我将 j_theta 与迭代次数绘制成图时,j_theta 正在减少。

我使用的数据集如下所示:

x=1   20   301   40   601   70   301   50   501   50   401   60   401   30   401   40   501   10   201   30   401   70   70y=   0     1     1     1     0     1     0     0     0     0     1

我设法编写的使用梯度下降法的逻辑回归代码如下:

%1. 下面的代码将加载桌面上的数据到octave内存x=load('stud_marks.dat');%y=load('ex4y.dat');y=x(:,3);x=x(:,1:2);%2. 现在我们想要在矩阵中添加一列x0,所有行的值都为1。%首先获取长度[m,n]=size(x);x=[ones(m,1),x];X=x;%   现在我们限制x1和x2,我们需要跳过第一列x0,因为它们应该保持为1.mn = mean(x);sd = std(x);x(:,2) = (x(:,2) - mn(2))./ sd(2);x(:,3) = (x(:,3) - mn(3))./ sd(3);% 我们不会使用向量化技术,因为它难以调试,我们将尝试使用更多的for循环而不是max_iter=50;theta = zeros(size(x(1,:)))'; j_theta=zeros(max_iter,1);         for num_iter=1:max_iter  % 我们计算成本函数  j_cost_each=0;  alpha=1;  theta    for i=1:m        z=0;        for j=1:n+1%            theta(j)            z=z+(theta(j)*x(i,j));              z        end        h= 1.0 ./(1.0 + exp(-z));        j_cost_each=j_cost_each + ( (-y(i) * log(h)) -  ((1-y(i)) * log(1-h)) );  %       j_cost_each    end      j_theta(num_iter)=(1/m) * j_cost_each;    for j=1:n+1        grad(j) = 0;        for i=1:m            z=(x(i,:)*theta);              z                        h=1.0 ./ (1.0 + exp(-z));            h            grad(j) += (h-y(i)) * x(i,j);         end        grad(j)=grad(j)/m;        grad(j)        theta(j)=theta(j)- alpha * grad(j);    endend      figureplot(0:1999, j_theta(1:2000), 'b', 'LineWidth', 2)hold offfigure%3. 在这一步中,我们将绘制给定输入数据集的图表,只是为了查看两个类别的分布情况。pos = find(y == 1);  % 这将从y中获取所有值为1的类的位置或数组编号 neg = find(y == 0);  % 同样,这将从y中获取所有值为0的类的位置或数组编号 % 现在我们绘制x1与x2的图表,对于y=1和y=0plot(x(pos, 2), x(pos,3), '+'); hold onplot(x(neg, 2), x(neg, 3), 'o');xlabel('x1 marks in subject 1')ylabel('y1 marks in subject 2')legend('pass', 'Failed')plot_x = [min(x(:,2))-2,  max(x(:,2))+2];     % 这个min和max决定了决策图的长度。% 计算决策边界线plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1));plot(plot_x, plot_y)hold off%%%%%%% 唯一的区别是,在最后的绘图中我使用了X,而现在我使用的是特征缩放后的x %%%%%%%%%%%

如果你查看x1与x2的图表,图表看起来会像这样,

enter image description here

运行我的代码后,我创建了一个决策边界。决策线的形状看起来还可以,但它有点偏移。x1与x2的图表以及决策边界如下所示:

![enter image description here][2]

请建议我哪里做错了….

谢谢:)

新图表::::

![enter image description here][1]如果你看到新图表,x轴的坐标已经改变了.....这是因为我使用了特征缩放后的x而不是X。 

回答:

问题在于你的成本函数计算和/或梯度计算,你的绘图函数没有问题。我在我的逻辑回归算法中运行了你的数据集,但我使用了向量化技术,因为在我看来它更容易调试。我得到的theta的最终值是

theta = [-76.4242, 0.8214, 0.7948]我还使用了 alpha = 0.3

我绘制了决策边界,看起来很好,我建议使用向量化形式,因为在我看来它更容易实现和调试。

Decision Boundary

我还认为你的梯度下降法实现不太正确。50次迭代是不够的,最后一次迭代的成本也不够好。也许你应该尝试运行更多的迭代,并设置一个停止条件。还可以查看这个关于优化技术的讲座。https://class.coursera.org/ml-006/lecture/37

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注