UFLDL新版教程与编程练习(二):Logistic Regression(逻辑斯蒂回归)

UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!

有人对这一篇也有翻译,可以看一下

第二节是:Logistic Regression(逻辑回归)

我们之前看过的Linear Regression(线性回归)是争对连续值预测的,但是这并不能很好地处理二分类问题,也就是 y ( i ) ∈ { 0 , 1 } y^{(i)} \in\{0,1\} y(i){0,1}的问题。我们就需要使用另外一个“hypothesis class”来预测当给了一个样本,有多少的可能性它是属于0还是属于1,其实“逻辑回归”名字上有回归二字,其实是一个分类算法。以下是要学习的函数:
P ( y = 1 ∣ x ) = h θ ( x ) = 1 1 + exp ⁡ ( − θ ⊤ x ) ≡ σ ( θ ⊤ x ) P ( y = 0 ∣ x ) = 1 − P ( y = 1 ∣ x ) = 1 − h θ ( x ) \begin{array}{l}{P(y=1 | x)=h_{\theta}(x)=\frac{1}{1+\exp \left(-\theta^{\top} x\right)} \equiv \sigma\left(\theta^{\top} x\right)} \\ {P(y=0 | x)=1-P(y=1 | x)=1-h_{\theta}(x)}\end{array} P(y=1x)=hθ(x)=1+exp(θx)1σ(θx)P(y=0x)=1P(y=1x)=1hθ(x)
其中的 σ ( z ) ≡ 1 1 + exp ⁡ ( − z ) \sigma(z) \equiv \frac{1}{1+\exp (-z)} σ(z)1+exp(z)1就是大名鼎鼎的sigmoid函数,输出介于0和1之间,所以我们也可以把 h θ ( x ) h_{\theta}(x) hθ(x)理解为 y = 1 y=1 y=1的概率, 1 − h θ ( x ) 1-h_{\theta}(x) 1hθ(x)就是 y = 0 y=0 y=0的概率。

我们要优化的目标函数是这样的,是一个二分类的交叉熵:
J ( θ ) = − ∑ i ( y ( i ) log ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ) J(\theta)=-\sum_{i}\left(y^{(i)} \log \left(h_{\theta}\left(x^{(i)}\right)\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right) J(θ)=i(y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i))))
可以分析得到,当 y ( i ) ∈ 1 y^{(i)}\in1 y(i)1的时候,要减少cost的值的话,那就得让 h θ ( x ( i ) ) h_{\theta}\left(x^{(i)}\right) hθ(x(i))增大,即让 y y y是1的概率增大; y ( i ) ∈ 0 y^{(i)}\in0 y(i)0的时候亦然。

我们可以推导出梯度的表达式和线性回归里面一样,一开始我也很惊讶,后来推了一下确实是如此的,大伙可以自己推一下,实在不明白下面留言。只是这里的hypothesis function是 h θ ( x ) = σ ( θ ⊤ x ) h_{\theta}(x)=\sigma\left(\theta^{\top} x\right) hθ(x)=σ(θx),不再是线性回归里面的 h θ ( x ) = θ ⊤ x h_{\theta}(x)=\theta^{\top} x hθ(x)=θx
∂ J ( θ ) ∂ θ j = ∑ i x j ( i ) ( h θ ( x ( i ) ) − y ( i ) ) \frac{\partial J(\theta)}{\partial \theta_{j}}=\sum_{i} x_{j}^{(i)}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) θjJ(θ)=ixj(i)(hθ(x(i))y(i))
向量化的写法就是:
∇ θ J ( θ ) = ∑ i x ( i ) ( h θ ( x ( i ) ) − y ( i ) ) \nabla_{\theta} J(\theta)=\sum_{i} x^{(i)}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) θJ(θ)=ix(i)(hθ(x(i))y(i))
之后也是在logistic_regression.m文件中编写好损失函数和梯度,然后分别赋给 f f f g g g就可以运行ex1/ex1b_logreg.m了。
这是我的代码,里面的路径自己改一下,我用的是MATLAB2016a

function [f,g] = logistic_regression(theta, X,y)
  %
  % Arguments:
  %   theta - A column vector containing the parameter values to optimize.
  %   X - The examples stored in a matrix.  
  %       X(i,j) is the i'th coordinate of the j'th example.
  %   y - The label for each example.  y(j) is the j'th example's label.
  %

  m=size(X,2);
  n=size(X,1);
  % initialize objective value and gradient.
  f = 0;
  g = zeros(size(theta));


  %
  % TODO:  Compute the objective function by looping over the dataset and summing
  %        up the objective values for each example.  Store the result in 'f'.
  %
  % TODO:  Compute the gradient of the objective by looping over the dataset and summing
  %        up the gradients (df/dtheta) for each example. Store the result in 'g'.
  %
%%% MY CODE HERE %%%
h = inline('1./(1+exp(-z))');
% Calculate f
temp = zeros(1,m);
for i=1:m
    for j=1:n
        temp(i) = temp(i) + theta(j) * X(j,i);
    end
end
h_temp = h(temp);
for i = 1:m
    f = f - (y(i) * log(h_temp(i)) + (1-y(i)) * log(1-h_temp(i)));
end

% Calculate g
for j=1:n
    for i=1:m
        g(j) = g(j) + X(j,i) * (h_temp(i) - y(i));
    end
end

运行结果:
逻辑回归(非向量化)

有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laizi_laizi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值