我正在尝试使用梯度下降法实现逻辑回归,
我得到了迭代次数的成本函数 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的图表,图表看起来会像这样,
运行我的代码后,我创建了一个决策边界。决策线的形状看起来还可以,但它有点偏移。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
我绘制了决策边界,看起来很好,我建议使用向量化形式,因为在我看来它更容易实现和调试。
我还认为你的梯度下降法实现不太正确。50次迭代是不够的,最后一次迭代的成本也不够好。也许你应该尝试运行更多的迭代,并设置一个停止条件。还可以查看这个关于优化技术的讲座。https://class.coursera.org/ml-006/lecture/37