利用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 DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
django从请求到响应的过程深入讲解
Aug 01 Python
Python中dict和set的用法讲解
Mar 28 Python
详解Django定时任务模块设计与实践
Jul 24 Python
Python箱型图处理离群点的例子
Dec 09 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python torch.utils.data.DataLoader使用方法
Apr 02 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
Python如何定义接口和抽象类
Jul 28 Python
Pycharm中如何关掉python console
Oct 27 Python
Python简易开发之制作计算器
Apr 28 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
smarty的section嵌套循环用法示例
2016/05/28 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
javascript生成大小写字母
2015/07/03 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
Python中设置变量访问权限的方法
2015/04/27 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
python opencv摄像头的简单应用
2019/06/06 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
如何解决python多种版本冲突问题
2020/10/13 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
Python实现石头剪刀布游戏
2021/01/20 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
餐厅总厨求职信
2014/03/04 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
会计求职自荐信
2014/06/20 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
班主任开场白
2015/06/01 职场文书
2016小学新学期寄语
2015/12/04 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript