利用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中__call__方法示例分析
Oct 11 Python
python在Windows8下获取本机ip地址的方法
Mar 14 Python
python使用datetime模块计算各种时间间隔的方法
Mar 24 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
pandas进行时间数据的转换和计算时间差并提取年月日
Jul 06 Python
简单了解python的一些位运算技巧
Jul 13 Python
Python 爬取必应壁纸的实例讲解
Feb 24 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 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删除数组中特定元素的两种方法
2013/07/02 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
python 获取字符串MD5值方法
2018/05/29 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
初中生期末评语大全
2014/04/24 职场文书
个人综合鉴定材料
2014/05/23 职场文书
中药学自荐信
2014/06/15 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL