Python实现——一元线性回归(梯度下降法)
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实现——一元线性回归(梯度下降法)的更多相关文章
- python实现简单的梯度下降法
代码如下: # 梯度下降法模拟 import numpy as np import matplotlib.pyplot as plt plot_x = np.linspace(-1,6,141) # ...
- Python实现——一元线性回归(最小二乘法)
2019/3/24 线性回归--最小二乘法公式法 暂时用python成功做出来了图像,但是其中涉及到的公式还是更多的来自于网络,尤其是最小二乘法公式中的两个系数的求解,不过目前看了下书高数也会马上提及 ...
- 梯度下降法及一元线性回归的python实现
梯度下降法及一元线性回归的python实现 一.梯度下降法形象解释 设想我们处在一座山的半山腰的位置,现在我们需要找到一条最快的下山路径,请问应该怎么走?根据生活经验,我们会用一种十分贪心的策略,即在 ...
- 最小二乘法 及 梯度下降法 分别对存在多重共线性数据集 进行线性回归 (Python版)
网上对于线性回归的讲解已经很多,这里不再对此概念进行重复,本博客是作者在听吴恩达ML课程时候偶然突发想法,做了两个小实验,第一个实验是采用最小二乘法对数据进行拟合, 第二个实验是采用梯度下降方法对数据 ...
- 机器学习---用python实现最小二乘线性回归算法并用随机梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)
在<机器学习---线性回归(Machine Learning Linear Regression)>一文中,我们主要介绍了最小二乘线性回归算法以及简单地介绍了梯度下降法.现在,让我们来实践 ...
- 梯度下降法的python代码实现(多元线性回归)
梯度下降法的python代码实现(多元线性回归最小化损失函数) 1.梯度下降法主要用来最小化损失函数,是一种比较常用的最优化方法,其具体包含了以下两种不同的方式:批量梯度下降法(沿着梯度变化最快的方向 ...
- 梯度下降法实现最简单线性回归问题python实现
梯度下降法是非常常见的优化方法,在神经网络的深度学习中更是必会方法,但是直接从深度学习去实现,会比较复杂.本文试图使用梯度下降来优化最简单的LSR线性回归问题,作为进一步学习的基础. import n ...
- 简单线性回归(梯度下降法) python实现
grad_desc .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...
- 最小二乘法 及 梯度下降法 运行结果对比(Python版)
上周在实验室里师姐说了这么一个问题,对于线性回归问题,最小二乘法和梯度下降方法所求得的权重值是一致的,对此我颇有不同观点.如果说这两个解决问题的方法的等价性的确可以根据数学公式来证明,但是很明显的这个 ...
随机推荐
- 如何重置Oracle服务器ILOM中root用户的密码
在ILOM中,root用户的缺省密码是changeme. 为了系统的安全性,通常情况下需要修改root密码. 如果忘了密码,可以参考以下步骤重置root密码. 用串口线连接Oracle服务器ILOM ...
- Java之常用类及方法
下面我们介绍Java类库所提供的常用类及类的常用方法 一.java.lang.String 1. String类常用的构造函数 public String(String original) 使用串对象 ...
- SMO是英文SQL Server Management Objects的缩写(上一篇文章的补充)
最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文章并不多见, ...
- Struts2处理逻辑的方式
1.可以统一写一个action 对应方法名处理不同逻辑 2.也可以分别写Action 分别处理不同的逻辑
- Libevent使用例子,从简单到复杂
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39670221 本文从简单到复杂,展示如何使用libevent.网上的许多例子都是只有服务 ...
- php安装memcache
php扩展memcache的作用是为了支持memcached数据库缓存服务器,下面是安装方法. 1.下载并解压memcache文件 1 2 3 wget -c http://pecl.php.net/ ...
- js 线程和进程的关系
进程(process)和线程(thread)是操作系统的基本概念 1.计算机的核心是CPU,它承担了所有的计算任务 2.单个CPU一次只能运行一个任务 3.进程它代表CPU所能处理的单个任务.任一时刻 ...
- VBox 安装 Ubuntu Server 的那些坑,键盘乱码、网卡互连、共享目录等
1.更新,相信大家都是有强迫症的 sudo apt-get update sudo apt-get upgrade 出现错误:Could not open lock file /var/lib/dpk ...
- iOS与HTML5交互方法总结(修正)
摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...
- The 'Microsoft Jet OLEDB 4.0 Provider' is not registered on the local machine
在一台Win7 64位的操纵系统上部署的C# Web系统,操作Excel,批量导入数据,报错,提示错误信息: The ‘Microsoft Jet OLEDB 4.0 Provider' is not ...