LM(Levenberg-Marquardt) PCG(预条件共轭梯度法)

文章目录

    • PCG共轭梯度法
      • PCG算法步骤
      • 示例程序实现
      • 运行结果
      • PCG vs LM
        • PCG优势
        • PCG劣势
        • LM优势
        • LM劣势
        • 综合比较
        • 对比示例代码
        • 结果与对比
        • 总结

PCG共轭梯度法

预条件共轭梯度法(PCG)是一种用于求解大规模稀疏线性系统 A x = b Ax = b Ax=b的迭代方法。它在求解对称正定矩阵时特别高效。PCG 通过结合预条件技术,可以加速共轭梯度法的收敛速度。

  1. 共轭梯度法(CG)
    共轭梯度法是求解对称正定线性系统的一种迭代方法。它的基本思想是,在每一步中找到一个搜索方向,使得搜索方向与之前所有搜索方向共轭,从而在有限的步数内达到精确解。

  2. 预条件共轭梯度法(PCG)
    预条件共轭梯度法是在共轭梯度法的基础上,引入了预条件矩阵 M M M,目的是改善原始矩阵 A A A的条件数,从而加速收敛。预条件矩阵 M M M应该是容易求逆的,并且 M − 1 A M^{-1}A M1A的条件数较小。

PCG算法步骤

A A A是一个对称正定矩阵, M M M是预条件矩阵,求解 A x = b Ax = b Ax=b

  1. 初始化:设初始解 x 0 x_0 x0,计算初始残差 r 0 = b − A x 0 r_0 = b - Ax_0 r0=bAx0,设置初始搜索方向 p 0 = M − 1 r 0 p_0 = M^{-1}r_0 p0=M1r0
  2. 迭代步骤:
    • 计算 α k = r k T M − 1 r k p k T A p k \alpha_k = \frac{r_k^T M^{-1} r_k}{p_k^T A p_k} αk=pkTApkrkTM1rk
    • 更新解: x k + 1 = x k + α k p k x_{k+1} = x_k + \alpha_k p_k xk+1=xk+αkpk
    • 更新残差: r k + 1 = r k − α k A p k r_{k+1} = r_k - \alpha_k A p_k rk+1=rkαkApk
    • 检查收敛:如果 r k + 1 r_{k+1} rk+1的范数小于给定的阈值,则停止迭代。
    • 计算新的搜索方向系数: β k = r k + 1 T M − 1 r k + 1 r k T M − 1 r k \beta_k = \frac{r_{k+1}^T M^{-1} r_{k+1}}{r_k^T M^{-1} r_k} βk=rkTM1rkrk+1TM1rk+1
    • 更新搜索方向: p k + 1 = M − 1 r k + 1 + β k p k p_{k+1} = M^{-1}r_{k+1} + \beta_k p_k pk+1=M1rk+1+βkpk
  3. 返回最终解 x k x_k xk

示例程序实现

以下是用Python实现的PCG共轭梯度法:

import numpy as npdef pcg(A, b, M_inv, x0=None, tol=1e-8, max_iter=None):n = len(b)if x0 is None:x0 = np.zeros(n)if max_iter is None:max_iter = 2 * nx = x0r = b - A @ xz = M_inv @ rp = zrz_old = np.dot(r, z)for i in range(max_iter):Ap = A @ palpha = rz_old / np.dot(p, Ap)x = x + alpha * pr = r - alpha * Apif np.linalg.norm(r) < tol:breakz = M_inv @ rrz_new = np.dot(r, z)beta = rz_new / rz_oldp = z + beta * prz_old = rz_newreturn x# 示例
if __name__ == "__main__":A = np.array([[4, 1], [1, 3]], dtype=float)b = np.array([1, 2], dtype=float)M_inv = np.linalg.inv(np.array([[4, 0], [0, 3]], dtype=float))  # 预条件矩阵的逆x0 = np.zeros_like(b)x = pcg(A, b, M_inv, x0)print("解 x =", x)print("验证 Ax =", A @ x)print("原向量 b =", b)

运行结果

解 x = [0.09090909 0.63636364]
验证 Ax = [1. 2.]
原向量 b = [1. 2.]
  • A 是待求解的对称正定矩阵。
  • b 是等式右侧的向量。
  • M_inv 是预条件矩阵的逆。
  • x0 是初始解。

通过预条件共轭梯度法,我们可以快速求解大规模稀疏线性系统。在实际应用中,选择适当的预条件矩阵是关键,它直接影响算法的收敛速度和计算效率。

预条件共轭梯度法(PCG)和Levenberg-Marquardt(LM)算法都是解决非线性优化问题的有效方法,但它们在原理、适用场景和性能方面有明显的不同。以下是PCG和LM算法的优缺点比较:

PCG vs LM

PCG优势
  1. 适用于大规模稀疏线性系统

    • PCG特别适用于求解大型稀疏对称正定矩阵的线性系统,能够高效处理大规模数据。
  2. 内存使用效率高

    • 由于PCG在每次迭代中只需要存储少量的向量,因此对于内存的使用非常高效,适合内存受限的环境。
  3. 渐近最优性

    • PCG在理论上可以在有限步内收敛到精确解(对于理想的预条件情况下),适用于一些特殊的工程和科学计算问题。
  4. 易于并行化

    • 由于PCG的矩阵-向量乘法和预条件应用可以并行化,PCG算法非常适合在多核处理器和分布式计算环境中实现。
PCG劣势
  1. 依赖预条件

    • PCG的性能高度依赖于预条件矩阵的选择。如果预条件选择不当,可能会导致收敛速度很慢甚至不收敛。
  2. 适用范围有限

    • PCG主要适用于对称正定矩阵,对于非对称或非正定矩阵,PCG不能直接应用。
LM优势
  1. 解决非线性最小二乘问题的标准方法

    • LM算法是求解非线性最小二乘问题的标准方法,特别适合于曲线拟合、参数估计和图像处理中的许多问题。
  2. 鲁棒性强

    • LM算法结合了高斯-牛顿法和梯度下降法的优点,具有较强的鲁棒性和稳定性,能够处理一些具有噪声和非线性特性的实际问题。
  3. 良好的全局收敛性

    • LM算法通过调节阻尼参数,能够在全局范围内有效收敛,适用于各种初始条件。
LM劣势
  1. 计算复杂度高

    • LM算法在每次迭代中需要计算雅可比矩阵并求解线性系统,对于大规模问题,计算和存储成本非常高。
  2. 内存占用大

    • 由于需要存储和操作较大的雅可比矩阵和海森矩阵,LM算法对内存的需求较大,不适合非常大规模的问题。
  3. 依赖初始猜测

    • LM算法的收敛速度和效果依赖于初始参数的选择,对于一些初始猜测不佳的情况,可能会收敛到局部最优解。
综合比较
  • 适用场景

    • PCG适合于大规模稀疏对称正定线性系统。
    • LM适合于中小规模的非线性最小二乘优化问题。
  • 计算性能

    • PCG在处理大规模稀疏问题时具有高效性和内存使用效率。
    • LM在求解复杂非线性问题时具有更好的鲁棒性和全局收敛性,但计算和内存成本较高。
  • 预条件依赖性

    • PCG的性能依赖于预条件矩阵的选择。
    • LM不需要预条件,但依赖于合理的初始参数选择。

PCG和LM各有其优势和劣势,选择哪种算法取决于具体问题的性质和需求。如果需要解决大规模稀疏线性系统,尤其是对称正定矩阵,PCG是更好的选择。而对于复杂的非线性最小二乘问题,特别是中小规模的数据集,LM则更为适用。

将使用一个简单的非线性最小二乘问题来进行对比,定义目标函数为以下形式:

f ( x ) = ∑ i = 1 n ( y i − ( a ⋅ e b ⋅ x i ) ) 2 f(x) = \sum_{i=1}^n (y_i - (a \cdot e^{b \cdot x_i}))^2 f(x)=i=1n(yi(aebxi))2

其中,参数 a a a b b b是待优化的变量。

对比示例代码

我们将使用Python和常用的科学计算库(NumPy和SciPy)来实现PCG和LM算法,并进行对比。

import numpy as np
from scipy.optimize import least_squares
from scipy.sparse import diags
from scipy.sparse.linalg import cg# 生成示例数据
np.random.seed(0)
n = 100
x = np.linspace(0, 10, n)
a_true, b_true = 2.5, 1.3
y = a_true * np.exp(b_true * x) + 0.1 * np.random.randn(n)# 定义目标函数
def residuals(params, x, y):a, b = paramsreturn a * np.exp(b * x) - y# 定义雅可比矩阵
def jacobian(params, x, y):a, b = paramsJ = np.zeros((x.size, 2))J[:, 0] = np.exp(b * x)J[:, 1] = a * x * np.exp(b * x)return J# 预条件共轭梯度法求解
def pcg_solve(A, b, tol=1e-8, max_iter=None):M_inv = diags([1.0 / A.diagonal()], [0])  # 使用对角预条件x, info = cg(A, b, tol=tol, maxiter=max_iter, M=M_inv)return x# Levenberg-Marquardt算法求解
def lm_solve(x, y, initial_params):result = least_squares(residuals, initial_params, jac=jacobian, args=(x, y), method='lm')return result.x# 初始猜测
initial_params = [1.0, 0.5]# LM算法求解
params_lm = lm_solve(x, y, initial_params)
print("LM求解参数:", params_lm)# 生成线性系统Ax = b用于PCG
J = jacobian(initial_params, x, y)
A = J.T @ J
b = -J.T @ residuals(initial_params, x, y)# PCG算法求解
params_pcg = pcg_solve(A, b)
print("PCG求解参数:", params_pcg)# 对比结果
print("真实参数:", [a_true, b_true])
结果与对比
  • 真实参数[2.5, 1.3]

  • LM求解参数:接近真实参数;

    • 适用于非线性最小二乘问题,直接使用SciPy中的least_squares实现。
    • 结果较为准确,接近真实参数。
  • PCG求解参数:由于PCG本质上是用于线性系统求解,这里的实现是通过将非线性问题线性化,可能与真实参数有一定偏差;

    • 通常用于解决线性系统,这里通过构造Jacobian矩阵近似求解非线性问题。
    • 结果可能与真实参数有一定偏差,因为PCG在处理非线性问题时需要线性化近似。
总结
  • LM算法在处理非线性最小二乘问题时表现更好,能够更准确地求解参数。
  • PCG算法虽然主要用于线性系统求解,但在引入预条件和线性化近似后,也能在一定程度上解决非线性问题。

对于大规模稀疏线性系统,PCG有显著优势;而对于非线性优化问题,LM算法则表现出色。

LM参考链接

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

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

相关文章

棱镜七彩上榜《嘶吼2024网络安全产业图谱》两大领域

7月16日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》&#xff0c;棱镜七彩凭借在软件供应链安全领域出色的技术能力和优异的市场表现&#xff0c;上榜软件成分分析&#xff08;SCA&#xff09;、源代码安全两项细分领域。 据悉&#xff0c;本次《嘶吼2…

.net Excel的Winform控件 使用JSON公式代码

可以配合点击事件通过调接口的公式查询第三方平台的数据 using Feng.Json; using Feng.Script.CBEexpress; using Feng.Script.Method; using System; using System.Collections.Generic;namespace Feng.Script.FunctionContainer {[Serializable]public class JsonFunctionC…

1、PostgreSQL安装

PostgreSQL安装 1、postgreSQL介绍 PostgreSQL是一个免费的对象关系型数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;在灵活的BSD许可证下发行.PostgreSQL开发者把它念作post-gress-Q-L。PostgreSQL的Slogan是“世界上最先进的开源关系型数据库”。“开源界的Oracl…

成为CMake砖家(2): macOS创建CMake本地文档的app

大家好&#xff0c;我是白鱼。 使用 CMake 的小伙伴&#xff0c; 有的是在 Windows 上&#xff0c; 还有的是在 macOS 上。之前咱们讲了 windows 上查看 cmake 本地 html 文档的方式&#xff0c; 这篇讲讲 macOS 上查看 cmake 本地 html 文档的方法。 1. 问题描述 当使用 CMa…

防火墙--带宽管理

目录 核心思想 带宽限制 带宽保证 连接数的限制 如何实现 接口带宽 队列调度 配置位置 在接口处配置 带宽策略配置位置 带宽通道 配置地方 接口带宽、带宽策略和带宽通道联系 配置顺序 带块通道在那里配置 选项解释 引用方式 策略独占 策略共享 重标记DSCP优先…

Unity 关于Button无法高亮的问题

在Unity中&#xff0c;当我们新创建一个ButtonUI组件&#xff0c;并保持默认设置时&#xff0c;当我们把鼠标移动到Button上面时&#xff0c;Button是可以正常高亮的。但是当我们点击Button后再移动鼠标到Button处会发现Button无法高亮了。只有点击空白处后再移动鼠标到Button中…

文件乱码问题的一例分析

今天查看日志,遇到一种乱码问题, 终端展示的文件内容为: “\r\r\n” 尝试分析其原文. 使用xxd按照十六进制查看, 得到对应数据为: c3 8e c3 84 c2 bc c3 be c2 b2 c2 bb c2 b4 c3 a6 c3 94 c3 9a 0d 0d 0a 里面c3和c2大量存在,怀疑与两重编码有关, 使用NodeJS iconv-lite 做如…

软件游戏缺失concrt140.dll的解决方法,轻松搞定dll丢失问题

为了解决concrt140.dll文件缺失的问题&#xff0c;首先需要了解concrt140.dll文件的具体情况。只有在充分了解的基础上&#xff0c;才能采取有效的解决措施。下面&#xff0c;将详细介绍concrt140.dll文件及其解决方案。 一、了解concrt140.dll是什么 concrt140.dll 是微软的一…

SmartPipe新增功能:自动识别含间隙的低质量模型与自动处理超过180度的圆弧管路

自2022年12月SmartPipe上市以来&#xff0c;我一直在不断迭代和升级其轴线识别算法。对于客户反馈的无法自动转换的模型&#xff0c;我都视若珍宝&#xff0c;将其视为提升算法性能的绝佳机会。经过一年半的积累&#xff0c;SmartPipe的测试模型从最初的10个逐步迭代到近100个。…

使用MySQL WorkBench导出SQL脚本

参考: 在MySQL workbench 中导出sql脚本文件_mysql workbench自动保存的脚本在哪-CSDN博客 需要注意的是: 选择高级选项 这里不勾选&#xff0c;这样生成的INSERT是逐条的。将每个ROW合并为一个INSERT语句。 这里选择dump structure and data

画册制作攻略,助你成为视觉传达大师

在数字时代&#xff0c;画册作为一种传统而又充满魅力的视觉传达工具&#xff0c;依旧在各个领域扮演着重要角色。无论是在企业宣传、个人作品展示&#xff0c;还是艺术创作中&#xff0c;一本精美的画册都能让你的作品更具吸引力。那么&#xff0c;如何制作出一本引人入胜的画…

SQL Error: 1406, SQLState: 22001

SQL错误代码1406和SQLState 22001通常表示“列数据过长”错误。这意味着尝试插入或更新列中的值&#xff0c;但该值的长度超过了该列允许的最大长度。 解决此问题的几个步骤&#xff1a; 检查列长度&#xff1a; 确定引起错误的列。检查数据库架构中该列允许的最大长度。 验证…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…

创作模板三【创作模板】

xxx【创作模板三】 前言推荐说明最后 前言 2023年3月13日 以下内容源自《创作模板三》 仅供学习交流使用 推荐 无 说明 大三下的模板 专栏&#xff1a;计算机网络 【最后】的文案 因为确实不在意别人的看法&#xff0c;你了解的我不足万分之一 最后 你对我百般注视&am…

钓鱼攻击 - 基础学习

目录 0x00 基础1. 方式2. 目的3. 分类 0x01 外网钓鱼1. 目的2. 步骤 0x02 内网钓鱼1. 目的2. 步骤 0x03 钓鱼应急措施 0x00 基础 1. 方式 钓鱼攻击是一种典型的欺诈式攻击手段&#xff0c;攻击者通过伪装成可以信任的角色&#xff0c;利用电子邮件或其他通信渠道向被攻击者发送…

深度学习入门——误差反向传播

要正确理解误差反向传播法&#xff0c;我个人认为有两种方法&#xff1a;一种是基于数学式&#xff1b;另一种是基于计算图&#xff08;computational graph&#xff09; 前者是比较常见的方法&#xff0c;机器学习相关的图书中多数都是以数学式为中心展开论述的。因为这种方法…

老司机减分宝典助手-学法减分扣分题目及答案 #经验分享#经验分享#职场发展

学法减分其实就是把我们驾驶证上面的分数一分一分地找回来&#xff0c;为什么说是一分一分地找回来呢&#xff1f;因为必须先把违章处理完才可以&#xff0c;无论这辆车是不是你的&#xff0c;无论这辆车挂靠在谁的公司名下或者是单位名下&#xff0c;你都可以把这个分找回来&a…

电源模块企业该如何解决测试中的痛点问题?

根据研究发现&#xff0c;超过76%的企业在进行测试时会对产品质量、可靠性和测试速度这三项核心指标尤为重视。但是随着近几年的发展&#xff0c;目前的测试方法和措施对于这三项指标的测试远远无法达到企业的预期。被测产品的整体质量参差不齐、测试数据的可靠性以及测试的速度…

N7翻译实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言## 前言 本周完成项目实战用于训练一个简单的序列到序列&#xff08;seq2seq&#xff09;模型以实现英语到法语的翻译。数据预处理、模型构建、训练以及可…

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字&#xff1a;class 语法格式&#xff1a; class 类名 { }&#xff1b;//这里的分号不能少 此外&#xff0c;class有三个属性分别是private、public、protected&#xff0c;这三个属性是干啥的&#xff0c;相…