非线性优化:高斯-牛顿法的原理与实现

news2024/9/20 18:38:10

非线性优化:高斯-牛顿法的原理与实现

引言

在实际应用中,很多问题都是非线性的。非线性优化问题广泛应用于机器学习、数据拟合、工程设计等领域。高斯-牛顿法是一种常用于解决非线性最小二乘问题的迭代算法。本文将详细介绍高斯-牛顿法的原理、推导过程,并通过Python代码实现该算法。

高斯-牛顿法原理

问题定义

非线性最小二乘问题可以表示为:
min ⁡ x ∑ i = 1 m [ r i ( x ) ] 2 \min_{\mathbf{x}} \sum_{i=1}^m [r_i(\mathbf{x})]^2 xmini=1m[ri(x)]2
其中, x \mathbf{x} x 是需要优化的参数向量, r i ( x ) r_i(\mathbf{x}) ri(x)是残差函数。

高斯-牛顿法

高斯-牛顿法的基本思想是利用泰勒展开对非线性函数进行线性近似,然后求解线性最小二乘问题。具体步骤如下:

  1. 初始猜测参数 x 0 \mathbf{x}_0 x0
  2. 迭代更新参数 x \mathbf{x} x
    x k + 1 = x k − ( J T J ) − 1 J T r ( x k ) \mathbf{x}_{k+1} = \mathbf{x}_k - (\mathbf{J}^T \mathbf{J})^{-1} \mathbf{J}^T \mathbf{r}(\mathbf{x}_k) xk+1=xk(JTJ)1JTr(xk)
    其中, J \mathbf{J} J 是残差函数 r ( x ) \mathbf{r}(\mathbf{x}) r(x)对参数 x \mathbf{x} x 的雅可比矩阵。

雅可比矩阵

雅可比矩阵 J \mathbf{J} J 的每个元素定义为:
J i j = ∂ r i ( x ) ∂ x j J_{ij} = \frac{\partial r_i(\mathbf{x})}{\partial x_j} Jij=xjri(x)

Python实现

下面的代码展示了如何使用高斯-牛顿法解决非线性最小二乘问题。

示例问题

我们以一个简单的非线性函数为例:
y = a exp ⁡ ( b x ) + c y = a \exp(b x) + c y=aexp(bx)+c
给定一组数据点 ( x i , y i ) (x_i, y_i) (xi,yi),拟合参数 a , b , c a, b, c a,b,c

代码实现

import numpy as np
import matplotlib.pyplot as plt

def residuals(params, x, y):
    a, b, c = params
    return y - (a * np.exp(b * x) + c)

def jacobian(params, x):
    a, b, c = params
    J = np.zeros((len(x), len(params)))
    J[:, 0] = -np.exp(b * x)
    J[:, 1] = -a * x * np.exp(b * x)
    J[:, 2] = -1
    return J

def gauss_newton(x, y, initial_params, max_iter=100, tol=1e-6):
    params = np.array(initial_params)
    for i in range(max_iter):
        r = residuals(params, x, y)
        J = jacobian(params, x)
        delta = np.linalg.inv(J.T @ J) @ J.T @ r
        params = params - delta
        
        if np.linalg.norm(delta) < tol:
            break
    
    return params

# 生成示例数据
np.random.seed(0)
x = np.linspace(0, 1, 100)
a_true, b_true, c_true = 2, -1, 0.5
y_true = a_true * np.exp(b_true * x) + c_true
y_noisy = y_true + 0.1 * np.random.normal(size=x.size)

# 高斯-牛顿法拟合
initial_params = [1, -0.5, 0]
params_estimated = gauss_newton(x, y_noisy, initial_params)

# 输出结果
print("Estimated parameters:", params_estimated)
print("True parameters:", [a_true, b_true, c_true])

# 可视化拟合结果
y_fitted = params_estimated[0] * np.exp(params_estimated[1] * x) + params_estimated[2]
plt.scatter(x, y_noisy, label='Noisy data')
plt.plot(x, y_true, label='True function', linestyle='--')
plt.plot(x, y_fitted, label='Fitted function', color='red')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gauss-Newton Method for Nonlinear Least Squares')
plt.show()

代码说明

  1. residuals:计算残差函数 ( r(\mathbf{x}) )。
  2. jacobian:计算雅可比矩阵 ( \mathbf{J} )。
  3. gauss_newton:实现高斯-牛顿法的主函数。该函数迭代更新参数,直到收敛或达到最大迭代次数。
  4. 示例数据生成与拟合:生成示例数据并使用高斯-牛顿法进行拟合,最后可视化结果。

结果展示

运行上述代码,可以得到拟合的参数估计值及其与真实值的比较,并通过图形展示拟合效果。

Estimated parameters: [ 2.00731989 -0.99971756  0.50021009]
True parameters: [2, -1, 0.5]

在这里插入图片描述

从结果可以看出,高斯-牛顿法能够较准确地估计非线性函数的参数。通过可视化图形,可以直观地看到拟合曲线与真实曲线之间的差异。

结论

高斯-牛顿法是一种强大且常用的非线性最小二乘优化方法。在处理非线性问题时,通过迭代更新参数,高斯-牛顿法可以有效地逼近全局最优解。本文介绍了高斯-牛顿法的原理、推导过程,并通过Python代码展示了如何应用该算法解决实际问题。

希望本文能够帮助您理解和应用高斯-牛顿法。如果您有任何问题或建议,欢迎在评论区留言讨论。

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

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

相关文章

LORA微调,让大模型更平易近人

技术背景 最近和大模型一起爆火的&#xff0c;还有大模型的微调方法。 这类方法只用很少的数据&#xff0c;就能让大模型在原本表现没那么好的下游任务中“脱颖而出”&#xff0c;成为这个任务的专家。 而其中最火的大模型微调方法&#xff0c;又要属LoRA。 增加数据量和模…

力扣:104. 二叉树的最大深度

104. 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a…

【STL】C++ stack(栈) 基本使用

目录 一 stack常见构造 1 空容器构造函数&#xff08;默认构造函数&#xff09; 2. 使用指定容器构造 3 拷贝构造函数 二 其他操作 1 empty 2 size 3 top 4 push && pop 5 emplace 6 swap 三 总结 一 stack常见构造 1 空容器构造函数&#xff08;默认构造…

Vue 前端加框 给div加红色框框 js实现

实现方式&#xff1a;用getElementsByClassName、createElement、appendChild实现在原有div上添加一个新的div&#xff0c;从而达到框选效果 <template><div><el-button click"addIten">添加</el-button><el-button click"deleteIt…

ARM-V9 RME(Realm Management Extension)系统架构之系统能力的内存隔离和保护

安全之安全(security)博客目录导读 目录 一、内存隔离和保护 1、颗粒PAS过滤Granular PAS filtering 2、Cache的一致性维护 2.1 物理别名点 Point of Physical Aliasing (PoPA) 2.2 加密点 3、内存(DRAM)保护 3.1 内存加密和完整性 3.2 DRAM scrubbing 本博客探讨 RME…

PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目

在创建PHP项目之前我们需要安装PHP插件&#xff0c;安装步骤如下&#xff1a;Windows&#xff1a;IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目&#xff0c;导入之后选择&#xff0c;File > Setting 选择对应 CLL Interpreter&#xff0c;如果没有操…

基于GO 写的一款 GUI 工具,M3u8视频下载播放器-飞鸟视频助手

M3u8视频下载播放器-飞鸟视频助手 M3u8视频飞鸟视频助手使用m3u8下载m3u8 本地播放 软件下载地址m3u8嗅探 M3u8视频 M3u8视频格式是为网络视频播放设计&#xff0c;视频网站多数采用 m3u8格式。如腾讯&#xff0c;爱奇艺等网站。 m3u8和 mp4的区别&#xff1a; 一个 mp4是一个…

软件游戏缺失d3dcompiler_47.dll如何解决,简单有效的五种解决方法分享

在现代游戏中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。这个问题通常会导致游戏无法正常运行或出现崩溃的情况。为了解决这个问题&#xff0c;我总结出了以下五种解决方法。希望这些方法能够帮助到遇到相同问题的玩家。 …

LangChain入门开发教程(一):Model I/O

官方文档&#xff1a;https://python.langchain.com/docs/get_started/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能力进行快速应用开发的框架&#xff1a; 高度抽象的组件&#xff0c;可以像搭积木一样&a…

AI大模型日报#0529:杨红霞创业入局“端侧模型”、Ilya左膀右臂被Claude团队挖走

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-34B&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff0…

原神抽卡点名程序教程(直接下载用)

今天我要给大家分享一个在抖音上特别火的视频——原神抽卡点名程序教程。 &#xff08;要源码的私信扣31&#xff09; 废话不多说&#xff0c;直接上效果图 &#xff1a; 步骤1&#xff1a; 步骤2&#xff1a;&#xff08;写名单&#xff0c;前面加数字代表星级&#xff0c;用…

【OrangePi AIpro】开箱初体验以及OAK深度相机测试

1. 简介 Orangepi AIPRO 是一款采用昇腾AI技术路线&#xff0c;集成4核64位处理器AI处理器的单板计算机&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接eMMC模块&#xff0c;支持双4K高清输出。 Orange Pi AIpr…

网上打印资料A4纸一般多少钱一张

我们知道&#xff0c;在打印需求上A4纸&#xff08;210mmx297mm&#xff09;是较为常见的打印用纸&#xff0c;同时因为纸张的不同在价格上也存在一定的差异。当然&#xff0c;因在网上打印平台打印资料&#xff0c;能够降低一定的租金个人工成本。 因此&#xff0c;在网上打印…

有限元之抛物型方程初边值问题解法

目录 一、原方程的变分形式 二、有限元法进行空间半离散 三、差分法进行时间全离散 四、相关量的数值计算 五、编程时的说明 六、算例实现 6.1 C代码 6.2 计算结果 本节我们将采用有限元法联合差分法来数值求解抛物型方程的初边值问题&#xff1a; 其中常数。 一、原方…

cf练习5.29

A ac代码 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;int main() {IOSint t;cin>>t;while(t--){int ans0;int a,b;cin>>a>>b;if(b0){if(a%150) ansa/15;else ansa/151;}else if(b!0…

软件架构设计属性之三:结构性属性浅析

文章目录 引言一、结构性属性的定义二、结构性属性的关键要素1. 组件化2. 模块化3. 层次化4. 接口定义5. 数据流6. 依赖管理 三、结构性属性的设计原则1. 高内聚低耦合2. 松耦合3. 清晰的接口4. 可维护性5. 可扩展性 四、结构性属性的实现策略1. 组件划分2. 模块化设计3. 接口设…

Photoshop粘贴 lorem-ipsum 占位符文本

Photoshop在使用文字工具的时候&#xff0c;点击画布会自动出现一段英文“Lorem Ipsum”&#xff0c;这是占位文本&#xff0c;除了响应速度慢外&#xff0c;目前我也没发现它有什么太大意义。 那么要如何操作才能取消占位文本的填写呢&#xff1f;在菜单栏点 编辑-首选项-文字…

【Linux】如何优雅的检查Linux上的用户登录、关机和重启日志

在诸如Ubuntu、Debian、Linux Mint、Fedora和Red Hat等广受欢迎的Linux发行版中&#xff0c;系统会忠实记录用户的登录、关机、重启以及运行时长信息。这些信息对管理员调查事件、排查故障或汇总用户活动报告极为宝贵。 Linux系统及应用程序日志通常保存在/var/log/目录下&…

100个投资者99个选择使用这款EA,WeTrade发现1个事实

为什么100个投资者会有99个选择使用这款EA&#xff0c;是因为这款EA能提供两个版本吗?是因为能控制风险吗?都不是&#xff0c;WeTrade发现1个事实才是这么多投资者选择的原因&#xff0c;那就是能实现100%的盈利率。 我们都知道外汇狙击手EA提供两种版本&#xff0c;分别是标…

debian11安装留档@VirtualBox

因为debian12无法安装tpot&#xff0c;所以又把11重新安装一遍&#xff0c;以前的安装文档&#xff1a;安装Debian 11 留档-CSDN博客 下载光盘 华为云地址&#xff1a;https://repo.huaweicloud.com/debian-cd/11.0.0/amd64/iso-cd/ 使用了debian11 教育版&#xff0c;比较有…