利用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实现在windows服务中新建进程的方法
Jun 30 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
Python中join()函数多种操作代码实例
Jan 13 Python
Python序列化pickle模块使用详解
Mar 05 Python
Python实现检测文件的MD5值来查找重复文件案例
Mar 12 Python
jupyter实现重新加载模块
Apr 16 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
Jun 04 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
python scrapy简单模拟登录的代码分析
Jul 21 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 柱状图实现代码
2009/12/04 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
php分页查询的简单实现代码
2017/03/14 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
农历与西历对照
2006/09/06 Javascript
JMenuTab简单使用说明
2008/03/13 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
python获取标准北京时间的方法
2015/03/24 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
Python面向对象之继承代码详解
2018/01/29 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
Python打印不合法的文件名
2020/07/31 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
材料专业毕业生求职信
2014/02/26 职场文书
买卖车协议书
2014/04/21 职场文书
语文教研活动总结
2014/07/02 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
销售人员工作自我评价
2014/09/21 职场文书
网络管理员岗位职责
2015/02/12 职场文书
圣诞晚会主持词
2015/07/01 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android