在Python中使用牛顿法

news2024/11/14 13:22:59

牛顿法简介

牛顿法(Newton’s method)是一种常用的优化算法,在机器学习中被广泛应用于求解函数的最小值。其基本思想是利用二次泰勒展开将目标函数近似为一个二次函数,并用该二次函数来指导搜索方向和步长的选择。

牛顿法需要计算目标函数的一阶导数和二阶导数,因此适用于目标函数可二阶可导的情况。在每一步迭代中,牛顿法会根据当前位置的一阶导数和二阶导数,计算出目标函数的二次泰勒展开式,并利用该二次函数的极小值点作为下一步的迭代点。因此牛顿法可以更快地接近最优解,尤其是对于高维函数来说。

但是,牛顿法的计算复杂度比较高,尤其是在高维空间中,需要计算大量的一阶和二阶导数。此外,牛顿法可能会收敛到局部最优解而非全局最优解,因为每一步迭代只能考虑当前位置的局部信息。

牛顿法也有一些改进的方法,如拟牛顿法(quasi-Newton method),它通过建立一个近似目标函数的Hessian矩阵来避免计算Hessian矩阵,提高了计算效率。

牛顿法数学推导

牛顿法是一种迭代方法,用于寻找多元函数的最小值或最大值。具体地,牛顿法利用函数的二阶导数信息来近似函数,并通过迭代求解近似函数的零点来求解原函数的最小值或最大值。

f ( x ) f(x) f(x)为一个实值函数, x 0 x_0 x0为函数 f ( x ) f(x) f(x)的一个初始点, x k x_k xk f ( x ) f(x) f(x)的第 k k k次近似解,则牛顿法的迭代公式为:
在这里插入图片描述
其中 f ′ ( x k ) f'(x_k) f(xk) f ′ ′ ( x k ) f''(x_k) f′′(xk)分别表示 f ( x ) f(x) f(x) x k x_k xk处的一阶导数和二阶导数。

对于求解函数的最小值,牛顿法的停止条件可以选择当函数值的变化小于某个阈值时停止迭代,即:

在这里插入图片描述
对于求解函数的最大值,牛顿法的停止条件可以选择当函数值的变化小于某个阈值时停止迭代,即:

在这里插入图片描述
或者选择当函数的一阶导数小于某个阈值时停止迭代,即:
在这里插入图片描述
需要注意的是,在实际应用中,牛顿法可能会因为某些点的二阶导数为0或者不存在而导致迭代失败。此外,当函数存在多个局部最小值或最大值时,牛顿法可能会陷入局部最小值或最大值而无法找到全局最小值或最大值。

海森矩阵

海森矩阵是牛顿法的核心之一。在牛顿法中,我们需要用到目标函数的梯度和海森矩阵,其中梯度告诉我们目标函数在某一点上的变化率,而海森矩阵则告诉我们梯度的变化率,即梯度的梯度。通过将海森矩阵加入牛顿法的迭代步骤中,我们可以更准确地确定下一步的搜索方向和步长,从而实现更快的收敛速度。

具体来说,在牛顿法的每次迭代中,我们需要计算目标函数在当前位置的梯度和海森矩阵,然后根据这些信息计算出下一步的搜索方向和步长。具体来说,我们使用海森矩阵的逆矩阵作为Hessian的近似值来计算搜索方向和步长。最终,通过不断迭代,我们可以找到目标函数的最小值点。
海森矩阵(Hessian matrix)是一个函数的二阶偏导数构成的方阵,通常用 H H H 表示。对于函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1,x2,,xn)

其中 ∂ 2 f ∂ x i ∂ x j \frac{\partial^2 f}{\partial x_i \partial x_j} xixj2f 表示 f f f x i x_i xi 偏导数再对 x j x_j xj 偏导数,即 x i x_i xi x j x_j xj 的二阶偏导数。

在 Python 中可以使用 NumPy 库计算海森矩阵。假设 f ( x 1 , x 2 ) f(x_1, x_2) f(x1,x2) 是一个二元函数,则可以定义计算海森矩阵的函数如下:

import numpy as np

def hessian(f, variables):
    """
    Compute the Hessian matrix of a function f with respect to variables.
    """
    n = variables.shape[0]
    hessian = np.zeros((n, n))
    for i in range(n):
        for j in range(i, n):
            hessian[i][j] = f(*variables, i, j)
            hessian[j][i] = hessian[i][j]
    return hessian

代码实现

这段代码的目的是使用牛顿法来优化一个简单的一元二次函数 f ( x ) = x 3 − 3 x 2 f(x)=x^3-3x^2 f(x)=x33x2,最终找到它的极小值点。首先在newton函数中定义了牛顿法的迭代公式,其中x_new是新的迭代点,使用原来的点x减去海森矩阵的逆矩阵乘以梯度向量得到。牛顿法中的关键是要计算海森矩阵,所以需要定义一个计算海森矩阵的函数hessian,其中通过二阶偏导数公式计算 f ( x ) f(x) f(x)的二阶导数 h ( x ) h(x) h(x),也就是海森矩阵。最后,在main函数中调用newton函数并画出优化结果的图像,可以看到牛顿法能够快速地找到函数的极小值点。

import numpy as np
import matplotlib.pyplot as plt

# Define the function to be optimized
def f(x):
    return x ** 3 - 3 * x ** 2

# Define the gradient of the function
def grad(x):
    return 3 * x ** 2 - 6 * x

# Define the Hessian of the function
def hessian(x):
    return np.array([[6 * x - 6]])

# Implement Newton's method
def newton(x, f, grad, hessian, alpha=0.1, max_iter=100):
    for i in range(max_iter):
        x_new = x - alpha * np.linalg.inv(hessian(x)).dot(grad(x))
        if np.abs(f(x_new) - f(x)) < 1e-6:
            break
        x = x_new
    return x_new

# Find the minimum of the function using Newton's method
x0 = 0
x_min = newton(x0, f, grad, hessian)

# Plot the function
x = np.linspace(-1, 3, 100)
y = f(x)
plt.plot(x, y, label='Function')

# Plot the minimum point
plt.plot(x_min, f(x_min), 'ro', label='Minimum')

# Add labels and legend
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

# Show the plot
plt.show()

但是当海森矩阵在某些点上不可逆的时候就会出现计算错误的情况。
海森矩阵不可逆的情况有以下几种:

1.海森矩阵不满秩:在某些点上,海森矩阵可能不是满秩的,这样就会出现不可逆的情况。

2.函数具有平稳点:在平稳点处,海森矩阵为零矩阵,因此不可逆。

3.函数存在鞍点:鞍点是指函数在某一维上是局部最小值,而在另一维上是局部最大值的点。在鞍点处,海森矩阵的特征值有正有负,因此不可逆。

在实际应用中,通常需要对海森矩阵进行调整,使其可逆。一种常见的方法是加入一个正则化项,比如L2正则化,这样可以使海森矩阵始终是正定矩阵,从而保证可逆性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始学架构——FMEA故障模式与影响分析

1 FMEA介绍 FMEA&#xff08;Failure mode and effects analysis&#xff0c;故障模式与影响分析&#xff09;又称为失效模式与后果分析、失效模式与效应分析、故障模式与后果分析等&#xff0c;专栏采用“故障模式与影响分析”&#xff0c;因为这个中文翻译更加符合可用性的语…

高并发的程序设计-系统设计层面

高并发的程序设计-系统设计层面 目录概述需求&#xff1a; 设计思路实现思路分析1.主要指标二、处理高并发的方案 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better …

ChatGPT写文章效果-ChatGPT写文章原创

ChatGPT写作程序&#xff1a;让文案创作更轻松 在当前数字化的时代&#xff0c;营销推广离不开文案创作。然而&#xff0c;写作对许多人来说可能是一项耗时而枯燥的任务。如果您曾经为写出较高质量的文案而苦恼过&#xff0c;那么ChatGPT写作程序正是为您而设计的。 ChatGPT是…

gitlab安装与使用(图文详解超详细)

一 找最新的安装镜像 推荐用清华源 目前最新版本是15.95 二 在/opt 下创建gitlab文件夹 [rootlocalhost ~]# mkdir /opt/gitlab [rootlocalhost ~]# 三 在gitlab目录下写一个 shell脚本 vim int.sh给它加上执行权限 chmod ux int.sh运行这个脚本 ./ins.sh出现这个截图 安…

three.js之摄像机

本节将在上一节的基础上进一步介绍一下摄像机功能。 three.js的摄像机主要包括两类&#xff1a;正交投影摄像机和透视投影摄像机。 透视投影摄像机&#xff1a;THREE.PerspectiveCamera&#xff0c;最自然的视图&#xff0c;距离摄像机越远&#xff0c;它们就会被渲染得越小。…

【编程问题】解决 mapper.xml 文件的 resultType 爆红问题:Cannot resolve symbol ‘xxx‘

解决mapper.xml文件的resultType爆红问题&#xff1a;Cannot resolve symbol xxx 1.问题描述2.问题分析3.问题解决3.1 配置注解&#xff08;推荐&#xff09;3.2 配置全类名3.3 删除插件 4.事件感悟 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_333 IDEA&#xff1a;2022.2.4 …

HCIP之MPLS中的VPN

目录 HCIP之MPLS中的VPN 定义 例图 解读 流程 双层标签技术 控制层面 数据层面 配置 HCIP之MPLS中的VPN 定义 VPN --- 虚拟网专用 --- 是一种运营商提供的&#xff0c;专门解决虚拟专线安全及宽带问题的综合解决方案 例图 解读 站点 --- 可以理…

Day936.如何重构过大类 -系统重构实战

如何重构过大类 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何重构过大类的内容。 在过去的代码里一定会遇到一种典型的代码坏味道&#xff0c;那就是“过大类”。 在产品迭代的过程中&#xff0c;由于缺少规范和守护&#xff0c;单个类很容易急剧膨胀&#…

婴儿尿布台出口美国CPC认证

什么是尿布台&#xff1f;尿布台上架亚马逊要怎么做&#xff1f;咱们接着往下看。 什么是尿布台&#xff1f; 尿布台&#xff1a;尿布台是一种自立式抬升结构&#xff0c;通常设计用于承托体重不超过 13.61 千克&#xff08;30 磅&#xff09;的儿童。儿童采用平躺姿势&#…

Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

场景 Forest 声明式HTTP客户端API框架&#xff0c;让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层&#xff0c; 是封装调用第三方restful api client接口的好帮手&#xff0c;是retrofit和feign之外另一个选择。 通过在接口上声明注解的方式配置HTTP请求接…

echarts中横坐标显示为time,使用手册

需求&#xff1a; 后端传递&#xff08;两段数据&#xff0c;不同时间间隔&#xff09;的24h实时数据&#xff0c;前端需要根据24小时时间展示&#xff0c;要求&#xff1a;x轴为0-24h&#xff0c;每个两小时一个刻度 误区&#xff1a; 刚开始通过二维数据的形式秒点&#xff…

Python入门到精通12天(迭代器与生成器)

迭代器与生成器 迭代器生成器 迭代器 迭代器是可迭代的对象&#xff0c;即可以进行遍历的对象。列表、字符串、元组、字典和集合这些都是可迭代的对象&#xff0c;都可以进行遍历。 迭代器是一种访问序列元素的方式&#xff0c;它可以通过next()函数逐个返回序列中的元素。并…

mybatis3源码篇(1)——构建流程

mybatis 版本&#xff1a;v3.3.0 文章目录 构建流程SqlSessionFactoryBuilderXMLConfigBuildertypeAliasesElementtypeHandlerElementmapperElementMapperRegistry MappedStatementMapperAnnotationBuilderXMLMapperBuilderMapperBuilderAssistant SqlSessionFactorySqlSession…

【录用案例】1区SCI仅36天录用,新增多本1-2区SCI,CNKI评职好刊发表案例

我处上周&#xff08;2023年4月8日-2023年4月14日&#xff09;经核实&#xff0c;由我处Unionpub学术推荐的24篇论文已被期刊部录用、20篇见刊&#xff0c;5篇检索&#xff1a; ✔新增1区纳米与环境类SCI&EI&#xff0c;仅36天录用&#xff0c;录用后17天见刊&#xff1b;…

前端canvas截图酷游地址的方法!

前情提要 想在在JavaScript中&#xff0c;酷游专员KW9㍠ㄇEㄒ提供用HTML5的Canvas元素来剪取画面并存成SVG或PNG。 程式写法(一) 首先&#xff0c;需要在HTML中创建一个Canvas元素<canvas id"myCanvas"></canvas> 在JavaScript中&#xff0c;使用canv…

【Java面试】ArrayList、LinkedList 查找数据哪个快

ArrayList、LinkedList查找数据哪个快 这里有几种不同情况 1、是不是有序的&#xff1f; 2、说的查找是什么意思&#xff1f;是调用get(1)&#xff0c;还是调用的contains(o)方法&#xff1f; 根据上面的问题&#xff0c;我们可以分开讨论&#xff1a; 1、数据是有序的 指定…

Apifox自动生成接口文档

1、安装 1.1 Apifox安装 官方文档&#xff1a;Apifox - API 文档、调试、Mock、测试一体化协作平台 - 接口文档工具&#xff0c;接口自动化测试工具&#xff0c;接口Mock工具&#xff0c;API文档工具&#xff0c;API Mock工具&#xff0c;API自动化测试工具 1.2 IDEA 插件安装…

Vue 复学 之 状态管理 Vuex

Vuex是vue中的一种状态管理模式&#xff0c;就是一个 状态仓库&#xff0c;仓库做什么&#xff1f;存储状态、管理状态&#xff08;数据&#xff09;的变化、提供状态获取窗口。 本文中一些测试用例基于vue/composition-api1.7.1 &#xff0c; vuex3.6.2&#xff0c; vue2.6.1…

【unity实战】随机地下城生成1——随机生成地下城初稿(含源码)

先看看实现的最终效果 #用到的素材 https://download.csdn.net/download/qq_36303853/87712757 导入素材 导入房间图片素材,配置图片信息信息 点击sprite Editor,开始切割图片 随机创建基本房间 已一个白底图片模拟房间预设体 思路:建立一个空的 GameObject 用来做…

C++中的STL容器

文章目录 一、序列式容器1.vector2.array3.deque4.list5.forward_list 二、关联式容器1.set、multiset、unordered_set和unordered_multiset2.map、multimap、unordered_map和unordered_multimap STL中的容器将一些应用最为广泛的数据结构实现了出来&#xff0c;它主要分为序列…