多元线性回归——线性回归的不同版本(拥有多个输入特征)
我们通过上标的箭头来表示这是个数字列表,强调它是向量,但是你不必在符号中绘制出这个箭头
此问题为多元线性回归而不是多元回归
dot product点积让我们的公式显得更加紧凑和简洁,由此也引出了向量化的相关问题
向量化vectorization
当我们在实现学习算法的时候,使用向量化的方法可以使得代码更短也使得其运行更有效
可以直接写range(n)而此处的range(0,n)只是为了强调是从0开始
三种代码效率依次提高,向量化的优势不仅在于可以使的代码更加短(此处变成一行了)而且可以提高代码运行的速度(比前两种都要快),向量化实现得更快的原因在于Numpy dot function使用并行硬件的能力,这使得向量化比之前的for循环或顺序计算更有效
向量化可以in parallel并行地同时处理w和x的点积,并且不需要执行不同的加法,一个接一个地把这16个数字加起来,这也就意味着带有向量化的代码比没有进行向量化的代码运行得更快,是让学习算法运行的关键一步,因此可以很好地scale well to(扩展到)现代机器学习算法的大型数据集
也许当你只有16个输入特征时向量化的优势没那么明显,但是当你的输入特征数量特别多的时候,采用向量化可以提升的效率就比较大了。
用于多元线性回归的梯度下降(带有向量化的)
正规方程normal equation
Normal equation可以使用一个高级线性代数库,无需迭代即可在一个目标中求解w和b,也不需要你自己了解实现正规方程的方法但是如果你使用的是成熟的机器学习库并且调用线性回归时,有可能在后端将使用此方法来求解w和b,不要担心正规方程如何工作的细节,就只需注意在某些机器学习库中可能会使用这种复杂的方法在后端解决w和b,但对于大多数的机器学习算法,梯度下降还是一种更好的方法来完成工作
make 多元线性回归 much better的技巧
选择和缩放特征
当一个特征的可能值范围很大时,一个好的模型更有可能学会选择一个相对较小的参数值,同样当特征的可能值很小时,比如卧室的数量,那么它的参数会相对比较大
而这是如何对梯度下降产生影响的呢?
可以看出w1的成本函数图像(contour plot等高线图),底部窄高度高,所以w1的一个非常小的变化就会对估计的价格产生非常大的影响,对成本函数J的影响也很大,所以w1往往需要乘以一个非常大的数字时,w1往往赋更小的值;而对于w2来说,w2的微小变化几乎不会改变成本函数,所以同理w2往往赋更大的值
当此时采用梯度下降时
从x1和x2的分布散点图中可以看出,两个取值差距比较大的特征,会形成高高瘦瘦的这样的成本函数图像,进行梯度下降时可能会来回弹跳很长的时间最终才能找到its way to全局最小值点,在这种情况下要做的一件有用的事情就是缩放特征,对训练数据进行一些转换
当进行特征缩放后,x1和x2都采用了彼此可比较的值范围,这样在进行梯度下降时可以很快地找到一条更直接通往全局最小值的路径
所以当你有不同的特征,取值范围非常不同时,可能会导致梯度下降运行缓慢,但重新缩放不同的特征,使得它们这几个特征都具有可比较的值范围,可以显著地加速梯度下降过程。
实现特征缩放——使得具有不同的值范围具有彼此可比较的范围
方法一:除以最大值
方法二:均值归一化
算x1和x2的平均值μ1和μ2,然后除以分母:max-min
方法三:Z-score归一化(也就是标准化)
总结:有了这样的技术通常可以使得梯度下降运行得更快
不管有无特征缩放,都需要判断和check梯度下降是否有效(收敛)
运行梯度下降时,如何判断它是否收敛?即它是否在帮助你找到接近于成本函数全局最小值的参数,通过了解运行良好的梯度下降看起来是什么样子的,方便我们能更好地选择一个好的学习率值
从一般规律上而言,当迭代次数增加时成本函数值会随之下降,当迭代到400次时就逐渐平缓了,这意味着梯度下降或多或少地收敛了,因为曲线不再减少,并且对于不同的程序而言,收敛所需的迭代次数也不相同。值得注意的是,如果在某迭代次数之后成本函数突然增大,可能原因是你的学习率即步长太大,或者是代码中出现了bug
除了画成本函数随着迭代次数变化的曲线图之外,还有一种自动收敛检测的方法,设置一个很小的值epsilon,如果迭代前后成本函数的减小值小于等于epsilon,那么就宣布是收敛的,但是通常找到正确的阈值epsilon是比较困难的,所以一般确保梯度下降正确运行趋向于选择左边的画图方法,而不依靠自动收敛检测。
适当地选择学习率的大小
可以将α设置为非常小,进而去观察成本函数是否会随着迭代次数的增加而下降,如果成本函数有时还会增加,那么就说明你的代码中存在bug(比如w1的更新中,将减号minus写成了加号plus),但是注意这里将α设置为非常小是一个调试步骤,对于实际应用选择学习率如果太小,则需要花费很长很长的时间才能收敛
所以在运行梯度下降时,可以尝试一系列学习率α的值
这一过程中所做的就是,确保学习率找到了一个很小的值,找到了一个很大的值,这样在这上下界中间我们不断尝试找到尽可能大的适当的学习率或者略小于所发现的合理的最大值,这样通常就可以找到一个良好的学习率