利用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脚本实现DNSPod DNS动态解析域名
Feb 14 Python
python开发之thread线程基础实例入门
Nov 11 Python
python 把列表转化为字符串的方法
Oct 23 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
Python实现对adb命令封装
Mar 06 Python
python 双循环遍历list 变量判断代码
May 04 Python
pandas dataframe 中的explode函数用法详解
May 18 Python
Python脚本调试工具安装过程
Jan 11 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
SONY SRF-40W电路分析
2021/03/02 无线电
学习php开源项目的源码指南
2014/12/21 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
window.location.hash 属性使用说明
2010/03/20 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
Javascript实现信息滚动效果
2017/05/18 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
JS+DIV实现拖动效果
2020/02/11 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
浅谈python迭代器
2017/11/08 Python
python字符串的方法与操作大全
2018/01/30 Python
Python自动抢红包教程详解
2019/06/11 Python
Python callable内置函数原理解析
2020/03/05 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
违反学校规定检讨书
2014/01/18 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
贷款工资证明范本
2015/06/12 职场文书
golang中的空接口使用详解
2021/03/30 Python