您的位置:首页 > 编程语言 > Python开发

python手撸线性回归及参数解释

2016-12-14 11:57 489 查看
线性回归,简单的理解,在二维空间中,找到一条直线去尽可能的拟合样本数据,给出新的样本x,可以预测其y值,y是连续值,分类是离散值,如图1所示;如果是高维空间,那就是找到一个超平面去拟合,当然也可以是曲线;为了方便理解,以二维空间的直线为例,所谓找到最好的直线,就是找参数a和b,也就是theta[0],theta[1]。

         如何去衡量一条直线是否是最好,在回归问题中一般用预测值与真实值之间的距离来定义损失函数,如图2所示,使损失函数值最小的直线就是最好的直线,注意,损失函数是图中红色线段的平方和,而不是绿色线段,m代表样本的总数量,1/2是为了求导方便,可以与2次项约为1。



图 1线性回归举例



图2 损失函数

         所以,线性回归的目标就是找到一组theta值,使损失函数最小,所以线性回归就变为求最小化J的问题。
         最小化J常用的方法是梯度下降,梯度下降是逐步减小损失的过程,方向就是梯度(梯度/导数的方向是变化最快的方向),学习速率a是步长,可以理解为沿着梯度的方向每次变化多少,梯度下降的原理如图3所示,当走到最低点后,也就是损失最小的地方,此时梯度为0,theta将不再变化。



图3 梯度下降原理图
         下面就用python来实现一个简单的线性回归模型



图4 读入数据并画出散点图



图5 定义损失函数、梯度下降函数并使用学习速率0.01画出损失变化图



图6 画出自实现的线性回归与sklearn中的模型做比较



图7 损失函数与theta的变化关系
下面我们来看一下学习速率a和迭代次数对模型的影响,代码下所示



图8是迭代次数为20000,学习速率分别是0.0001,0.001,0.003,0.01时,cost随迭代次数的变化曲线,可以看出a越大,收敛越快,能够越快的取到最优解,而当a取0.0001和0.001时,所有迭代完成后,都没有达到最优;不断调大迭代次数,发现当迭代次数到500000时,a=0.0001仍没有收敛。Andrew在其机器课程中提到a的选择一般按照如下策略:从一个较小的a,比如0.001,然后每次增大3倍(0.003,0.01……)在训练集开始尝试,画出迭代次数与cost的变化曲线,取一个略小于最大值(使cost下降最快)的a应用在测试集,这样能加快训练速度。如果a的值取的太大会怎样,图14画出a取0.03时的变化曲线,可以看出损失函数不能收敛,当a太大时,会出现震荡不收敛的情况,我们可以这样来理解,如果a取100000000,在向下的时候,因为步子太大,就可能跨过最低点,甚至超过对称点,再往上走。



图8 迭代20000次



图9 迭代50000次



图10迭代100000次



图11迭代200000次



图12迭代500000次



图13迭代1000000次



图14 a=0.03
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息