利用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 09 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
最大K个数问题的Python版解法总结
Jun 16 Python
python读文件的步骤
Oct 08 Python
python实现智能语音天气预报
Dec 02 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
django框架单表操作之增删改实例分析
Dec 16 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
pycharm实现猜数游戏
Dec 07 Python
用Python提取PDF表格的方法
Apr 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
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
vue树形结构获取键值的方法示例
2018/06/21 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
详解Python的Lambda函数与排序
2016/10/25 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
Tensorflow累加的实现案例
2020/02/05 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
幼儿园家长评语
2014/02/10 职场文书
会计员岗位职责
2014/03/15 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
给校长的建议书100字
2014/05/16 职场文书
承诺书模板
2014/08/30 职场文书
2014年财务部工作总结
2014/11/11 职场文书
优秀班主任申报材料
2014/12/16 职场文书
表扬通报怎么写
2015/01/16 职场文书
安全保证书怎么写
2015/02/28 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python