梯度寻优 (二)

上接 梯度寻优

扩展:

逐次逼近法

问题 1: \(Ax = b\)

对于问题 1, 当 \(A\) 的阶数很大, 且零元素很多的大型稀疏矩阵方程组, 使用主元消去法求解将是一个很大的挑战. 为此, 逐次逼近法 (或称为迭代法) 应运而生.

下面我们来看看迭代法的具体操作:



首先将 \(Ax=b\) 改写为 \(x = Bx + f\), 使用公式:

\[
x^{k+1} = Bx^k + f
\]

其中 \(k\) 为迭代次数 \((k=0, 1, 2, \cdots)\)

逐步代入求近似解的方法称为迭代法.

若 \(\underset{k \to \infty}\lim x^k\) 存在 (记作 \(x^*\)), 称此迭代法收敛, 显然 \(x^*\) 就是方程组的解, 否则称此迭代法发散.


研究 \(\{x^k \}\) 的收敛性

引入误差向量:

\[
ε^{k+1} = x^{k+1} - x^*
\]

得到

\[
ε^{k+1} = (Bx^k + f) - (Bx^* + f) = Bε^k = B^kε^0
\]

故而, 要研究 \(\{x^k \}\) 的收敛性, 只需要研究 \(\underset{k \to \infty}\lim ε^k = 0\) 或 \(\underset{k \to \infty}\lim B^k = 0\) 满足的条件.

下面以 python 的形式呈现迭代的结果:

import numpy as np

%pylab inline
Populating the interactive namespace from numpy and matplotlib

求解方程组 \(Ax=b\)

消元法

A = mat([[8, -3, 2], [4, 11, -1], [6, 3, 12]])
b = mat([20, 33, 36])
result = linalg.solve(A, b.T)
print(result)
[[3.]
 [2.]
 [1.]]

迭代求原方程组的解:\(x^{k+1}=B x^k+f\)

B = mat([[0.0, 3.0 / 8.0, -2.0 / 8.0], [-4.0 / 11.0, 0.0, 1.0 / 11.0],
         [-6.0 / 12.0, -3.0 / 12.0, 0.0]])
m, n = shape(B)
f = mat([[20.0 / 8.0], [33.0 / 11.0], [36.0 / 12.0]])
error = 1.0e-7  # 误差阈值
steps = 100  # 迭代次数
xk = zeros((n, 1))  # 初始化 xk = x0
errorlist = []  # 记录逐次逼近的误差列表
for k in range(steps):  # 主程序
    xk_1 = xk  # 上一次的 xk
    xk = B * xk + f  # 本次 xk
    errorlist.append(linalg.norm(xk - xk_1))  # 计算并存储误差
    if errorlist[-1] < error:  # 判断误差是否小于阈值
        print(k + 1)  # 输出迭代次数
        break
print(xk)  # 输出计算结果
18
[[2.99999998]
 [2.00000003]
 [1.00000003]]

绘制误差收敛散点图

def drawScatter(plt, mydata, size=20, color=‘blue‘, mrkr=‘o‘):
    m, n = shape(mydata)
    if m > n and m > 2:
        plt.scatter(mydata.T[0], mydata.T[1], s=size, c=color, marker=mrkr)
    else:
        plt.scatter(mydata[0], mydata[1], s=size, c=color, marker=mrkr)
matpts = zeros((2, k + 1))
matpts[0] = linspace(1, k + 1, k + 1)
matpts[1] = array(errorlist)
drawScatter(plt, matpts)
plt.show()

如图, 可以看出误差收敛很快, 从第四次就开始接近最终结果, 后面的若干次迭代都是对结果的微调.

通过误差收敛与否判断解的存在性, 只要误差能够收敛, 方程组就会有解, 但若目标函数是非线性的, 为了更快的收敛, 我们需要找到收敛最快的方向 (梯度方向).

原文地址:https://www.cnblogs.com/q735613050/p/9498022.html

时间: 2024-08-08 20:15:27

梯度寻优 (二)的相关文章

python接口自动化测试(二)-requests.post()

上一节介绍了  requests.get()  方法的基本使用,本节介绍  requests.post()  方法的使用: 本文目录: 一.方法定义 二.post方法简单使用 1.带数据的post 2.带header的post 3.带json的post 4.带参数的post 5.普通文件上传 6.定制化文件上传 7.多文件上传 一.方法定义: 1.到官方文档去了下requests.post()方法的定义,如下: 2.源码: 3.常用返回信息: 二.post方法简单使用: 1.带数据的post:

二维码扫码积分系统定制开发

微信积分系统 二维码扫码积分系统定制开发找丽姐[158.1816.6626/电微]二维码营销模式系统定制开发 微信扫二维码营销系统开发 扫码领积分系统开发 一.如何实现扫二维码领红包功能? 1.使用扫描二维码领取红包对活动进行设置,包括红包数量.红包金额.促销地区.中奖概率等. 2.将生成的二维码赋到商品上面并赋涂层,一方面可以起到保证二维码的一次性,另一方面也可以引起消费者的好奇心. 3.通过手机微信打开扫一扫,扫码商品二维码关注公众号并领取红包,如果参与分享还可以获得抽奖的机会. 二.微信扫

微信生成二维码 只需一个网址即刻 还有jquery生成二维码

<div class="orderDetails-info"> <img src="http://qr.topscan.com/api.php?text=http://123.net/index.php?s=/Home/Index/yanzheng/mai/{$dange.id}" style="width: 5rem; margin-bottom: 1rem;" > </div> http://qr.tops

家电二维码售后服务平台系统开发

家电二维码售后服务平台系统开发,家电二维码售后系统开发,小吴183.2071.6434微电,家电二维码售后软件开发,家电二维码售后平台开发. 互联网平台的节点有两大类型:第一基数节点,也就是弱连接的节点,其规模要大,越大越好,互联网的价值与节点数的平比成正比.第二活跃节点,也就是强连接的节点,其能量要强,越强越好,互联网的价值与其强度成正比. 一.家电维修行业"维修黑幕"层出不穷 记者从一位从事家电维修人士那里了解到,目前行业公认当前家电维修行业有陷阱,"维修黑幕"

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1)创建数据表suppliers 前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应. 也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系. 其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

python接口自动化测试(二)-requests.get()

环境搭建好后,接下来我们先来了解一下requests的一些简单使用,主要包括: requests常用请求方法使用,包括:get,post requests库中的Session.Cookie的使用 其它高级部分:认证.代理.证书验证.超时配置.错误异常处理等. 本节首先来了解一下requests库中如何发送get请求: 一.看下方法定义: 1.到官方文档去了下requests.get()方法的定义,如下: 2.点击右上角的[source],看一下它的源码如下: 看到最后一行return,get方法

MySQL集群(二)之主主复制

前面介绍了主从复制,这一篇我将介绍的是主主复制,其实听名字就可以知道,主主复制其实就是两台服务器互为主节点与从节点.接下来我将详细的给大家介绍,怎么去配置主主复制! 一.主从复制中的问题 1.1.从节点占用了主节点的自增id 环境: 主节点:zyhserver1=1.0.0.3 从节点:udzyh1=1.0.0.5 第一步:我们在主节点中创建一个数据库db_love_1,在创建一个表tb_love(里面有id自增和name属性). create database db_love_1; use d