利用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实现协同过滤的教程
Apr 08 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
详解用Python处理HTML转义字符的5种方式
Dec 27 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
Python使用matplotlib 模块scatter方法画散点图示例
Sep 27 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
解决python 找不到module的问题
Feb 12 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
利用python实现后端写网页(flask框架)
Feb 28 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
Python anaconda安装库命令详解
Oct 16 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
php中一个有意思的日期逻辑处理
2012/03/25 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
微信支付开发告警通知实例
2016/07/12 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python中的格式化输出用法总结
2016/07/28 Python
python+opencv实现动态物体追踪
2018/01/09 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
Django models.py应用实现过程详解
2019/07/29 Python
python 字符串常用函数详解
2019/09/11 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
python实现粒子群算法
2020/10/15 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
十佳护士获奖感言
2014/02/18 职场文书
《比的意义》教学反思
2016/02/18 职场文书
python中的3种定义类方法
2021/11/27 Python
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android