利用Python实现最小二乘法与梯度下降算法
作者:nbody1996 发布时间:2021-07-19 03:59:49
标签:Python,最小二乘法,梯度下降
导入所需库
%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)
求代价函数的偏导
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'>
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'>
来源:https://nbodyfun.blog.csdn.net/article/details/103408577
0
投稿
猜你喜欢
- 本文研究的主要是Python生成器及其应用,具体如下。一、定义可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调
- 如果视图定义包括条件(譬如 WHERE 子句)并且其意图是确保任何引用该视图的 INSERT 或 UPDATE 语句都应用 WHERE 子句
- Rotation滤镜可以使图片产生旋转效果,注意必须是IE5.5及IE6.0才能看到!方法如下:制作过程:一、准备图片1张。二、建立一个CS
- html页面一般都会指定一个编码,如何获取到是处理html页面的第一步,因为错误的编码必然带来后面处理的问题。这里我用python的正则表达
- 聚集索引,数据实际上是按顺序存储的,数据页就在索引页上。就好像参考手册将所有主题按顺序编排一样。一旦找到了所要搜索的数据,就完成了这次搜索,
- 一、背景有一段代码,因为调用了封装的方法,所以会有一些本来不需要的返回值。这些返回值该怎么处理才能让它消失呢。有的人会说,清除变量不就好了吗
- 为了自定义一个模板标签,你需要告诉Django当遇到你的标签时怎样进行这个过程。当Django编译一个模板时,它将原始模板分成一个个 节点
- 这篇文章我们学习 Python 变量与数据类型变量变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问。在
- Jupyter Notebook读取csv文件失败1.IndentationError: expected an indented bloc
- 本文实例讲述了Python实现简单状态框架的方法。分享给大家供大家参考。具体分析如下:这里使用Python实现一个简单的状态框架,代码需要在
- 1.SQL Server 2005中的存储过程并发问题问:我在SQL Server2005中遇到了并发问题。我持有车票的公共汽车上有一些空闲
- MySQL是一个真正的多用户、多线程SQL数据库服务器。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mys
- Python3实现旋转数组的3种算法下面是Python3实现的旋转数组的3种算法。一、题目给定一个数组,将数组中的元素向右移动 k 个位置,
- 几个常用的js小函数,在表单验证时也许您用得到:一检查是否是email地址,二检查是否为数字,三检查是否为电话号码,四检查num是否是负数或
- 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,
- 线程线程(Thread),有时也被称为轻量级进程(Lightweight Process,LWP),是操作系 * ⽴调度和分派的基本单位,本质
- dim sql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_PostSQL_injdata = "&
- 1.函数对象前面我们学习了关于Python中的变量类型,例如int、str、bool、list等等…&hell
- 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?我们先抛开 g
- 由于办公需要“每天定时推送某消息用来提醒群里面所有人”,有同事提议用企业微信自带的机器人来实现此功能。我觉得企业微信的这个工具还不错,具体使