吴恩达MachineLearning-week3

1.1 引出逻辑回归

虽然带着回归两字,但是它解决的是分类问题,而不是预测一段连续的值。

根据线性回归模型我们只能预测连续的值,然而对于分类问题,拿二分类举例,我们需要输出0或1,我们可以预测:

{h_\theta}\left( x \right)>=0.5时,预测 y=1 ;当{h_\theta}\left( x \right)<0.5时,预测 y=0

虽然上述描述看起来可以解决问题,但是这种模型当y>1时,模型也会因此改变,这时以0.5作为阈值就不合适了,说明线性模型并不适合解决这样的问题。

这时,我们引入一个新的模型,该模型的输出变量范围始终在0和1之间。 h_\theta \left( x \right)=g\left(\theta^{T}X \right) 其中: X 代表特征向量 g 代表逻辑函数(logistic function)或称为S形函数(Sigmoid function),公式为: g\left( z \right)=\frac{1}{1+{{e}^{-z}}}

python代码实现:

import numpy as np

def sigmoid(z):

  return 1 / (1 + np.exp(-z))
复制代码

该函数的图像为:

h_\theta \left( x \right)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity),即

h_\theta \left( x \right)=P\left( y=1|x;\theta \right)

例如,如果对于给定的x,通过已经确定的参数计算得出h_\theta \left( x \right)=0.7,则表示有70%的几率y为正向类,相应地y为负向类的几率为1-0.7=0.3。

1.2 代价函数

我们有了假设h(θ),如下图

对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将{h_\theta}\left( x \right)=\frac{1}{1+{e^{-\theta^{T}x}}}带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。

这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。

线性回归的代价函数为:J\left( \theta  \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{1}{2}{{\left( {h_\theta}\left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}} ;然后我们重新定义逻辑回归的代价函数为:

J\left( \theta  \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)},其中

{h_\theta}\left( x \right)Cost\left( {h_\theta}\left( x \right),y \right)之间的关系如下图所示:

这样构建的Cost\left( {h_\theta}\left( x \right),y \right)函数的特点是:

  • 当实际的 y=1{h_\theta}\left( x \right)也为 1 时误差为 0,当 y=1{h_\theta}\left( x \right)不为1时误差随着{h_\theta}\left( x \right)变小而变大;
  • 当实际的 y=0{h_\theta}\left( x \right)也为 0 时代价为 0,当y=0{h_\theta}\left( x \right)不为 0时误差随着 {h_\theta}\left( x \right)的变大而变大。

将构建的 Cost\left( {h_\theta}\left( x \right),y \right)简化如下: Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right) 带入代价函数J(\theta)后得到: J\left( \theta  \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{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)]} 提负号:J\left( \theta  \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{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)]}

Python代码实现:

import numpy as np

def cost(theta, X, y):

  theta = np.matrix(theta)
  X = np.matrix(X)
  y = np.matrix(y)
  first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
  second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
  return np.sum(first - second) / (len(X))
复制代码

1.3 梯度下降

在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:

Repeat {

\theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta)

(simultaneously update all )

}

求导后得到:

Repeat {

\theta_j := \theta_j - \alpha \frac{1}{m}\sum\limits_{i=1}^{m}{{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right)-\mathop{y}^{\left( i \right)} \right)}}\mathop{x}_{j}^{(i)}

(simultaneously update all )

}

所以,如果你有 n 个特征,也就是说:

,参数向量 \theta包括 {\theta_{0}} {\theta_{1}} {\theta_{2}} 一直到 {\theta_{n}},那么你就需要用这个式子。

推导过程:

J\left( \theta  \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{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)]} 考虑: {h_\theta}\left( {{x}^{(i)}} \right)=\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} 则: {{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) ={{y}^{(i)}}\log \left( \frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right) =-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^T}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^T}{{x}^{(i)}}}} \right)

所以: \frac{\partial }{\partial {\theta_{j}}}J\left( \theta  \right)=\frac{\partial }{\partial {\theta_{j}}}[-\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^{T}}{{x}^{(i)}}}} \right)]}] =-\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\frac{-x_{j}^{(i)}{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}{1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}}] =-\frac{1}{m}\sum\limits_{i=1}^{m}{{y}^{(i)}}\frac{x_j^{(i)}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}] =-\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{{{y}^{(i)}}x_j^{(i)}-x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}+{{y}^{(i)}}x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{{{y}^{(i)}}\left( 1\text{+}{{e}^{{\theta^T}{{x}^{(i)}}}} \right)-{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}x_j^{(i)}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}-\frac{{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{({{y}^{(i)}}-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}} =-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}-{h_\theta}\left( {{x}^{(i)}} \right)]x_j^{(i)}} =\frac{1}{m}\sum\limits_{i=1}^{m}{[{h_\theta}\left( {{x}^{(i)}} \right)-{{y}^{(i)}}]x_j^{(i)}}

注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的{h_\theta}\left( x \right)=g\left( {\theta^T}X \right)与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。

一些梯度下降算法之外的选择: 除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS)

2.1 正则化

2.1.1 过拟合问题

第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。

就以多项式理解,x 的次数越高,拟合的越好,但相应的预测的能力就可能变差。

问题是,如果我们发现了过拟合问题,应该如何处理?

  1. 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA

  2. 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

2.1.2 代价函数

上面的回归问题中如果我们的模型是: {h_\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}+{\theta_{3}}{x_{3}^3}+{\theta_{4}}{x_{4}^4} 我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,我们就能很好的拟合了。所以我们要做的就是在一定程度上减小这些参数\theta 的值,这就是正则化的基本方法。

我们有一个较为简单的防止过拟合的假设: J\left( \theta  \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]}

如果选择的正则化参数\lambda 过大,则会把所有的参数都最小化了,导致模型变成 {h_\theta}\left( x \right)={\theta_{0}},也就是上图中红色直线所示的情况,造成欠拟合。

猜你喜欢

转载自juejin.im/post/5c6bc294f265da2dca385839