梯度下降算法和牛顿算法原理以及使用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

相关文章

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基