第3周的课程核心内容是逻辑回归(分类)和正则化。
逻辑回归
分类
分类问题可以从最简单的形式开始,二分法:是否、对错、良性恶性。
这些分类情况都可以假设为变量\(y \in \{0, 1\}\)。0代表负分类、1代表正分类。多重分类实际上就是将y改成\(y \in \{0, 1, 2, 3, \dots\}\),后面会有介绍。
如果将线性回归的模型强行套入分类问题,由于y的取值只有0和1,我们强制假设函数取值\(h_\theta(x) \geqslant 0.5\)就相当于y = 1、\(h_\theta(x) \lt 0.5\)相当于y = 0,便会出现如下图情况:
如果来一个新的训练数据,如果它偏离得很远,那么得出的假设函数h系数θ会使得回归线偏离得很远,甚至会错误地将原本y=1的数据误判为y=0,因为它们的假设函数值小于0.5。
明显,强行将线性回归的假设函数模型应用到分类问题是不恰当的,y值原本要么是0要么是1,但是线性回归的假设函数还可以输出大于1和小于0的范围的值。
我们希望逻辑回归能够有一个假设函数的值大于等于0、小于等于1,即\(0 \leqslant h_\theta(x) \leqslant 1\)。
如何表达假设函数
于是数学家们找到了一个Sigmoid函数,能够使得它的取值大于等于0、小于等于1。
假设它是函数g,参数为z,\(g(z) = \frac{1}{1 + e^{-z}}\),它的取值曲线如下图:
这个曲线上段无限接近1、下段无限接近0,在z=0处g(z)=0.5,以该点旋转对称。
那么我们的假设函数就可以改写为:\(h_\vec{θ}(\vec{x}) = g(\vec{θ}^T \vec{x}) = \frac{1}{1 + e^{-\vec{θ}^T \vec{x}}}\)。
如果有某组x值使得\(h_\vec{θ}(\vec{x}) = 0.7\),这意味着在这组x值和θ值的情况下,y=1的概率为70%。用概率的数学表示方式为:\(P(y=1|\vec{x};\vec{θ}) = 0.7\)。基于sigmoid函数的对称性和取值范围,很直接便可以得到\(P(y=0|\vec{x};\vec{θ}) + P(y=1|\vec{x};\vec{θ}) = 1\)。
决策边界
当\(h_\vec{θ}(\vec{x}) \geqslant 0.5\)时,我们可以预测认为y=1;当\(h_\vec{θ}(\vec{x}) \lt 0.5\)时,我们可以预测认为y=0。
由于\(h_\vec{θ}(\vec{x}) = g(\vec{θ}^T \vec{x}) = \frac{1}{1+e^{-\vec{θ}^T \vec{x}}}\),当\(\vec{θ}^T \vec{x} \geqslant 0\)时\(h_\vec{θ}(\vec{x}) \geqslant 0.5\),所以就可以将前面的描述转化为:
当\(\vec{θ}^T \vec{x} \geqslant 0\)时,我们可以预测认为y=1;当\(\vec{θ}^T \vec{x} \lt 0\)时,我们可以预测认为y=0。
如果将\(\vec{θ}^T \vec{x}\)改写回线性方程的形式,例如\(h_\vec{θ}(\vec{x}) = g(θ_0 + θ_1 x_1 + θ_2 x_2)\),设\(\vec{θ} = \begin{bmatrix} -3 \\ 1 \\ 1 \end{bmatrix}\),那么这种情况,便可以描述为:
当\(-3 + x_1 + x_2 \geqslant 0\)时,我们可以预测认为y=1。
观察便知道,\(x_1 + x_2 = 3\)这条直线本身就是\(h_\vec{θ}(\vec{x}) = 0.5\)的等值曲线。这条直线便被称为决策边界。
在划出决策边界后,显然由于\(x_1 + x_2 \geqslant 3\)可预测到y=1,这相当于图中决策边界的右上方区域;同理决策边界的左下方便是y=0的区域。
吴教授千叮万嘱,决策边界只是这个假设函数的属性,不是训练样本数据的属性。
决策边界不一定是直线的,还可以是曲线。这纯粹与假设函数有关。如果我们假设\(h_\vec{θ}(\vec{x}) = g(θ_0 + θ_1 x_1 + θ_2 x_2 + θ_3 x_1^2 + θ_4 x_2^2), θ = \begin{bmatrix} -1 \\ 0 \\ 0 \\ 1 \\ 1 \end{bmatrix}\),就会得到:
当\(-1 + x_1^2 + x_2^2 \geqslant 0\)时,我们可以预测认为y=1。显然,这里的决策边界是个圆:
如果我们假设函数使用多项式,那可能还可以得到各种奇奇怪怪形状的决策边界:
代价函数
假设函数定好了之后,就是要确定代价函数了。
对于有m个样本、n个特征的训练集:
\(\{ (\vec{x}^{(1)}, y^{(1)}), (\vec{x}^{(2)}, y^{(2)}), \dots, (\vec{x}^{(m)}, y^{(m)}) \}, \vec{x} \in \begin{bmatrix} x_0 \\ x_1 \\ \vdots \\ x_n \end{bmatrix} \mathbb{R}^{n+1,1}, x_0 = 1, y \in \{0, 1\}\)我们有假设函数:\(h_\vec{θ}(\vec{x}) = \frac{1}{1+e^{-\vec{θ}^T \vec{x}}}\)。
如何才能求得合适的θ参数向量?
这就是代价函数要解决的问题。
先回顾一下线性回归。我们假设代价函数\(J(\vec{θ}) = \frac{1}{m} \sum\limits_{i=1}^m \frac{1}{2} [h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}]^2\)。其实它本质上就是每个样本得出来的假设值与对应真实值之间的平均平方误差。那么我们可以抽象一个Cost函数出来,让\(Cost(h_\vec{θ}(\vec{x}), y) = \frac{1}{2} [h_\vec{θ}(\vec{x}) – y]^2\),即二分之一平方误差算法本身,我们希望通过保持\(J(\vec{θ}) = \frac{1}{m} \sum\limits_{i=1}^m Cost(h_\vec{θ}(\vec{x}^{(i)}), y^{(i)})\)这个形式,求得逻辑回归情况下的代价函数,实际上就是要得到逻辑回归情况下的Cost函数。
如果我们直接将sigmoid函数化了的假设函数代入Cost函数,\(Cost(h_\vec{θ}(\vec{x}), y) = \frac{1}{2} (\frac{1}{1+e^{\vec{θ}^T \vec{x}}} – y)^2\),由于sigmoid函数本身是非线性的,这会导致逻辑回归的情况下,代价函数J不是一个凸函数,它有很多起伏的位置、有很多局部最优解:
那我们肯定要重新考虑Cost函数本身的算法了,显然在逻辑回归的情况下平方误差不是一个好的选择。这显然需要针对sigmoid函数设计一种Cost函数。
于是便有了:\(Cost(h_\vec{θ}(\vec{x}), y) = \begin{cases}
-ln(h_\vec{θ}(\vec{x})) &\text{当 y = 1} \\
-ln(1 – h_\vec{θ}(\vec{x})) &\text{当 y = 0}
\end{cases}\)
当y=1,若假设函数h的值也等于1,这代表毫无代价/0代价(1-1=0),Cost函数的值为0;但当y=1,若假设函数h的值等于0,Cost函数的值趋向无穷大,这代表假设的结果与真实相去甚远,用一个超大的代价值用以惩罚机器学习算法:
同理。当y=0,若假设函数h的值也等于0,这代表毫无代价/0代价(0-0=0),Cost函数的值为0;但当y=0,若假设函数h的值等于1,Cost函数的值趋向无穷大:
简化代价函数及其梯度下降算法
代价函数得到了,但是由于它需要分情况列出公式,这不方便整合到梯度下降算法中。但二分逻辑回归的y值总是要么是1要么是0,那么可以通过1-y这个技巧整合出完整的代价函数:
\(Cost(h_\vec{θ}(\vec{x}), y) = -y \cdot ln(h_\vec{θ}(\vec{x})) – (1-y) ln(1 – h_\vec{θ}(\vec{x})), y \in \{0,1\}\)
\(\begin{aligned}
J(\vec{θ}) &= \frac{1}{m} \sum\limits_{i=1}^m Cost(h_\vec{θ}(\vec{x}^{(i)}), y^{(i)}) \\
&= \frac{1}{m} \sum\limits_{i=1}^m [-y^{(i)} ln(h_\vec{θ}(\vec{x}^{(i)})) – (1-y^{(i)}) ln(1 – h_\vec{θ}(\vec{x}^{(i)}))]
\end{aligned}\)
同样要拟合出最好的θ向量,其实就是要找总代价最小的那个θ向量,即\(min(J(\vec{θ}))\)。
找到这个θ向量后,要预测新来的数据x,直接用假设函数\(h_\vec{θ}(\vec{x}) = \frac{1}{1+e^{-\vec{θ}^T \vec{x}}}\)便可求得概率\(P(y=1|\vec{x};\vec{θ})\)。
要得到\(min(J(\vec{θ}))\),同样地,就是使用梯度下降算法。继续用伪代码推导:
重复 至 收敛 {
\(θ_j := θ_j – α \frac{∂}{∂ θ_j} J(\vec{θ})\) (j从0到n同步更新所有\(θ_j\))
}
实际上要先推导出\(\frac{∂}{∂ θ_j} J(\vec{θ})\):
\(\begin{aligned}\frac{∂}{∂ θ_j} J(\vec{θ}) &= \frac{∂}{∂ θ_j} \{\frac{1}{m} \sum\limits_{i=1}^m [-y^{(i)} ln(h_\vec{θ}(\vec{x}^{(i)})) – (1-y^{(i)}) ln(1 – h_\vec{θ}(\vec{x}^{(i)}))]\} \\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m [-y^{(i)} ln(h_\vec{θ}(\vec{x}^{(i)})) – (1-y^{(i)}) ln(1 – h_\vec{θ}(\vec{x}^{(i)}))]\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m [-y^{(i)} ln(\frac{1}{1+e^{-\vec{θ}^T \vec{x}^{(i)}}}) – (1-y^{(i)}) ln(\frac{e^{-\vec{θ}^T \vec{x}^{(i)}}}{1+e^{-\vec{θ}^T \vec{x}^{(i)}}})]\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m \{y^{(i)} ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}}) – (1-y^{(i)}) [-\vec{θ}^T \vec{x}^{(i)} – ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}})]\}\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m \{y^{(i)} ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}}) + [\vec{θ}^T \vec{x}^{(i)} -\vec{θ}^T \vec{x}^{(i)} y^{(i)} + ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}}) – y^{(i)} ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}})]\}\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m [\vec{θ}^T \vec{x}^{(i)} -\vec{θ}^T \vec{x}^{(i)} y^{(i)} + ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}})]\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m [ln(e^{\vec{θ}^T \vec{x}^{(i)}}) + ln(1+e^{-\vec{θ}^T \vec{x}^{(i)}}) -\vec{θ}^T \vec{x}^{(i)} y^{(i)}]\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m \{ln[e^{\vec{θ}^T \vec{x}^{(i)}}(1+e^{-\vec{θ}^T \vec{x}^{(i)}})] -\vec{θ}^T \vec{x}^{(i)} y^{(i)}\}\\
&= \frac{1}{m} \frac{∂}{∂ θ_j} \sum\limits_{i=1}^m [ln(e^{\vec{θ}^T \vec{x}^{(i)}} + 1) -\vec{θ}^T \vec{x}^{(i)} y^{(i)}]\\
&= \frac{1}{m} \sum\limits_{i=1}^m [\frac{∂}{∂ θ_j} ln(e^{\vec{θ}^T \vec{x}^{(i)}} + 1) – \frac{∂}{∂ θ_j} \vec{θ}^T \vec{x}^{(i)} y^{(i)}]\\
&= \frac{1}{m} \sum\limits_{i=1}^m [\frac{x_j^{(i)} e^{\vec{θ}^T \vec{x}^{(i)}}}{e^{\vec{θ}^T \vec{x}^{(i)}} + 1} – x_j^{(i)} y^{(i)}]\\
&= \frac{1}{m} \sum\limits_{i=1}^m [\frac{1}{e^{-\vec{θ}^T \vec{x}^{(i)}}(e^{\vec{θ}^T \vec{x}^{(i)}} + 1)} – y^{(i)}] x_j^{(i)}\\
&= \frac{1}{m} \sum\limits_{i=1}^m [\frac{1}{1 + e^{-\vec{θ}^T \vec{x}^{(i)}}} – y^{(i)}] x_j^{(i)}\\
&= \frac{1}{m} \sum\limits_{i=1}^m [h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}] x_j^{(i)}
\end{aligned}\)
其中\(\frac{∂}{∂ θ_j} ln(e^{\vec{θ}^T \vec{x}^{(i)}} + 1) = \frac{x_j^{(i)} e^{\vec{θ}^T \vec{x}^{(i)}}}{e^{\vec{θ}^T \vec{x}^{(i)}} + 1}\)使用了以下求导规则:
- \(\frac{∂}{∂ x} ln(x) = \frac{1}{x}\);
- \(\frac{∂}{∂ x} e^x = e^x\);
- \(\frac{∂}{∂ θ_j} \vec{θ}^T \vec{x}^{(i)} = x_j^{(i)}\)。
所以毫不意外地,逻辑回归的梯度下降算法形式上和线性回归是一摸一样的:
重复 至 收敛 {
\(θ_j := θ_j – α \frac{1}{m} \sum\limits_{i=1}^m [h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}] x_j^{(i)}\) (j从0到n同步更新所有\(θ_j\))
}
吴教授的课件这里是有误的,少了个1/m的系数。而且为了计算方便,由于sigmoid函数选取了e为底,所以Cost函数应该使用ln而不是log——不过在常见编程语言的库里面,都是用log代替ln。
进阶优化
要更好地计算代价函数J的值和给定θ的偏导数,还有很多高阶的算法。它们已经超出了这个课程的范围,它们包括:
- 共轭梯度算法(Conjugate Gradient);
- BFGS(一种拟牛顿法);
- L-BFGS(内存受限的BFGS)。
它们的优点:
- 不用选取学习速率α值;
- 会比梯度下降算法快(收敛得更快)。
它们的缺点:
- 更更更复杂。😱
连吴教授都说自己是用了它们很多年才真正搞懂它们到底是怎么工作的,所以他的建议就是完全可以不管它们的细节、而且千万千万不要打算自己实现这些算法——就像没必要自己实现一个开根号算法那样。要弄懂它们,必须先有数值计算这一门知识。我自问没有,所以就不求甚解了。
而在Octave中,它们也是已经被实现了的,直接用就可以了。其它编程语言基本都有实现了它们的库。
而对于其它形式的代价函数J,Octave提供了极其方便的优化函数fminunc
(数值最小化器)来辅助我们计算想要的θ值。
假设\(\vec{θ} = \begin{bmatrix} θ_1 \\ θ_2 \end{bmatrix}, J(\vec{θ}) = (θ_1 – 5)^2 + (θ_2 – 5)^2\),那么对θ求导,便有:
- \(\frac{∂}{∂ θ_1} = 2(θ_1 – 5)\);
- \(\frac{∂}{∂ θ_2} = 2(θ_2 – 5)\)。
于是便可以利用这个代价函数的定义和fminunc直接计算最优的θ:
% 计算代价值J之余、同时计算出对应θ的梯度(导数)值
function [jVal, gradient] = constFunction(theta)
jVal = (theta(1) - 5)^2 + (theta(2) - 5)^2;
gradient = zeros(2, 1);
gradient(1) = 2 * (theta(1) - 5);
gradient(2) = 2 * (theta(2) - 5);
end
options = optimset('GradObj', 'on', 'MaxIter', 100);
initialTheta = zeros(2, 1);
% 如果代价函数J是凸函数,利用fminunc可以直接计算出最优的θ
[optThetam functionVal, exitFlag] = fminunc(@constFunction, initialTheta, options);
这种方法很容易推广到n维θ的计算。而且当代价函数相对复杂的情况下,也方便维护。
多重分类:一对所有(one-vs-all)
如果将二分逻辑回归推广到有n个分类的情况,最简单朴素的方法就是“一对(其它)所有”。也就是说,如果训练集如果有3类目标结果,那么,第1次做第1类与其它2类对比的训练、第2次做第2类与其它2类对比的训练、第3次做第3类与其它2类对比的训练,如此类推:
如果有新的数据x进来,我们要预测它的所属分类,直接找出这3个假设函数中值最大的那个,便是它的所属分类,即求\(max(h_{\vec{θ}^{(i)}}^{(i)}(\vec{x}))\)。
由于不同批次的逻辑回归所使用的θ实际上是不同的向量,所以添加上标以示区分,这在原本教学中没提到的。
Softmax函数
其实要做多重分类,除了上面的“一对所有”的方法外,还可以直接通过Softmax函数求得样本x属于分类i的概率:\(P(y=i|\vec{x};\vec{θ}^{(i)}) =
\frac{e^{\vec{θ}^{(i)T} \vec{x}}}{\sum\limits_{k=1}^n e^{\vec{θ}^{(k)T} \vec{x}}}\)。
这个函数课程里面并没有介绍,而且这里写出来的形式和维基百科中的稍有不同——这里按照课程的习惯重写了一遍而已。这里就不打算展开推导了。观察分子,它的值其实就是如果x为第i种分类的归一化值;观察分母,就是x属于所有分类情况归一化值的总和;这个比值明显就是x属于第i种分类的概率。
正则化
过拟合问题
什么是过拟合问题?
如果我们的训练数据有太多特征,训练过后的假设函数有可能会针对训练数据拟合得太过好(即代价函数J的值十分接近0)——但这样的假设函数很有可能无法通用(generalize)至预测新样本数据的y值。(我的理解是没有预留足够合理的模糊空间给新的样本数据。)
线性回归的情况,图从左至右的三种情况分别为:欠拟合(又称高偏差),拟合得刚刚好,过(度)拟合(又称高离散)。
关于拟合的偏差和离散的权衡问题,网络上有很多讨论。直观感受当然是低偏差、低离散性的拟合是最好的,但事实往往没有那么简单。
当然,逻辑回归同样会有过拟合的问题。同样是由于太多特征导致的。
要处理过拟合问题,主要有两种方法:
- (理所当然地)减少特征的数量。
- 可以手动地选择要哪些特征。(靠猜、靠经验)
- 模型选择算法。(以后课程会介绍)
- 正则化。
- 保留所有特征,但是缩小参数\(θ_j\)的数量级;
- 这种方法当预测y值时需要所有特征都提供一点点贡献的时候工作的很好。
代价函数
假设关于下面红叉训练样本有两个假设,一个是二次函数、一个是多项高次(三次四次)函数,虽然它们都能拟合得很好,但是明显高次函数的假设是过拟合的。
假设我们求最小代价值时,让\(θ_3\)、\(θ_4\)乘以一个极大的数。那么在找最小代价值的过程中,\(θ_3\)和\(θ_4\)会趋近于0,而拟合曲线便会越来越像左边的二次曲线。我们称这种操作为惩罚\(θ_3\)、\(θ_4\)两个参数。
所以正则化的算法概念源头就是通过使参数\(θ_j\)变小,从而达到简化原本假设的目的。只要假设越简单,越不容易过拟合。
以房价预测为例,如果有100个特征、\(θ_j\)就有100个。我们其实不知道应该缩小哪一个。那么就干脆所有\(θ_j\)都缩小吧。
我们可以通过添加正则化项到代价函数中,得到如下新的代价函数:
\(J(\vec{θ}) = \frac{1}{2m} [\sum\limits_{i=1}^m(h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)})^2 + λ \sum\limits_{j=1}^n θ_j^2]\)由于\(x_0 = 1\),\(θ_0\)不需要被惩罚。
λ参数用于权衡代价函数更倾向原本的定义还是更倾向惩罚θ。λ越大,得到的θ便越小。θ越小,假设函数则被简化得越厉害。所以λ越大,越倾向欠拟合。极端情况下,如果λ太大,所有θ十分接近0,那么\(h_\vec{θ}(\vec{x}^{(i)}) \approx
θ_0\),拟合的曲线便无限近似于一条水平线。所以要小心选择λ值。(后面有课程教如何自动化选择λ值。)
正则化的线性回归
梯度下降
那么在正则化的线性回归的梯度下降算法中,抛开\(θ_0\)不考虑(因为不需惩罚),\(\frac{∂}{∂ θ_j} J(\vec{θ}) = \frac{1}{m}
[\sum\limits_{i=1}^m (h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_j^{(i)} + λ θ_j]\),梯度下降算法就可以改写为:
重复 至 收敛 {
\(θ_0 := θ_0 – α \frac{1}{m} \sum\limits_{i=1}^m(h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_0^{(i)}\)
\(θ_j := θ_j – α \frac{1}{m} [\sum\limits_{i=1}^m (h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_j^{(i)} + λ θ_j]\)(j从1到n同步更新)
}
移项简化,便有:\(θ_j := θ_j (1 – α \frac{λ}{m}) – α \frac{1}{m} \sum\limits_{i=1}^m (h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_j^{(i)}\)。由于α、m都大于0,所以当λ>0时,\(1 – α \frac{λ}{m} \lt 1\),当λ=0时,\(1 – α \frac{λ}{m} = 1\),即维持原本的梯度下降算法不变。
正规方程
既然代价函数有变化,线性回归相应的正规方程也会有变化。设\(X \in \mathbb{R}^{m*(n+1)}, \vec{y} \in \mathbb{R}^{m*1}\),那么正则化过后的正规方程为:
\(\vec{θ} = (X^T X + λ\begin{bmatrix}0 && 0 && 0 && \dots && 0\\
0 && 1 && 0 && \dots && 0\\
0 && 0 && 1 && \dots && 0\\
0 && 0 && 0 && \ddots && 0\\
0 && 0 && 0 && \dots && 1\\
\end{bmatrix})^{-1} X^T \vec{y}\)
中间那个貌似单位矩阵的缺了一个1(因为不惩罚\(θ_0\)),是一个n+1阶对称方阵。这个公式推导过程和之前的大同小异,就是繁琐一些,这里就不展开了。
另外关于\(X^T X\)不可逆的情况,如果加上了这个貌似单位矩阵(设为\(K \in \mathbb{R}^{(n+1)*(n+1)}\))的情况后,吴教授说是可以证明矩阵\(X^T X + λ K\)总是可逆的。但是我一时间想不出来(如何证明\(|X^T X + λ K| \ne 0\))……但这没关系,吴教授只是想告诉我们,正则化后,正规方程总是有解的。
正则化的逻辑回归
同样地,我们在逻辑回归的代价函数后端加上\(\frac{λ}{2m} \sum\limits_{j=1}^n θ_j^2\),便可以惩罚除\(θ_0\)外的参数。
同样地,在逻辑回归的梯度下降算法中,求导后,依然有\(\frac{∂}{∂ θ_j} J(\vec{θ}) = \frac{1}{m} [\sum\limits_{i=1}^m (h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_j^{(i)} + λ θ_j]\),所以它的梯度下降算法和线性回归的形式上保持一致:
重复 至 收敛 {
\(θ_0 := θ_0 – α \frac{1}{m} \sum\limits_{i=1}^m(h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_0^{(i)}\)
\(θ_j := θ_j (1 – α \frac{λ}{m}) – α \frac{1}{m} \sum\limits_{i=1}^m (h_\vec{θ}(\vec{x}^{(i)}) – y^{(i)}) x_j^{(i)}\)(j从1到n同步更新)
}
当然,逻辑回归的假设函数是不一样的。
最后,如果利用Octave的fminunc编写梯度下降算法,只需要知道如何计算代价值\(J(\vec{θ})\)以及对应的偏导数\(\frac{∂}{∂ θ_j} J(\vec{θ})\)便足够了:
% 代价函数模板
function [jVal, gradient] = costFunction(theta)
jVal = ...; % 计算J(θ)
gradient(1) = ...; % 计算θ_0的导数
gradient(2) = ...; % 计算θ_1的导数
% ...如此类推...
gradient(n+1) = ...; % 计算θ_n的导数
end
打赏作者由 bruce 于 2017-11-10 22:41 更新