2019/3/25

一元线性回归——梯度下降/最小二乘法又名:一两位小数点的悲剧

感觉这个才是真正的重头戏,毕竟前两者都是更倾向于直接使用公式,而不是让计算机一步步去接近真相,而这个梯度下降就不一样了,计算机虽然还是跟从现有语句/公式,但是在不断尝试中一步步接近目的地。

简单来说,梯度下降的目的在我看来还是要到达两系数的偏导数函数值为零的取值,因此,我们会从“任意一点”开始不断接近,由于根据之前最小二乘法的推导,可以说方差的公式应该算一个二次函数...?总之,这么理解的话就算只用中学知识也能知道在导数值为0时求得最大/小值。

那么就很简单了,我们让a,b一点点接近就可以了,而逼近的过程十分有趣,且巧妙。当前点的导数值如果为正,说明该点的横坐标需要左移,而为负则需要右移(为0就胜利了),因此根据这个特性我们可以直接设定为以下python代码:

a=a-n*get_pa(c,d)
b=b-n*get_pb(c,d)

其中,get_pa()以及get_pb()对应的分别为a或b求偏导数值,以a,b两个值为输入值,而n则是非常重要的调节系数,重要到让我无法正常运行程序,后文会着重提及。

运用到了正减,负增,通过减法实现,很巧妙【来自于Coursera的华盛顿大学“机器学习:回归”课程的想法

接下来,还是先给出求方差,求偏导的函数。

求方差:

def get_sqm(a,b):
sqm=0
for i in range(100):
sqm=sqm+(cols2[i]-a-b*cols1[i])*(cols2[i]-a-b*cols1[i])
return sqm

求a,b的偏导:

def get_pa(a,b):
pa=0
for i in range(100):
pa=pa-2*(cols2[i]-a-b*cols1[i])
return pa
def get_pb(a,b):
pb=0
for i in range(100):
pb=pb-2*cols1[i]*(cols2[i]-a-b*cols1[i])
return pb

好像...也没有太多可说的?那就迫不及待的进入正题吧!来自于我被调节系数n折磨的一整个下午的怨念!其实主题的循环函数并不是那么难理解和构建,我很早就完成了:

while abs(get_pa(a,b))>=10 and abs(get_pb(a,b))>=10 :
c=a
d=b
a=a-n*get_pa(c,d)
b=b-n*get_pb(c,d)
print(get_sqm(a,b))

偏导数的限制...我取了10...看起来很惊悚,但也是没办法,被吓得,只能松一点了。

简单来说就是不断调整两个系数取值,而且最终要的,也是我用临时变量c,d的原因,a,b要同时调整,或者说,在当前情况下,由于两偏导数都是既有a又有b的,牵一发而动全身,调完一个另一个也有了变化,不再准确,也不是之前的那个对应点的偏导数值了。

同时,n的存在也非常重要,它是外部限制调节幅度的方式,而它的取值又非常玄学,没有一个定论......对于不同的数据有不同的措施,在Coursera上建议的0.1把我坑惨了。

使用0.1,最后只会给我两个蓝蓝的“nan”,大概是python中的某一个错误表达吧,反正我一直以为我代码有问题,直到晚上才随手灵机一动,加了几个0,然后——就成功了...

【太过于戏剧性了,我的焦虑完全一笔带过

在同时我也打印出当前的方差,若是n取0.0001,则显示出的数据为大约又450多行,象征性的表示一下

59842.51109094548
44733.39899894902
...
27787.81855782964
27787.002777912836

能感受到前后变化的差距,最后的a,b值也不错,差别不大【偏导数限制在10好像也没什么大关系...

  • 最小二乘法公式法

    a=-22.63450339669057 b=13.449314363947979

  • 梯度下降(n=0.0001,偏导数约束为10)

    a=-21.128787257903344 b=13.281329019963474

  • 梯度下降(n=0.0001,偏导数约束为1)

    a=-22.48409512730926 b=13.432534053091723

  • 梯度下降(n=0.00001,偏导数约束为1)

    a=-22.483484868708103 b=13.432465969541052

目前来看,下降偏导数约束带来的提升可能比调整系数的下降来的多?不过毕竟直接从10减到了1,幅度比n的变化不知道大了多少。

n=0.0001,少一个0,就会有俩“nan”看着我,气

由于图像上的差异并不大所以就用n=0.00001,偏导数约束为1的图像吧,不能让它白跑那么久:

用的还是这个更像二次的数据,凑合看吧。

这里给出完整代码:

import xlrd
import xlwt
import sympy as sp
import matplotlib.pyplot as plt
import numpy as np
workbook=xlrd.open_workbook(r'1.xls') sheet=workbook.sheet_by_index(0)
cols1=sheet.col_values(0) #获取第一列
cols2=sheet.col_values(1) #获取第二列 #a+bx
#a=sp.Symbol('a')
#b=sp.Symbol('b')
#已知a=-22.63450339669057 b=13.449314363947979 def get_sqm(a,b):
sqm=0
for i in range(100):
sqm=sqm+(cols2[i]-a-b*cols1[i])*(cols2[i]-a-b*cols1[i])
return sqm def get_pa(a,b):
pa=0
for i in range(100):
pa=pa-2*(cols2[i]-a-b*cols1[i])
return pa def get_pb(a,b):
pb=0
for i in range(100):
pb=pb-2*cols1[i]*(cols2[i]-a-b*cols1[i])
return pb
n=0.00001
a=0.0
b=0.0
while abs(get_pa(a,b))>=1 and abs(get_pb(a,b))>=1 :
c=a
d=b
a=a-n*get_pa(c,d)
b=b-n*get_pb(c,d)
print(get_sqm(a,b)) print(a,b)
plt.scatter(cols1,cols2,color = 'blue')
x=np.linspace(0,15,100)
y=b*x+a
plt.plot(x,y,color="red")
plt.show()

就先这样,草草结束了先...?

Python实现——一元线性回归(梯度下降法)的更多相关文章

  1. python实现简单的梯度下降法

    代码如下: # 梯度下降法模拟 import numpy as np import matplotlib.pyplot as plt plot_x = np.linspace(-1,6,141) # ...

  2. Python实现——一元线性回归(最小二乘法)

    2019/3/24 线性回归--最小二乘法公式法 暂时用python成功做出来了图像,但是其中涉及到的公式还是更多的来自于网络,尤其是最小二乘法公式中的两个系数的求解,不过目前看了下书高数也会马上提及 ...

  3. 梯度下降法及一元线性回归的python实现

    梯度下降法及一元线性回归的python实现 一.梯度下降法形象解释 设想我们处在一座山的半山腰的位置,现在我们需要找到一条最快的下山路径,请问应该怎么走?根据生活经验,我们会用一种十分贪心的策略,即在 ...

  4. 最小二乘法 及 梯度下降法 分别对存在多重共线性数据集 进行线性回归 (Python版)

    网上对于线性回归的讲解已经很多,这里不再对此概念进行重复,本博客是作者在听吴恩达ML课程时候偶然突发想法,做了两个小实验,第一个实验是采用最小二乘法对数据进行拟合, 第二个实验是采用梯度下降方法对数据 ...

  5. 机器学习---用python实现最小二乘线性回归算法并用随机梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)

    在<机器学习---线性回归(Machine Learning Linear Regression)>一文中,我们主要介绍了最小二乘线性回归算法以及简单地介绍了梯度下降法.现在,让我们来实践 ...

  6. 梯度下降法的python代码实现(多元线性回归)

    梯度下降法的python代码实现(多元线性回归最小化损失函数) 1.梯度下降法主要用来最小化损失函数,是一种比较常用的最优化方法,其具体包含了以下两种不同的方式:批量梯度下降法(沿着梯度变化最快的方向 ...

  7. 梯度下降法实现最简单线性回归问题python实现

    梯度下降法是非常常见的优化方法,在神经网络的深度学习中更是必会方法,但是直接从深度学习去实现,会比较复杂.本文试图使用梯度下降来优化最简单的LSR线性回归问题,作为进一步学习的基础. import n ...

  8. 简单线性回归(梯度下降法) python实现

    grad_desc .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...

  9. 最小二乘法 及 梯度下降法 运行结果对比(Python版)

    上周在实验室里师姐说了这么一个问题,对于线性回归问题,最小二乘法和梯度下降方法所求得的权重值是一致的,对此我颇有不同观点.如果说这两个解决问题的方法的等价性的确可以根据数学公式来证明,但是很明显的这个 ...

随机推荐

  1. TensorFlow模型保存和提取方法

    一.TensorFlow模型保存和提取方法 1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取.tf.train.Saver对象saver的save方法将Tens ...

  2. Effective ObjectiveC 2.0 Note

    [Effective ObjectiveC 2.0 Note] 1.The memory for objects is always allocated in heap space and never ...

  3. SQL2005 异常处理机制(Begin try Begin Catch)

    将可能会出错的sql 写在begin try...end try 之间,若出错,刚程序就跳到紧接着的begin try...end try 的beign catch...end catch中,执行be ...

  4. 【bzoj2553】[BeiJing2011]禁忌

    2553: [BeiJing2011]禁忌 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 595  Solved: ...

  5. jquery动画效果总结

    一.jquery的动画速度fast-slow对应着600ms,200ms,不写是400ms 二.禁用jquery的动画 将jQuery.fx.off设置为true即可 $(".stoppin ...

  6. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  7. Python编写两个数的加减法游戏

    目标: 1.实现两个数的加减法 2.回答者3次输错计算结果后,输出正确结果,并询问回答者是否继续 1.使用常规函数实现两个数的加减法游戏 代码如下: #!/usr/bin/env python # - ...

  8. Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建

    1. 下载 gcc-linaro-arm-linux-gnueabihf-4.9.tar.gz 下载地址参考:http://blog.csdn.net/lg1259156776/article/det ...

  9. Python pip命令

    一.简介 pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品.distribute是setuptools的取代(Setuptools包后期不再维护了),p ...

  10. Bean管理注解的例子