“多元线性回归本质上与单元变量线性回归没太大区别”
增添更多特征后,我们引入一系列新的注释:
引入多元变量后,我们直接把原来的函数
简写为
多元变量的线性回归的梯度下降与一元的没什么区别
在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为0-2000平方英尺,而房间数量的值则是 0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。
解决的方法是尝试将所有特征的尺度都尽量缩放到-1到 1之间。如图:
梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
也有一些自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如 0.001进行比较,但通常看上面这样的图表更好。)如笔记01的代码的终止条件
到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程(Normal Equation)方法是更好的解决方案。如:
θ = ( X T X ) − 1 X T y \theta=\left(X^{T} X\right)^{-1} X^{T} y θ=(XTX)−1XTy的推导过程:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 其中: h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + … + θ n x n J(\theta)=\frac{1}{2 m} \sum\limits_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} \text { 其中: } h_{\theta}(x)=\theta^{T} X=\theta_{0} x_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\ldots+\theta_{n} x_{n} J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2 其中: hθ(x)=θTX=θ0x0+θ1x1+θ2x2+…+θnxn
将向量表达形式转为矩阵表达形式, 则有 J ( θ ) = 1 2 ( X θ − y ) 2 J(\theta)=\frac{1}{2}(X \theta-y)^{2} J(θ)=21(Xθ−y)2, 其中 X X X 为 m m m 行 n n n 列的矩阵
( m (m (m 为样本个数, n n n 为特征个数), θ \theta θ 为 n n n 行 1 列的矩阵, y y y 为 m m m 行 1 列的矩阵, 对 J ( θ ) J(\theta) J(θ) 进行如
下变换:
J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) = 1 2 ( θ T X T − y T ) ( X θ − y ) = 1 2 ( θ T X T X θ − θ T X T y − y T X θ − y T y ) \begin{array}{c} J(\theta)=\frac{1}{2}(X \theta-y)^{T}(X \theta-y) \\ \quad=\frac{1}{2}\left(\theta^{T} X^{T}-y^{T}\right)(X \theta-y) \\ =\frac{1}{2}\left(\theta^{T} X^{T} X \theta-\theta^{T} X^{T} y-y^{T} X \theta-y^{T} y\right) \end{array} J(θ)=21(Xθ−y)T(Xθ−y)=21(θTXT−yT)(Xθ−y)=21(θTXTXθ−θTXTy−yTXθ−yTy)
接下来对
()偏导,需要用到以下几个矩阵的求导法则 :
d A B d B = A T \frac{dAB}{dB}=A^T dBdAB=AT
d X τ A X d X = 2 A X \frac{dX^{\tau}AX}{dX}=2AX dXdXτAX=2AX
所以有 :
∂ J ( θ ) ∂ θ = 1 2 ( 2 X T X θ − X T y − ( y T X ) T − 0 ) = 1 2 ( 2 X T X θ − X T y − X T y − 0 ) = X T X θ − X T y \begin{array}{c} \frac{\partial J(\theta)}{\partial \theta}=\frac{1}{2}\left(2 X^{T} X \theta-X^{T} y-\left(y^{T} X\right)^{T}-0\right) \\ =\frac{1}{2}\left(2 X^{T} X \theta-X^{T} y-X^{T} y-0\right) \\ =X^{T} X \theta-X^{T} y \end{array} ∂θ∂J(θ)=21(2XTXθ−XTy−(yTX)T−0)=21(2XTXθ−XTy−XTy−0)=XTXθ−XTy
令 ∂ J ( θ ) ∂ θ = 0 则有 θ = ( X T X ) − 1 X T y \begin{array}{l} \text { 令 } \frac{\partial J(\theta)}{\partial \theta}=0 \\ \text { 则有 } \theta=\left(X^{T} X\right)^{-1} X^{T} y \end{array} 令 ∂θ∂J(θ)=0 则有 θ=(XTX)−1XTy
总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数的替代方法。具体地说,只要特征变量数量小于一万,我通常使用标准方程法,而不使用梯度下降法。
随着我们要讲的学习算法越来越复杂,例如,当我们讲到分类算法,像逻辑回归算法,我们会看到,实际上对于那些算法,并不能使用标准方程法。对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题。或者我们以后在课程中,会讲到的一些其的算法,因为标准方程法不适合或者不能用在它们上。但对于这个特定的线性回归模型,标准方程法是一个比梯度下降法更快的替代算法。所以,根据具体的问题,以及你的特征变量的数量,这两种算法都是值得学习的。
步骤:
1.确定目标与条件
我是要进行分类吗?(二分类?多分类?)
二分类直接使用,多分类(需要修改)
条件
2.通过梯度下降算得
分类问题中,预测的变量 是离散的值
二元的分类问题:负向类(negative class)和正向类(positive class)
如果我们要用线性回归算法来解决一个分类问题,会出问题
在逻辑回归中,h(假设)的方程换了一个形式
希望我们的分类器的输出值在 0和 1之间,因此逻辑回归模型的假设是:
代表特征向量 代表逻辑函数( logistic function)是一个常用的逻辑函数为是一个常用的逻辑函数为S形函数(形函数(Sigmoid function),公式为:
现在讲下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。
假设函数计算内容
逻辑回归的代价函数与线性回归的不一样
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
clc;clear;
x1 = 0.4999999999:-0.01:0
x2 = 0.5:0.01:0.99
y1= -log(1-x1)
y2= -log(x2)
plot(x1,y1,'b*')
hold on
plot(x2,y2,'r-')
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))
逻辑回归的梯度下降与线性回归的梯度下降是不一样的
梯度下降推导
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的 ℎ()=()与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。
一些梯度下降算法之外的选择:除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:
共轭梯度 Conjugate Gradient 局部优化法 (Broyden fletcher goldfarb shann,BFGS)和 有限内存局部优化法 (LBFGS)
fminunc是 matlab和 octave 中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导
找出一种稍微简单一点的方法来写代价函数,来替换我们现在用的方法。弄清楚如何运用梯度下降法,来拟合出逻辑回归的参数。
这就是逻辑回归的代价函数:
这个式子可以合并成:
就是这样,现在你知道如何实现逻辑回归,这是一种非常强大,甚至可能世界上使用最广泛的一种分类算法。
学一些高级优化算法和一些高级的优化概念,利用这些方法,我们就能够使通过梯度下降,进行逻辑回归的速度大大提高,而这也将使算法更加适合解决大型的机器学习问题
有几种情况就制作几个分类器,每个分类器进行一次二分类,选择最高 的概率值,我们预测 就 是那个值
你现在知道了基本的挑选分类器的方法,选择出哪一个分类器是可信度最高效果最好的,
那么就可认为得到一个正确的分类,无论 值是多少,我们都有最高 的概率值,我们预测 就
是那个值。这就是多类别分类问题,以及一对多的方法,通过这个小方法,你现在也可以将
逻辑回归分类器用在多类分类的问题上。
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以 看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。
问题是,如果我们发现了过拟合问题,应该如何处理?
高次项导致了过拟合的产生,是高次项的系数小一点接近于0,可以解决过拟合问题
所以我们要做的就是在一定程度上减小=这些参数 的值,这就是正则化的基本方法。
如上,我们决定要减少 3和 4的大小,我们要做的便是修改代价函数,在其中 3和 4 设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的 3和 4。
这是在明确惩罚对象的情况下设置的
但假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过 拟合问题的假设:
其中又称为正则化参数( Regularization Parameter)。 注:根据惯例,我们不对 0 进
行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:
如果选择的正则化参数λ过大 则会把所有的参数都最小化了 导致模型变成 ℎ()=0,也就是上图中红色直线所示的情况,造成欠拟合。
那为什么增加的一项=Σ=1n 2以使 的值减小呢?
因为如果我们令 的值很大的话,为了使 代价函数尽可能的小,所有的 的值(不包括 0)都会在一定程度上减小。
但若λ的值太大了 那么 (不包括 0)都会趋近于 0,这样我们所得到的只能是一条平行于 轴的直线。
所以对于正则化,我们要取一个合理的 的值,这样才能更好的应用正则化。
对于线性回归的求解,我们之前推导了两种学习算法:一种基于梯度下降,一种基于正规方程。
我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示:
矩阵大小图中的矩阵尺寸为(+1)∗(+1)
针对逻辑回归问题,我们在之前的课程已经学习过两种优化算法:我们首先学习了使用梯度下降法来优化代价函数 (),接下来学习了更高级的 优化算法,这些高级优化算法需要你自己设计代价函数 ()。
自己计算导数同样对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代价函数:
import numpy as np
def costReg(theta, X, y, learningRate):
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)))
reg=(learningRate/(2*len(x))*np.sum(np.power(theta[ : , 1:theta. shape[1]],2))
return np.sum(first-second) len (X))+reg
要最小化该代价函数,通过求导,得出梯度下降算法为:
注:看上去同线性回归一样,但是知道ℎ()=(),所以与线性回归不同。
注意:
接下来的课程中,我们将学习一个非常强大的非线性分类器,无论是线性回归问题,还
是逻辑回归问题,都可以构造多项式来解决。你将逐渐发现还有更强大的非线性分类器,可
以用来解决多项式回归问题。我们接下来将学会,比现在解决问题的方法强大 N倍的学习
算法。