一、梯度下降算法
书接上回,我们了解了梯度下降的大概,那么具体来看一下梯度下降算法的实现。
我们针对两个参数w和b,对其进行梯度下降,这里就不得不提到一个东西——学习率
学习率便是公式中的阿尔法,用来控制向最小J值逼近时的步长,过小的学习率会使达到J值的时间过长,过大的学习率则会出现一步迈过头的情况,并且部分展开后我们可以得到以下公式
二、多维特征
很多时候我们要预测的东西不止和一个参数有关,这时候便要考虑多维特征,我们不能简简单单的只考虑一元线性回归,因为实际情况往往比这些要复杂得多。
我们用来表示第几个参数,j=1,2,3,……,同时我们用n来表示参数的个数
同样的,我们仍然用来表示第i个训练实例,如果要引用某一特定参数的训练实例,我们用来表示。
当我们得到了多个参数之后,我们可以看一下模型变成了什么样子,如下:
我们将参数上面加一个小箭头称之为向量,一个向量包含w1,w2,w3……那么事实上函数就可以写成:
三、向量化/矢量化
运用矢量化可以使我们的代码更加短小精悍,更加有效。学习运用矢量化可以加速我们的计算。在Python中我们可以运用NumPy——一个数值线性代数库,不使用矢量化的话将会使我们的代码变得冗长。
对比之下,矢量化真的会方便很多。
矢量化将一个个的运算简化为了并行计算,看上去很神奇,不是吗?尤其是遇到大量的数据的时候,其优势便得以展现。
四、适用于多元线性回归的梯度下降法
我们将多元线性回归函数向量化之后,便可以得到以下的式子:
注意,这里的点是dotproduct(点积),相当于展开后的x1*w1,x2*w2……这时,我们仍可以对每一个w参数和b参数进行梯度下降
而对其进行展开更直接的来看,和一元线性回归的梯度下降其实也有些类似,只不过J里面f函数要对多个参数进行计算。
五、特征缩放技术
运用特征缩放技术可以是我们的梯度下降更加迅速。
假设我们有一个含有两个参数的函数
而且有这样一组数据
我们不妨对其先对其w1和w2进行假设
可以看到,当参数取值范围比较大时,相对应的w取值也应当比较小,从而使参数在一个合理的范围上面,
当我们绘制x1和x2的散点图时,会发现它们形成的是一个窄带,这并不利于我们的预测
与此同时诞生的J值等高线图也是一个扁椭圆形,不利于我们的观察与计算。
这时候我们便要用到一定的缩放技术,从而让参数的范围变得合理起来
如图,很好理解