梯度下降算法和牛顿算法原理以及使用python用梯度下降和最小二乘算法求回归系数

本文主要是介绍梯度下降算法和牛顿算法原理以及使用python用梯度下降和最小二乘算法求回归系数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

梯度下降算法
以下内容参考 微信公众号 AI学习与实践平台 SIGAI

导度和梯度的问题

因为我们做的是多元函数的极值求解问题,所以我们直接讨论多元函数。多元函数的梯度定义为:

在这里插入图片描述

其中称为梯度算子,它作用于一个多元函数,得到一个向量。下面是计算函数梯度的一个例子

在这里插入图片描述

可导函数在某一点处取得极值的必要条件是梯度为0,梯度为0的点称为函数的驻点,这是疑似极值点。需要注意的是,梯度为0只是函数取极值的必要条件而不是充分条件,即梯度为0的点可能不是极值点。

至于是极大值还是极小值,要看二阶导数/Hessian矩阵,Hessian矩阵我们将在后面的文章中介绍,这是由函数的二阶偏导数构成的矩阵。这分为下面几种情况:

如果Hessian矩阵正定,函数有极小值

如果Hessian矩阵负定,函数有极大值

如果Hessian矩阵不定,则需要进一步讨论

这和一元函数的结果类似,Hessian矩阵可以看做是一元函数的二阶导数对多元函数的推广。一元函数的极值判别法为,假设在某点处导数等于0,则:

如果二阶导数大于0,函数有极小值

如果二阶导数小于0,函数有极大值

如果二阶导数等于0,情况不定

精确的求解不太可能,因此只能求近似解,这称为数值计算。工程上实现时通常采用的是迭代法,它从一个初始点 x(0) 开始,反复使用某种规则从x(k) 移动到下一个点x(k+1),构造这样一个数列,直到收敛到梯度为0的点处。即有下面的极限成立:

在这里插入图片描述

这些规则一般会利用一阶导数信息即梯度;或者二阶导数信息即Hessian矩阵。这样迭代法的核心是得到这样的由上一个点确定下一个点的迭代公式:

在这里插入图片描述

这个过程就像我们处于山上的某一位置,要到山下去,因此我们必须到达最低点处。此时我们没有全局信息,根本就不知道哪里是地势最低的点,只能想办法往山下走,走 一步看一步。刚开始我们在山上的某一点处,每一步,我们都往地势更低的点走,以期望能走到山底。

最后我们来看一下梯度算法的推导过程。

多元函数f(x) 在x点处的泰勒展开为

在这里插入图片描述

这里我们忽略了二次及更高的项。其中,一次项是梯度向量与自变量增量Δx 的内积,这等价于一元函数的f`(x0) Δx 。这样,函数的增量与自变量的增量Δx ,函数梯度的关系可以表示为:

在这里插入图片描述

如果 Δx 足够小,在x的某一邻域内,则我们可以忽略二次及以上的项,有:

在这里插入图片描述

这里的情况比一元函数复杂多了, Δx 是一个向量,Δx有无穷多种方向,该往哪个方向走呢?如果能保证:

在这里插入图片描述

就可以得到

在这里插入图片描述

即函数值递减,这就是下山的正确方向。因为有:

在这里插入图片描述

因为向量的模一定大于等于0,如果:

在这里插入图片描述

就能保证

在这里插入图片描述

即选择合适的增量 Δx ,就能保证函数值下降,要达到这一目的,只要保证梯度和 Δx的夹角的余弦值小于等于0就可以了。由于有:

在这里插入图片描述

只有当θ=π的时候,cosθ有极小值-1,此时梯度和 Δx反向,即夹角为180度。因此当向量 Δx的模大小一定时,当

在这里插入图片描述

即在梯度相反的方向函数值下降的最快。此时有:cosθ= -1

函数的下降值为:

在这里插入图片描述

只要梯度不为0,往梯度的反方向走函数值一定是下降的。直接用可能会有问题,因为x+ Δx 可能会超出x的邻域范围之外,此时是不能忽略泰勒展开中的二次及以上的项的,因此步伐不能太大。一般设:

在这里插入图片描述

其中α 为一个接近于0的正数,称为步长,由人工设定,用于保证x+ Δx 在x的邻域内,从而可以忽略泰勒展开中二次及更高的项,则有:

在这里插入图片描述

从初始点x(0) 开始,使用如下迭代公式:

在这里插入图片描述

只要没有到达梯度为0的点,则函数值会沿着序列x(k) 递减,最终会收敛到梯度为0的点,这就是梯度下降法。迭代终止的条件是函数的梯度值为0(实际实现时是接近于0),此时认为已经达到极值点。
牛顿算法的原理

在最优化的问题中,线性最优化至少可以使用单纯行法求解,但对于非线性优化问题,牛顿法提供了一种求解的办法。假设任务是优化一个目标函数f,求函数f的极大极小问题,可以转化为求解函数f的导数f’=0的问题,这样求可以把优化问题看成方程求解问题(f’=0)。

为了求解f’=0的根,把f(x)的泰勒展开,展开到2阶形式:

在这里插入图片描述
这个式子是成立的,当且仅当 Δx 无线趋近于0。此时上式等价与:

在这里插入图片描述
求解:
在这里插入图片描述

得出迭代公式:

在这里插入图片描述
一般认为牛顿法可以利用到曲线本身的信息,比梯度下降法更容易收敛(迭代更少次数),如下图是一个最小化一个目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。
在这里插入图片描述
牛顿法原理参考以下链接:
原文链接:https://blog.csdn.net/a819825294/article/details/52172463

下面我们来用梯度下降法来求解下面这个式子的极小值和极小点
在这里插入图片描述

首先我们用Excel来计算。
用Excel只需要注意对x1和x2求偏导的计算公式就基本不会出错。

在这里插入图片描述

可以看到虽然函数值在4315就达到了极小值,但是x1和x2的值还是在微小变化,这时候我们一定要求到x1和x2的值不再变化。这样才是收敛。

在这里插入图片描述

到这里才几乎没有变化了。

然后我们用python代码来实现梯度下降

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import math
from mpl_toolkits.mplot3d import Axes3D
import warnings
# 二维原始图像
def f2(x1, x2):return x1**2 + 2*x2**2 - 4*x1 - 2*x1*x2 
## 偏函数
def hx1(x1, x2)

这篇关于梯度下降算法和牛顿算法原理以及使用python用梯度下降和最小二乘算法求回归系数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310573

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos