无约束优化问题求解(4):牛顿法后续

目录

  • 前言
  • SR1, DFP, BFGS之间的关系
  • BB方法
  • Reference

前言

Emm,由于上一篇笔记的字数超过了要求(这还是第一次- -),就把后续内容放到这篇笔记里面了,公式的标号仍然不变,上一篇笔记的连接在这:无约束优化问题求解(4):牛顿法

SR1, DFP, BFGS之间的关系

首先给出如下SMW公式:

在这里插入图片描述

考虑到 B k B_k Bk 才是对Hessian矩阵的近似,如果我们能够知道每步对 Hessian矩阵的近似情况,那么将对收敛性分析有着很大的帮助.

SR1的有递推公式为 H k + 1 = H k + ( s k − H k y k ) ( s k − H k y k ) T ( s k − H k y k ) T y k H_{k+1}=H_k+\frac{(s_k-H_ky_k)(s_k-H_ky_k)^T}{(s_k-H_ky_k)^Ty_k} Hk+1=Hk+(skHkyk)Tyk(skHkyk)(skHkyk)T两边取逆,使用SMW公式,可以得到SR1中, B k B_k Bk 的迭代式
B k + 1 = B k + ( y k − B k s k ) ( y k − B k s k ) T ( y k − B k s k ) T s k B_{k+1}=B_k+\frac{(y_k-B_ks_k)(y_k-B_ks_k)^T}{(y_k-B_ks_k)^Ts_k} Bk+1=Bk+(ykBksk)Tsk(ykBksk)(ykBksk)T可以发现,结果就是将 s k s_k sk y k y_k yk 交换,把 B k B_k Bk H k H_k Hk 交换。

因此,我们说SR1是自对偶的。

再看看DFP和BFGS迭代公式两边取逆后的结果:
D F P : H k + 1 = H k + s k s k T s k T y k − H k y k y k T H k y k T H k y k B k + 1 = B k + ( 1 + s k T B k s k s k T y k ) y k y k T s k T y k − ( y k s k T B k + B k s k y k T s k T y k ) B F G S : H k + 1 = H k + ( 1 + y k T H k y k s k T y k ) s k s k T s k T y k − ( s k y k T H k + H k y k s k T s k T y k ) B k + 1 = B k + y k y k T y k T s k − B k s k s k T B k s k T B k s k \begin{aligned} \mathrm{DFP}:H_{k+1}& =H_k+\frac{s_ks_k^T}{s_k^Ty_k}-\frac{H_ky_ky_k^TH_k}{y_k^TH_ky_k} \\ B_{k+1}& =B_k+\left(1+\frac{s_k^TB_ks_k}{s_k^Ty_k}\right)\frac{y_ky_k^T}{s_k^Ty_k}-\left(\frac{y_ks_k^TB_k+B_ks_ky_k^T}{s_k^Ty_k}\right) \\ \mathrm{BFGS}:H_{k+1}& =H_k+\left(1+\frac{y_k^TH_ky_k}{s_k^Ty_k}\right)\frac{s_ks_k^T}{s_k^Ty_k}-\left(\frac{s_ky_k^TH_k+H_ky_ks_k^T}{s_k^Ty_k}\right) \\ B_{k+1}& =B_k+\frac{y_ky_k^T}{y_k^Ts_k}-\frac{B_ks_ks_k^TB_k}{s_k^TB_ks_k} \end{aligned} DFP:Hk+1Bk+1BFGS:Hk+1Bk+1=Hk+skTykskskTykTHkykHkykykTHk=Bk+(1+skTykskTBksk)skTykykykT(skTykykskTBk+BkskykT)=Hk+(1+skTykykTHkyk)skTykskskT(skTykskykTHk+HkykskT)=Bk+ykTskykykTskTBkskBkskskTBk可以发现只要 s k ↔ y k , B k ↔ H k s_{k}\leftrightarrow y_{k},B_{k}\leftrightarrow H_{k} skyk,BkHk,就可以在DFP和BFGS公式之间相互转换。因此,我们说DFP和BFGS互为对偶的。

设需要优化的目标函数如下:
min ⁡ f ( x ) = ∑ i = 1 4 r i ( x ) 2 \min f(x)=\sum_{i=1}^4r_i(x)^2 minf(x)=i=14ri(x)2其中 r 2 i − 1 ( x ) = 10 ( x 2 i − x 2 i − 1 2 ) , r 2 i ( x ) = 1 − x 2 i − 1 r_{2i-1}(x)=10(x_{2i}-x_{2i-1}^2),r_{2i}(x)=1-x_{2i-1} r2i1(x)=10(x2ix2i12),r2i(x)=1x2i1 , x ∈ R 4 x\in\mathbb{R}^4 xR4 , x k x_k xk 代表向量 x x x 的第 k k k 个维度上的元素。

我们可以看出上述的优化问题的最优点为 ( 1 , 1 , 1 , 1 ) T (1,1,1,1)^T (1,1,1,1)T(可能有读者想知道怎么看出来的,只需要对每个分量求导,并令每个分量的一阶偏导数 ∂ f ∂ x i = 0 \frac{\partial f}{\partial x_i}=0 xif=0,求解出来的点便是可能的极值点) , 取迭代初值为 x 0 = ( 2 , 0 , 3 , 4 ) T x_0=(2,0,3,4)^T x0=(2,0,3,4)T 。我们首先先实现上述的函数,我通过一个函数获取一个映射 f : f: f:

from scipy.optimize import fmin_powell, fmin_bfgs, fmin_cg, minimize, SR1
import numpy as np
import matplotlib.pyplot as plt
​
# 定义函数
def r(i, x):
    if i % 2 == 1:
        return 10 * (x[i] - x[i - 1] ** 2)  # 因为ndarray数组的index是从0开始的, i多减一个
    else:
        return 1 - x[i - 2]def f(m):
    def result(x):
        return sum([r(i, x) ** 2 for i in range(1, m + 1)])
    return result # 返回函数值

为了观察拟牛顿法运行过程中迭代点的下降情况,我们需要计算损失的函数如下:

# 获取retall的每个点的值损失|f(x) - f(x^*)|
def getLosses(retall, target_point, func):
    """
    :param retall: 存储迭代过程中每个迭代点的列表,列表的每个元素时一个ndarray对象
    :param target_point: 最优点,是ndarray对象
    :param func: 优化函数的映射f
    :return: 返回一个列表,代表retall中每个点到最优点的欧氏距离
    """
    losses = []
    for point in retall:# 对于每一个迭代点的列表做循环
        losses.append(np.abs(func(target_point) - func(point))) #绝对值做损失
    return losses

scipy.optimize子库中的许多执行拟牛顿法的算子提供了call_back参数,该参数要求传入一个函数对象,在拟牛顿每步迭代完后,传入的call_back函数会被调用。由于使用SR1法的算子minimize无法返回迭代过程中的每一个迭代点(也就是retall),于是我们需要call_back函数来将迭代完的点传入外部的列表,从而获取SR1的retall。除此之外,我们可以使用call_back函数来指定迭代停止的条件。

我们编写一个返回函数对象的函数,它会根据我们传入参数的不同返回不同的call_back函数:

sr1_losses = [] # 存储SR1的retall的列表
func = f(4) # 获取需要优化的函数# 通过callback方法来添加迭代的停止条件
def getCallback(func, target_point, ftol, retall):
    """
    :param func: 优化目标的函数
    :param target_point:  目标收敛点
    :param ftol: 收敛条件:|f(x) - f(x^*)| < ftol时,迭代停止
    :param retall: 是否存储迭代信息
    :param extern_retall: 如果retall为True, 填入一个列表,迭代信息会存在这个列表中
    :return: call_back函数对象
    """
    # 定义result函数
    def result(xk, state=None):
        if retall:
            global func, sr1_losses # 对于SR1而言,需要声明全局变量来返回call_back对象
        loss = np.abs(func(target_point) - func(xk))
        if loss < ftol:
            return True
        else:
            if retall: # 如果是SR1算法,则返回一个布尔值
                sr1_losses.append(loss)
            return False
    return result # 如果不是SR1算法,则返回一个call_back对象

为了方便可视化,我们将数据可视化的逻辑封装到一个函数中:

# 绘制下降曲线
def plotDownCurve(dpi, losses, labels, xlabel=None, ylabel=None, title=None, grid=True):
    plt.figure(dpi=dpi)
    for loss, label in zip(losses, labels):
        plt.plot(loss, label=label)
    plt.xlabel(xlabel, fontsize=12)
    plt.ylabel(ylabel, fontsize=12)
    plt.title(title, fontsize=18)
    plt.yscale("log")
    plt.grid(grid)
    plt.legend()

接着我们定义一下迭代初值、最优点和终止条件的阈值 ϵ \epsilon ϵ ( ∣ f ( x k + 1 ) − f ( x k ) ∣ < ϵ |f(x_{k+1})-f(x_k)|<\epsilon f(xk+1)f(xk)<ϵ 时,迭代停止) 并获取三个拟牛顿法需要的 call_back函数。

x_0 = np.array([2,0,3,4])   # 迭代初值
target_point = np.array([1,1,1,1], dtype="float32")     # 最优点
FTOL = 1e-8     # 终止阈值
​
sr1_callback = getCallback(func, target_point, ftol=FTOL, retall=True)
dfp_callback = getCallback(func, target_point, ftol=FTOL, retall=False)
bfgs_callback = getCallback(func, target_point, ftol=FTOL, retall=False)

下面使用minimum,fmin_powell,fmin_bfgs来实现三种拟牛顿法的迭代,并把DFP和BFGS的retall存入列表中。

# retall 是迭代点列,minimum是最终迭代点
minimum = minimize(fun=f(4), x0=x_0,        # 通过minimize函数执行SR1,根据内嵌的callback填充loss,并返回OptimizerResult对象
                   method="trust-constr",
                   hess=SR1(),
                   callback=sr1_callback)
​
dfp_minimum, dfp_retall = fmin_powell(func=func, x0=x_0, 
                                      retall=True,
                                      disp=False,
                                      callback=dfp_callback)
dfp_losses = getLosses(dfp_retall, target_point, func=func)
​
bfgs_minimum, bfgs_retall = fmin_bfgs(f=func, x0=x_0,
                                      retall=True,
                                      disp=False,
                                      callback=bfgs_callback)
bfgs_losses = getLosses(bfgs_retall, target_point, func=func)

我们可以调整plt画布的分辨率,设置一下各个轴的名称,然后将它可视化出来:

plotDownCurve(dpi=150,  
              losses=[sr1_losses, dfp_losses, bfgs_losses],
              labels=["SR1", "DFP", "BFGS"],
              xlabel="#iter",   
              ylabel="value of $|f(x) - f(x^*)|$",
              title="losses curve of SR1, DFP and BFGS")
plt.show()  

运行结果:

在这里插入图片描述
我们还可以查看三种方法得到的最优点和它们具体的迭代次数:

print(f"SR1\t最终迭代点:{minimum.x.tolist()}, 共经历{minimum.cg_niter}次迭代")
print(f"DFP\t最终迭代点:{dfp_minimum}, 共经历{len(dfp_losses)}次迭代")
print(f"BFGS\t最终迭代点:{bfgs_minimum}, 共经历{len(bfgs_losses)}次迭代")

运行结果:

SR1	最终迭代点:[1.0000311207482149, 1.0000594706577797, 0.999965823924486, 0.999928146607472], 共经历418次迭代
DFP	最终迭代点:[1. 1. 1. 1.], 共经历53次迭代
BFGS	最终迭代点:[0.99999614 0.99999229 0.99999844 0.99999693], 共经历60次迭代

BB方法

在拟 Newton 法中,我们寻找对称矩阵 B k + 1 B_{k+1} Bk+1 使得 B k + 1 s k = y k . B_{k+1}s_k=y_k. Bk+1sk=yk. Barzilai 和 Borwein 提出:取 B k + 1 = α − 1 I B_{k+1}=\alpha^{-1}I Bk+1=α1I.然而,这样的选取一般不能满足 B k + 1 s k = y k B_{k+1}s_k=y_k Bk+1sk=yk.因此,BB 方法将该等式条件改为

α k + 1 : = argmin ⁡ α > 0 ∥ α − 1 s k − y k ∥ 2 . \alpha_{k+1}:=\underset{\alpha>0}{\operatorname*{argmin}}\|\alpha^{-1}s_k-y_k\|_2. αk+1:=α>0argminα1skyk2.解之得 α k + 1 = s k T s k / ( s k T y k ) \alpha_{k+1}=s_k^Ts_k/(s_k^Ty_k) αk+1=skTsk/(skTyk).类似于拟 Newton 法使用 d k + 1 = − B k + 1 − 1 ∇ f ( x k + 1 ) d_{k+1}=-B_{k+1}^{-1}\nabla f(x_{k+1}) dk+1=Bk+11f(xk+1) 为搜索方向,BB 算法采用

d k + 1 : = ( α k + 1 − 1 I ) − 1 ∇ f ( x k + 1 ) = α k + 1 ∇ f ( x k + 1 ) . d_{k+1}:=(\alpha_{k+1}^{-1}I)^{-1}\nabla f(x_{k+1})=\alpha_{k+1}\nabla f(x_{k+1}). dk+1:=(αk+11I)1f(xk+1)=αk+1f(xk+1).

所以,BB 算法的搜索方向仍是负梯度方向. 由于上面已经考虑了步长,所以 BB 算法不再搜索步长. 这样我们得到如下的迭代公式 x k + 1 = x k − α k ∇ f ( x k ) , α k = s k − 1 T s k − 1 s k − 1 T y k − 1 x_{k+1}=x_k-\alpha_k\nabla f(x_k),\quad\alpha_k=\frac{s_{k-1}^Ts_{k-1}}{s_{k-1}^Ty_{k-1}} xk+1=xkαkf(xk),αk=sk1Tyk1sk1Tsk1类似地,我们将条件 H k + 1 y k = s k H_{k+1}y_k=s_k Hk+1yk=sk 替换成

α k + 1 : = a r g m i n α > 0 ∥ α y k − s k ∥ 2 . \alpha_{k+1}:=\mathop{\mathrm{argmin}}_{\alpha>0}\|\alpha y_k-s_k\|_2. αk+1:=argminα>0αyksk2.

解之得 α k + 1 = s k T y k / ( y k T y k ) \alpha_{k+1}=s_k^Ty_k/(y_k^Ty_k) αk+1=skTyk/(ykTyk). 从而得到如下迭代公式

x k + 1 = x k − α k ∇ f ( x k ) , α k = s k − 1 T y k − 1 y k − 1 T y k − 1 . x_{k+1}=x_k-\alpha_k\nabla f(x_k),\quad\alpha_k=\frac{s_{k-1}^Ty_{k-1}}{y_{k-1}^Ty_{k-1}}. xk+1=xkαkf(xk),αk=yk1Tyk1sk1Tyk1.公式 x k + 1 = x k − α k ∇ f ( x k ) , α k = s k − 1 T s k − 1 s k − 1 T y k − 1 x_{k+1}=x_k-\alpha_k\nabla f(x_k),\quad\alpha_k=\frac{s_{k-1}^Ts_{k-1}}{s_{k-1}^Ty_{k-1}} xk+1=xkαkf(xk),αk=sk1Tyk1sk1Tsk1 x k + 1 = x k − α k ∇ f ( x k ) , α k = s k − 1 T y k − 1 y k − 1 T y k − 1 x_{k+1}=x_k-\alpha_k\nabla f(x_k),\quad\alpha_k=\frac{s_{k-1}^Ty_{k-1}}{y_{k-1}^Ty_{k-1}} xk+1=xkαkf(xk),αk=yk1Tyk1sk1Tyk1 分别称为 BB1 公式和 BB2 公式,为区别起见,分别将它们对应的步长 α k \alpha_k αk 记为 α k B B 1 \alpha_k^\mathrm{BB1} αkBB1 α k B B 2 \alpha_k^\mathrm{BB2} αkBB2,即 α k B B 1 = s k − 1 T s k − 1 s k − 1 T y k − 1 , α k B B 2 = s k − 1 T y k − 1 y k − 1 T y k − 1 . \alpha_{k}^{\mathrm{BB}1}=\frac{s_{k-1}^{T}s_{k-1}}{s_{k-1}^{T}y_{k-1}},\quad\alpha_{k}^{\mathrm{BB}2}=\frac{s_{k-1}^{T}y_{k-1}}{y_{k-1}^{T}y_{k-1}}. αkBB1=sk1Tyk1sk1Tsk1,αkBB2=yk1Tyk1sk1Tyk1.特别若目标函数为 f ( x ) = 1 2 x T A x + b T x f(x)=\frac12x^TAx+b^Tx f(x)=21xTAx+bTx, 其中 A A A 为对称正定矩阵, b ∈ R n b\in\mathbb{R}^n bRn, 计算可得
s k − 1 = − α k − 1 ∇ f ( x k − 1 ) , y k − 1 = A s k − 1 = − α k − 1 A ∇ f ( x k − 1 ) s_{k-1}=-\alpha_{k-1}\nabla f(x_{k-1}),\quad y_{k-1}=As_{k-1}=-\alpha_{k-1}A\nabla f(x_{k-1}) sk1=αk1f(xk1),yk1=Ask1=αk1Af(xk1)从而
α k BB 1 = ∇ f ( x k − 1 ) T ∇ f ( x k − 1 ) ∇ f ( x k − 1 ) T A ∇ f ( x k − 1 ) , α k BB 2 = ∇ f ( x k − 1 ) T A ∇ f ( x k − 1 ) ∇ f ( x k − 1 ) T A 2 ∇ f ( x k − 1 ) , \alpha_{k}^{\text{BB}1}=\frac{\nabla f(x_{k-1})^T\nabla f(x_{k-1})}{\nabla f(x_{k-1})^TA\nabla f(x_{k-1})},\quad\alpha_{k}^{\text{BB}2}=\frac{\nabla f(x_{k-1})^TA\nabla f(x_{k-1})}{\nabla f(x_{k-1})^TA^2\nabla f(x_{k-1})}, αkBB1=f(xk1)TAf(xk1)f(xk1)Tf(xk1),αkBB2=f(xk1)TA2f(xk1)f(xk1)TAf(xk1),易见,此时有 α k B B 1 = α k S D ,   α k B B 2 = α k M D \alpha_k^\mathrm{BB1}=\alpha_k^\mathrm{SD},\:\alpha_k^\mathrm{BB2}=\alpha_k^\mathrm{MD} αkBB1=αkSD,αkBB2=αkMD, 其中, α k S D \alpha_k^\mathrm{SD} αkSD 表示最速下降法之精确搜索的步长 α k M D \alpha_k^\mathrm{MD} αkMD 称为最小梯度法的步长,因为它满足
α k M D = argmin ⁡ α > 0 ∥ ∇ f ( x k − α ∇ f ( x k ) ) ∥ 2 = ∇ f ( x k ) T A ∇ f ( x k ) ∇ f ( x k ) T A 2 ∇ f ( x k ) . \alpha_k^{\mathrm{MD}}=\underset{\alpha>0}{\operatorname*{argmin}}\|\nabla f(x_k-\alpha\nabla f(x_k))\|_2=\frac{\nabla f(x_k)^TA\nabla f(x_k)}{\nabla f(x_k)^TA^2\nabla f(x_k)}. αkMD=α>0argmin∥∇f(xkαf(xk))2=f(xk)TA2f(xk)f(xk)TAf(xk).

上面这些证明我就贴在这水个字数,我是看不懂的- -

Reference

本笔记的代码部分来源于下篇文章:
最优化方法复习笔记(四)拟牛顿法与SR1,DFP,BFGS三种拟牛顿算法的推导与代码实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++之多层 if-else-if 结构优化(三)

C之多层 if-else-if 结构优化(二)-CSDN博客 接上面的内容继续讲解多层 if-else-if结构优化 8、利用规则执行器来进行优化 8.1 业务场景介绍 if (未注册用户){return false; }if (是否国外用户) {return false; }if (刷单用户) {return false; }if (未付费用户 && 不…

中国肺癌情形

写在前面 再看下中国肺癌的情形 综述 文章名期刊影响因子Non-small cell lung cancer in ChinaCancer Commun16.2 摘要 风险因子&#xff1a;吸烟史、家族史、放射暴露、空气污染、慢性肺病 晚期PD-1/PD-L1抑制剂单药使用或联合化疗药物作为标准治疗。局部肺癌晚期&#xf…

铁山靠之——HarmonyOS基础 - 1.0

HarmonyOS学习第一章 一、HarmonyOS简介1.1 安装和使用DevEco Studio1.2 环境配置1.3 项目创建1.4 运行程序1.5 基本工程目录1.5.1 工程级目录1.5.2 模块级目录1.5.3 app.json51.5.4 module.json51.5.5 main_pages.json 二、TypeScript快速入门2.1 简介2.2 基础类型2.2.1 布尔值…

Python 爬虫之下载视频(三)

批量下载某B主视频 文章目录 批量下载某B主视频前言一、基本思路二、确定遍历循环结构三、基本思路中第12步三、基本思路中第345步总结 前言 上一篇讲了如何去获取标题和视频链接。这篇就跟大家讲一下如何去下载这些视频。本篇会以标题和 视频链接 为突破口&#xff0c;来寻找…

day09

文章目录 一、jQuery简介1. 介绍2. 使用1&#xff09;引入2&#xff09;工厂函数 - $()3&#xff09;原生JS对象与jQuery对象4&#xff09;jQuery获取元素5&#xff09;操作元素内容6&#xff09;操作标签属性7&#xff09;操作标签样式8&#xff09;根据层级结构获取元素9&…

Cisco 将收购 Cilium 母公司 Isovalent,预计 2024 年第 3 季度完成

本文地址&#xff1a;Cisco 将收购 Cilium 母公司 Isovalent&#xff0c;预计 2024 年第 3 季度完成 | 深入浅出 eBPF 2023 年 12 月 21 日&#xff0c;Isovalent 公司 CTO & 联合创始人 Thomas Graf 和 Cisco 安全业务集团高级副总裁兼总经理 Tom Gillis 分别在各自公司网…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

解决Unity物体速度过快无法进行碰撞检测&#xff08;碰撞检测穿透&#xff09; 一、解决碰撞检测穿透方法一Collision Detection碰撞检测总结&#xff1a; 二、解决碰撞检测穿透方法二 一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbod…

LuaTable转C#的列表List和字典Dictionary

LuaTable转C#的列表List和字典Dictionaty 介绍lua中创建表测试lua中list表表转成List表转成Dictionary 键值对表表转成Dictionary 多类型键值对表表转成Dictionary 总结 介绍 之前基本都是从C#中的List或者Dictionary转成luaTable&#xff0c;很少会把LuaTable转成C#的List或者…

.net core webapi 大文件上传到wwwroot文件夹

1.配置staticfiles(program文件中) app.UseStaticFiles();2.在wwwroot下创建upload文件夹 3.返回结果封装 namespace webapi;/// <summary> /// 统一数据响应格式 /// </summary> public class Results<T> {/// <summary>/// 自定义的响应码&#xff…

基于Flask、MySQL和Echarts的*市CPI和物价水平数据可视化分析

基于Flask、MySQL和Echarts的*市CPI和物价水平数据可视化分析 引言&#xff1a; 在当前社会经济背景下&#xff0c;CPI&#xff08;居民消费价格指数&#xff09;和物价水平的波动对市场和居民生活产生直接影响。本文将介绍一款基于Flask、MySQL和Echarts的数据可视化系统&…

Nature 新研究发布,GPT 驱动的机器人化学家能够自行设计和进行实验,这对科研意味着什么?

文章目录 前言揭秘Coscientist不到四分钟&#xff0c;设计并改进了程序能力越大&#xff0c;责任越大 前言 有消息称&#xff0c;AI 大模型 “化学家” 登 Nature 能够自制阿司匹林、对乙酰氨基酚、布洛芬&#xff0c;甚至连复杂的钯催化交叉偶联反应&#xff0c;也能完成。 …

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV 2023/12/22 7:54 简略步骤&#xff1a;rootrootrootroot-X99-Turbo:~/3TB$ cat Android11.0.tar.bz2.a* > Android11.0.tar.bz2 rootrootrootroot-X99-Turbo:~/3TB$ tar jxvf Android11.0.tar.…

『OPEN3D』1.1 点云处理

目录 1.open3d中的点云IO 2.点云的可视化 3 点云voxel下采样 4. 顶点法线估计 5.最小外界矩 6. 凸包计算 7. 点云距离计算 8. DBSCAN clustering聚类 9. RANSAC(Random Sample Consensus) 10. 点云平面分割 11. 隐藏点移除 12.outliers移除 13 最远点采样&#xf…

安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库&#xff0c;是许多网站、应用和商业产品的主要数据存储。在生产环境&#xff0c;线上数据库常常面临着持续的、不断变化的表结构修改&#xff08;DDL&#xff09;&#xff0c;如增加、更改、删除字段和索引等等。其中一些DDL操作在M…

Vue3中的混入(mixins)

本文主要介绍Vue3中的混入&#xff08;mixins&#xff09;。 目录 一、在普通写法中使用混入&#xff1a;二、在setup写法中使用混入&#xff1a; 混入是Vue中一种用于在组件中共享可复用功能的特性。在Vue 3中&#xff0c;混入的使用方式有所改变。 一、在普通写法中使用混入…

MongoDB安装部署

二、安装部署 2.1 下载 下载地址&#xff1a;MongoDB Enterprise Server Download | MongoDB 当前最新版本6.0.9&#xff0c;5.0.9对Mac m1需要centos 8.2版本。选择docker安装。 2.2 docker-ce安装 # 安装docker # 默认repo源没有docker-ce安装包&#xff0c;需要新的rep…

Station_Map1221Update

1221 Polish 1. Transfer the road coordinates from the UE coordinates system into the CAD coordinates system by using the functions in the file INDEX2UE.py Report Changes in the function initialMatrix # 初始化标签self.outdoor_label[self.wall_matrix 1] …

如何使用树莓派Bookworm系统中配置网络的新方法NetworkManager

树莓派在 10 月新出的 Bookworm 版本系统中&#xff0c;将使用多年的 dhcpcd 换成了 NetworkManager&#xff08;以前是在rasp-config中可选&#xff09;&#xff0c;这是因为 Raspberry Pi OS 使用的是 Debian 内核&#xff08;和 Ubuntu 一样&#xff09;&#xff0c;所以树莓…

前端常用的开发工具

前端常用的开发工具&#x1f516; 文章目录 前端常用的开发工具&#x1f516;1. Snipaste--截图工具2. ScreenToGif--gif图片录制3. Typora--Markdown编辑器4. notepad--文本代码编辑器5. uTools--多功能工具6. EV录屏--录屏软件7. Xmind--思维导图8. Apifox -- 接口调试9. Tor…

Keil中文报错提示为: [-Winvalid-source-encoding]问题解决

错误提示&#xff1a; ../User/main.c(67): warning: illegal character encoding in string literal [-Winvalid-source-encoding]67 | printf("全<B2><BF><B4><AB><CA><E4><CD><EA><B3><C9…
最新文章