利用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 基础学习教程
Feb 08 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
Python numpy 常用函数总结
Dec 07 Python
Python实现的微信好友数据分析功能示例
Jun 21 Python
用pycharm开发django项目示例代码
Oct 24 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
python构造函数init实例方法解析
Jan 19 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
解决django FileFIELD的编码问题
Mar 30 Python
python urllib和urllib3知识点总结
Feb 08 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
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
vue按需加载实例详解
2019/09/06 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
如何利用python读取micaps文件详解
2020/10/18 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
服装设计专业毕业生推荐信
2013/11/09 职场文书
社会实践感言
2014/01/25 职场文书
委托书如何写
2014/08/30 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang