利用Python实现最小二乘法与梯度下降算法


Posted in Python onFebruary 21, 2021

导入所需库

%matplotlib inline
import sympy
import numpy as np
import matplotlib.pyplot as plt
from sympy.abc import x as a,y as b

生成模拟数据

# 模拟函数 y=3x-1

#自变量
x=np.linspace(-5,5,num=1000)
#加入噪声
noise=np.random.rand(len(x))*2-1
#因变量
y=3*x-1+noise

查看所生成数据的图像

plt.figure(figsize=(10,10))
plt.scatter(x,y,s=1)

利用Python实现最小二乘法与梯度下降算法

求代价函数的偏导

y=ax+b  #目标函数

e=1/2*Σ([axi+b]-yi)^2   #代价函数,求使得代价函数为最小值时,对应的a和b

对a求偏导->Σ(axi+b-yi)*xi

对b求偏导->Σ(axi+b-yi)

1. 通过最小二乘法求a,b

我们知道当在a,b处的偏导为0时,代价函数e达到最小值,所以得到二元一次方程组

Σ(axi+b-yi)*xi=0
Σ(axi+b-yi)=0

该方程组是关于未知数为a,b的二元一次方程组,通过求解该方程,得到a,b

result=sympy.solve([
  np.sum((a*x+b-y)*x),
  np.sum(a*x+b-y)],[a,b])
print(result)	#{x: 3.01182977621975, y: -1.00272253325765}

通过sympy库解方程组,得出了a= 3.01182977621975,b= -1.00272253325765,已经与我们真实的a,b很接近了,下面进行作图

plt.figure(figsize=(10,10))
plt.scatter(x,y,s=1)
plt.plot(x,result[a]*x+result[b],c='red')

print(type(a),type(b))	#<class 'sympy.core.symbol.Symbol'> <class 'sympy.core.symbol.Symbol'>

利用Python实现最小二乘法与梯度下降算法

2. 通过梯度下降算法求a,b

我们注意到最小二乘法最后一步要求p个方程组,是非常大的计算量,其实计算起来很难,因此我们就有了一种新的计算方法,就是梯度下降法,梯度下降法可以看作是 更简单的一种 求最小二乘法最后一步解方程 的方法

# 注意这里覆盖了sympy.abc的a和b
# 设定a和b的起始点
a,b=0.1,0.1

#步长,也称作学习率
alpha=0.00001

#循环一千次结束
for i in range(1000):
  a-=alpha*np.sum((a*x+b-y)*x)
  b-=alpha*np.sum(a*x+b-y)

print(a,b)	#3.0118297762197526 -1.002674927350334

通过梯度下降法,得出了a= 3.0118297762197526,b= -1.002674927350334,也是很接近真实的a,b值了,作图看看

plt.figure(figsize=(10,10))
plt.scatter(x,y,s=1)
plt.plot(x,a*x+b,c='black')

print(type(a),type(b))	#<class 'numpy.float64'> <class 'numpy.float64'>

利用Python实现最小二乘法与梯度下降算法

到此这篇关于利用Python实现最小二乘法与梯度下降算法的文章就介绍到这了,更多相关Python最小二乘法与梯度下降内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
使用python调用zxing库生成二维码图片详解
Jan 10 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python 处理数据的实例详解
Aug 10 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 Python
如何利用python正则表达式匹配版本信息
Dec 09 Python
python3 实现mysql数据库连接池的示例代码
Apr 17 Python
Scrapy实现模拟登录的示例代码
Feb 21 #Python
scrapy-splash简单使用详解
Feb 21 #Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 #Python
利用Python如何画一颗心、小人发射爱心
Feb 21 #Python
python 第三方库paramiko的常用方式
Feb 20 #Python
Python中Qslider控件实操详解
Feb 20 #Python
python基于selenium爬取斗鱼弹幕
Feb 20 #Python
You might like
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP Google的translate API代码
2008/12/10 PHP
PHP类中Static方法效率测试代码
2010/10/17 PHP
基于empty函数的判断详解
2013/06/17 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
跟老齐学Python之集合的关系
2014/09/24 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python封装原理与实现方法详解
2018/08/28 Python
老生常谈python中的重载
2018/11/11 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
政风行风评议工作总结
2014/10/21 职场文书
美丽心灵观后感
2015/06/01 职场文书
孝女彩金观后感
2015/06/10 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang