牛顿法,高斯牛顿法,列文伯格-马夸尔特(LM)法

news/2024/4/26 6:00:44/文章来源:https://blog.csdn.net/weixin_43763292/article/details/128060801

文章目录

    • 一:牛顿法 (Newton's method)
      • 1:概述
      • 2:牛顿方向与牛顿法
      • 3:牛顿法的基本步骤
      • 4:举例
    • 二:高斯牛顿法 (Gauss–Newton algorithm)
      • 1:概述
      • 2:高斯牛顿法推导
      • 3:高斯牛顿法算法流程
      • 4:高斯牛顿法 C++ 代码
    • 三:列文伯格-马夸尔特法(Levenberg-Marquardt algorithm)
      • 1:概述
      • 2:LM算法流程
      • 3:列文伯格-马夸尔特法 C++ 代码
    • 四:总结


个人笔记:
牛顿(Newton) 法、高斯牛顿(GaussNewton)法、Levenberg-Marquardt(LM)算法等。结合自己需要实现功能的目的,下面主要给出推导结果、代码实现和实际一些应用。推导过程最后会放一些个人参考的一些文章和资料。

一:牛顿法 (Newton’s method)

1:概述

牛顿法是一种函数逼近法,它的基本思想是:在极小点附近用x(k)x^{(k)}x(k)点的二阶泰勒多项式来近似目标函数f(x)f(x)f(x),并用选代点x(k)x^{(k)}x(k)处指向近似二次函数的极小点方向作为搜索方向p(k)p^{(k)}p(k)
设规划问题 :minf(x),x∈Rnmin f(x),x∈R^nminf(x),xRn
其中f(x)f(x)f(x)在点x(k)x^{(k)}x(k)处具有二阶连续偏导数,黑森矩阵▽2f(x(k))▽^2f(x^{(k)})2f(x(k))正定。
现已有f(x)f(x)f(x)极小点的第kkk级估计值x(k)x^{(k)}x(k),并将f(x)f(x)f(x)作二阶泰勒展开:
在这里插入图片描述其中主要的是前三项,最后一项为高阶无穷小。

2:牛顿方向与牛顿法

记上式中的主要部分为:
在这里插入图片描述

x(k)x^{(k)}x(k)附近可用Q(x)Q(x)Q(x)来近似f(x)f(x)f(x), Q(x)≈f(x)Q(x) ≈ f(x)Q(x)f(x)
故可以用Q(x)Q(x)Q(x)的极小点来近似f(x)f(x)f(x)的极小点,求Q(x)Q(x)Q(x)的驻点:
在这里插入图片描述

由梯度▽Q(x)=0▽Q(x) = 0Q(x)=0Q(x)Q(x)Q(x)的平稳点x(k+1)x^{(k+1)}x(k+1)p(k)p^{(k)}p(k)是牛顿方向,步长为111

在这里插入图片描述
也就是下面描述,其中HHH是黑塞矩阵
在这里插入图片描述

3:牛顿法的基本步骤

1:选取初始数据:初始点x(0)x^{(0)}x(0),终止条件ε>0ε>0ε>0,令k:=0k:=0k:=0
2:求梯度向量▽f(k)▽f^{(k)}f(k),并计算∣∣▽f(k)∣∣||▽f^{(k)}||f(k):

∣∣▽f(k)∣∣<ε||▽f^{(k)}||<εf(k)<ε,停止选代,输出x(k)x^{(k)}x(k),否则转下一步。

3:构造牛顿方向:
在这里插入图片描述
4:算法迭代:

计算x(k+1)=x(k)+p(k)x^{(k+1)} = x^{(k)} + p^{(k)}x(k+1)=x(k)+p(k),以x(k+1)x^{(k+1)}x(k+1)作为下一轮迭代点,令k:=k+1k := k+1k:=k+1,转第2步。

4:举例

试用牛顿法求函数f(x)=x12+25x22f(x) = x_1^2 + 25x_2^2f(x)=x12+25x22 的极小点,其中初始点为x(0)=(2,2)Tx^{(0)} = (2, 2)^Tx(0)=(2,2)T, ε=10−6ε = 10^{-6}ε=106.
解(1)求梯度和黑塞矩阵:
在这里插入图片描述

(2)确定牛顿方向:
在这里插入图片描述即:x1=0,x2=0x_1 = 0,x_2=0x1=0x2=0

这里使用三维坐标系来查看x1=0,x2=0x_1 = 0,x_2=0x1=0x2=0存在极值
在这里插入图片描述

二:高斯牛顿法 (Gauss–Newton algorithm)

1:概述

高斯-牛顿算法用于求解非线性最小二乘问题,相当于最小化函数值的平方和。它是牛顿求非线性函数最小值方法的扩展。由于平方和必须是非负的,因此该算法可以看作是使用牛顿法迭代地逼近和的零点,从而使和最小化。它的优点是不需要计算可能具有挑战性的二阶导数(也就是黑塞矩阵)。
这里说一下,牛顿法使用黑塞矩阵有个缺点:计算量特别大。高斯牛顿法是在牛顿法的基础上用雅可比矩阵代替了黑森矩阵。

注意:高斯牛顿法针对非线性最小二乘问题。最小二乘详解

2:高斯牛顿法推导

①:目标函数问题:自变量xxx 经过模型函数得出因变量yyymmm个观测点:
X=[x1,x2,...xm]TX=[x_1,x_2,...x_m]^TX=[x1,x2,...xm]TY=[y1,y2,...ym]TY=[y_1,y_2,...y_m]^TY=[y1,y2,...ym]T
②:模型函数:Y=f(X;β1,β2,...,βn)Y = f(X;β_1,β_2,...,β_n)Y=f(X;β1,β2,...,βn) => f(x;β)f(x;β)f(x;β)

其中 xxx 是自变量 ,yyy 是因变量,βββ 是目标参数。x和yx和yxy是已知的,优化 βββ 目标参数。

③:优化目标函数:minS=∑i=1n(f(xi;β)−yi)2min S = \displaystyle\sum_{i=1}^{n}(f(x_i;β)-y_i)^2minS=i=1n(f(xi;β)yi)2
④:第 iii 次观测点的预测偏差:ri=f(xi;β)−yi)2r_i = f(x_i;β)-y_i)^2ri=f(xi;β)yi)2,那么每次的偏差组成一个向量形式:R=[r1,r2,...rm]TR = [r_1,r_2,...r_m]^TR=[r1,r2,...rm]T
⑤:对于③目标函数 可以写成:minS=∑i=1nri2=RTRmin S = \displaystyle\sum_{i=1}^{n}r_i^2 = R^TRminS=i=1nri2=RTR
⑥:那么目标函数梯度:▽S(β)=[∂S∂β1,∂S∂β2,...,∂S∂βn]T▽S(β) = [\frac{\partial S}{\partial β_1},\frac{\partial S}{\partial β_2},...,\frac{\partial S}{\partial β_n}]^TS(β)=[β1S,β2S,...,βnS]T,其中对每个参数 βjβ_jβj 求偏导∂S∂βj=2∑i=1mri∂ri∂βj\frac{\partial S}{\partial β_j} = 2 \displaystyle\sum_{i=1}^{m}r_i\frac{\partial r_i}{\partial β_j}βjS=2i=1mriβjri

⑦:对于R=[r1,r2,...rm]T和βR = [r_1,r_2,...r_m]^T和βR=[r1,r2,...rm]Tβ的偏导形式就可以写成 雅可比矩阵

J(R(β))=[∂r1∂β1...∂r1∂βn⋮⋱⋮∂rm∂β1...∂rm∂βn]J(R(β)) = \begin{bmatrix} \frac{\partial r_1}{\partial β_1}&...&\frac{\partial r_1}{\partial β_n}\\ \vdots & \ddots & \vdots \\ \frac{\partial r_m}{\partial β_1}&...&\frac{\partial r_m}{\partial β_n}\end{bmatrix}J(R(β))=β1r1β1rm......βnr1βnrm

⑧:目标函数梯度(一阶偏导):▽S(β)=[∂S∂β1,∂S∂β2,...,∂S∂βn]T=>∂S∂βj=2∑i=1mri∂ri∂βj=>▽S=2JTR▽S(β) = [\frac{\partial S}{\partial β_1},\frac{\partial S}{\partial β_2},...,\frac{\partial S}{\partial β_n}]^T => \frac{\partial S}{\partial β_j} = 2 \displaystyle\sum_{i=1}^{m}r_i\frac{\partial r_i}{\partial β_j} => ▽S = 2J^TRS(β)=[β1S,β2S,...,βnS]T=>βjS=2i=1mriβjri=>S=2JTR
⑨:求目标函数黑塞矩阵(二阶偏导):
由梯度向量元素 ∂S∂βj=2∑i=1mri∂ri∂βj\frac{\partial S}{\partial β_j} = 2 \displaystyle\sum_{i=1}^{m}r_i\frac{\partial r_i}{\partial β_j}βjS=2i=1mriβjri 到黑塞矩阵元素∂2S∂βk∂βj=2∂∂βk(∑i=1mri∂ri∂βj)\frac{\partial ^2S}{\partial β_k\partial β_j} = 2\frac{\partial }{\partial β_k} (\displaystyle\sum_{i=1}^{m}r_i\frac{\partial r_i}{\partial β_j})βkβj2S=2βk(i=1mriβjri)
应用链式法则得:∂2S∂βk∂βj=2∑i=1m(∂ri∂βk∂ri∂βj+ri∂2ri∂βk∂βj)\frac{\partial ^2S}{\partial β_k\partial β_j} = 2 \displaystyle\sum_{i=1}^{m}(\frac{\partial r_i}{\partial β_k}\frac{\partial r_i}{\partial β_j} + r_i\frac{\partial^2 r_i}{\partial β_k\partial β_j})βkβj2S=2i=1m(βkriβjri+riβkβj2ri)
其中OOO矩阵元素 :Okj=∑i=1mri∂2ri∂βk∂βjO_{kj} = \displaystyle\sum_{i=1}^{m}r_i\frac{\partial^2 r_i}{\partial β_k\partial β_j}Okj=i=1mriβkβj2ri
黑塞矩阵:H=2(JTJ+O)H = 2(J^TJ + O)H=2(JTJ+O)
⑩:写成牛顿法形式:如果模型比较好,其中OOO矩阵rir_iri是趋近于0的。这里就把OOO矩阵忽略掉,方便计算。
在这里插入图片描述

3:高斯牛顿法算法流程

1:给定初始参数值 β0β_0β0 (默认是为 111 的向量)。设ε=1−10ε = 1^{-10}ε=110
2:对于第 kkk 次选代,求出当前的雅可比矩阵 J(βk)J(β_k)J(βk) 和残差值 f(βk)f(β_k)f(βk)也就是RRR
3:求解增量方程: HΔβk=−gH\Delta β_k = -gHΔβk=g
=> Δβk=−H−1g\Delta β_k= -H^{-1}gΔβk=H1g
=> Δβk≈−(JTJ)−1JTR\Delta β_k≈ -(J^TJ)^{-1}J^TRΔβk(JTJ)1JTR 。这里用雅可比矩阵 JTJJ^TJJTJ 近似黑塞矩阵HHH
4:若 Δβk<ε\Delta β_k<εΔβk<ε ,则停止。否则,令βk+1=βk+Δβkβ_{k+1} = β_k +\Delta β_kβk+1=βk+Δβk,返回第2步。

4:高斯牛顿法 C++ 代码

    //求雅克比矩阵template <class FunctionPredictedValue>MatrixXd Jacobi(const VectorXd& inVectorValue, const VectorXd& params,FunctionPredictedValue funPV){int rowNum = inVectorValue.rows();int colNum = params.rows();MatrixXd Jac(rowNum, colNum);for (int i = 0; i < rowNum; i++){for (int j = 0; j < colNum; j++){Jac(i, j) = Deriv(inVectorValue, i, params, j,funPV);}}return Jac;}//残差值向量template <class FunctionPredictedValue>ArrayXd ResidualsVector(const VectorXd& inVectorValue, const VectorXd& outVectorValue,const VectorXd& params,FunctionPredictedValue funPV){int dataCount = inVectorValue.rows();//保存残差值ArrayXd residual(dataCount);//获取预测偏差值 r= ^y(预测值) - y(实际值)for(int i=0;i<dataCount;++i){//获取预测值double predictedValue = funPV(inVectorValue(i),params);residual(i) = predictedValue - outVectorValue(i);}return residual;}//求导template <class FunctionPredictedValue>double Deriv(const VectorXd& inVectorValue, int objIndex, const VectorXd& params,int paraIndex,FunctionPredictedValue funPV){VectorXd para1 = params;VectorXd para2 = params;para1(paraIndex) -= DERIV_STEP;para2(paraIndex) += DERIV_STEP;double obj1 = funPV(inVectorValue(objIndex), para1);double obj2 = funPV(inVectorValue(objIndex), para2);return (obj2 - obj1) / (2 * DERIV_STEP);}/* 高斯牛顿法(GNA) 解决非线性最小二乘问题 确定目标函数和约束来对现有的参数优化*/template <class FunctionPredictedValue>ArrayXd GaussNewtonAlgorithm(const ArrayXd & inVectorValue,const ArrayXd & outVectorValue,ArrayXd params,FunctionPredictedValue funPV,int maxIteCount = 1,double epsilon = 1e-10){int k=0;//数据个数int dataCount = inVectorValue.size();// ε 终止条件//double epsilon = 1e-10;//残差值ArrayXd residual(dataCount);//found 为true 结束循环bool found = false;while(!found && k<maxIteCount){//迭代增加k++;//获取预测偏差值 r= ^y(预测值) - y(实际值)residual = ResidualsVector( inVectorValue, outVectorValue,params, funPV);//求雅克比矩阵MatrixXd Jac = Jacobi(inVectorValue,params,funPV);// Δx = - (Jac^T * Jac)^-1 * Jac^T * rArrayXd delta_x =  -  (((Jac .transpose() * Jac ).inverse()) * Jac.transpose() * residual.matrix()).array();qDebug()<<QString("高斯牛顿法:第 %1 次迭代 --- 精度:%2  ").arg(k).arg(delta_x.abs().sum());//达到精度,结束if(delta_x.abs().sum() < epsilon){found = true;}//x(k+1) = x(k) + Δxparams = params + delta_x;}return params;}

Matrix是Eigen库中的一个矩阵类,这里引入Eigen库方便代数运算。

三:列文伯格-马夸尔特法(Levenberg-Marquardt algorithm)

1:概述

在数学和计算中,Levenberg–Marquardt 算法(LMA或简称LM),也称为 阻尼最小二乘法( DLS ),用于解决非线性最小二乘法问题。这些最小化问题尤其出现在最小二乘 曲线拟合中。LMA 在高斯-牛顿算法(GNA) 和梯度下降法之间进行插值。LMA 更稳健比 GNA,这意味着在许多情况下,即使它开始时离最终最小值很远,它也能找到解决方案。对于性能良好的函数和合理的启动参数,LMA 往往比 GNA 慢。LMA 也可以被视为使用信赖域方法的高斯-牛顿。
LMA 在许多软件应用程序中用于解决一般曲线拟合问题。通过使用高斯-牛顿算法,它通常比一阶方法收敛得更快。然而,与其他迭代优化算法一样,LMA 只能找到局部最小值,不一定是全局最小值。与其他数值最小化算法一样,Levenberg–Marquardt 算法是一个迭代过程。要开始最小化,用户必须提供参数向量的初始猜测 βββ, 在只有一个最小值的情况下,一个不知情的标准猜测就像β=[1,1,...,1]Tβ = [1,1,...,1]^Tβ=[1,1,...,1]T会工作得很好;在有多个最小值的情况下,只有当初始猜测已经有点接近最终解决方案时,算法才会收敛到全局最小值。

2:LM算法流程

1:给定初始参数值 β0β_0β0 (默认是为 111 的向量)。初始μ0μ_0μ0的选择可以依赖于H0=J(β0)TJ(β0)H_0=J(β_0)^TJ(β_0)H0=J(β0)TJ(β0) 中的元素,一般我们选择 μ0=τ∗maxi{Hii(0)}μ_0 =τ*max_i\{H_{ii}^{(0)}\}μ0=τmaxi{Hii(0)},一般τ=10−6τ=10^{−6}τ=106,这里设置ε1=1−10ε_1 = 1^{-10}ε1=110ε2=1−10ε_2 = 1^{-10}ε2=110
2:若∣∣g∣∣∞≤ε1||g||_\infty≤ε_1gε1 成立,则停止。
3:对于第 kkk 次选代,求出当前的雅可比矩阵 J(βk)J(β_k)J(βk) 和残差值 f(βk)f(β_k)f(βk)也就是RRR
4:求解增量方程: (H+μkI)Δβk=−g(H+μ_kI)\Delta β_k = -g(H+μkI)Δβk=g
=> Δβk=−(H+μkI)−1g\Delta β_k= -(H+μ_kI)^{-1}gΔβk=(H+μkI)1g
=> Δβk≈−(JTJ+μkI)−1JTR\Delta β_k≈ -(J^TJ+μ_kI)^{-1}J^TRΔβk(JTJ+μkI)1JTR 。这里用雅可比矩阵 JTJJ^TJJTJ 近似黑塞矩阵HHH
5:若 ∣∣Δβk∣∣≤ε2(∣∣βk∣∣+ε2)||\Delta β_k||≤ε_2(||β_k|| + ε_2)Δβkε2(βk+ε2) 成立,则停止。否则,令βk+1=βk+Δβkβ_{k+1} = β_k +\Delta β_kβk+1=βk+Δβk
6:ρ=∣∣F(βk)∣∣22−∣∣F(βk+Δβk)∣∣22L(0)−L(Δβk)\rho = \frac{||F(β_k)||_2^2-||F(β_k+\Delta β_k)||_2^2}{L(0) - L(\Delta β_k)}ρ=L(0)L(Δβk)F(βk)22F(βk+Δβk)22,如果ρ>0\rho >0ρ>0,求出当前的黑塞矩阵 H≈J(βk)TJ(βk)H ≈ J(β_k)^TJ(β_k)HJ(βk)TJ(βk) 和梯度 g=J(βk)Tf(βk)g = J(β_k)^Tf(β_k)g=J(βk)Tf(βk)。若∣∣g∣∣∞≤ε1||g||_\infty≤ε_1gε1 成立,则停止。更新 μkμ_kμkμk=μk∗max{13,1−(2ρ−1)3};v=2μ_k =μ_k*max\{\frac{1}{3},1-(2\rho-1)^3\};v=2μk=μkmax{31,1(2ρ1)3};v=2。如果ρ≤0\rho ≤0ρ0μk=μk∗v;v=2∗vμ_k =μ_k*v; v=2*vμk=μkv;v=2v

最终伪代码如下:

在这里插入图片描述

3:列文伯格-马夸尔特法 C++ 代码

/* 列文伯格马夸尔特法(LMA) ==  使用信赖域的高斯牛顿法,鲁棒性更好, 确定目标函数和约束来对现有的参数优化*/template <class FunctionPredictedValue>ArrayXd LevenbergMarquardtAlgorithm(const ArrayXd &inVectorValue,const ArrayXd & outVectorValue, ArrayXd params,FunctionPredictedValue funPV,int maxIteCount = 1,double epsilon = 1e-10){//数据个数int dataCount = inVectorValue.size();// ε 终止条件//double epsilon = 1e-10;// τdouble tau = 1e-6;//迭代次数int k=0;int v=2;//求雅可比矩阵MatrixXd Jac = Jacobi(inVectorValue,params,funPV);//用雅可比矩阵近似黑森矩阵MatrixXd Hessen = Jac .transpose() * Jac ;//获取预测偏差值 r= ^y(预测值) - y(实际值)//保存残差值ArrayXd residual = ResidualsVector(inVectorValue, outVectorValue,params,funPV);//梯度MatrixXd g = Jac.transpose() * residual.matrix();//found 为true 结束循环bool found = ( g.lpNorm<Eigen::Infinity>() <= epsilon );//阻尼参数μdouble mu =  tau * Hessen.diagonal().maxCoeff();while(!found && k<maxIteCount){k++;//LM方向  uI => I 用黑森矩阵对角线代替//MatrixXd delta_x = - (Hessen + mu*Hessen.asDiagonal().diagonal()).inverse() * g;MatrixXd delta_x = - (Hessen + mu*MatrixXd::Identity(Hessen.cols(), Hessen.cols())).inverse() * g;if( delta_x.lpNorm<2>() <= epsilon * (params.matrix().lpNorm<2>() + epsilon )){qDebug()<<QString("LM:第 %1 次迭代 --- 精度:%2  ").arg(k).arg(delta_x.lpNorm<2>());found = true;}else{MatrixXd newParams = params + delta_x.array();//保存残差值ArrayXd residualOld(dataCount),residualNew(dataCount);//获取预测偏差值 r= ^y(预测值) - y(实际值) 旧值residualOld = ResidualsVector( inVectorValue, outVectorValue,params, funPV);//获取预测偏差值 r= ^y(预测值) - y(实际值) 新值residualNew = ResidualsVector( inVectorValue, outVectorValue,newParams, funPV);//ρ         (-(delta_x.transpose()*g) - 0.5*(delta_x.transpose() * Hessen * delta_x)).sum();double rho = (residualOld.pow(2).sum() - residualNew.pow(2).sum()) / (0.5*delta_x.transpose()*(mu * delta_x - g)).sum()  ;if(rho>0){params = newParams;Jac = Jacobi(inVectorValue,params,funPV);Hessen = Jac.transpose() * Jac ;//获取预测偏差值 r= ^y(预测值) - y(实际值)residual = ResidualsVector( inVectorValue, outVectorValue,params, funPV);g = Jac.transpose() * residual.matrix();found = ( g.lpNorm<Eigen::Infinity>() <= epsilon );qDebug()<<QString("LM:第 %1 次迭代 --- 精度:%2  ").arg(k).arg(g.lpNorm<Eigen::Infinity>());mu = mu* qMax(1/3.0 , 1-qPow(2*rho -1,3));v=2;}else{mu = mu*v;v = 2*v;}}}return params;}//FunctionPredictedValue 是一个自定义函数,可以定义自己的函数 规则
//设置规则,获取预测值 ==》自变量和参数
//曲线拟合函数
class CurveFittingFunction
{
public:double operator()(const double &inValue ,const ArrayXd &params){double value=0;int paramsCount = params.rows();for(int i=0;i<paramsCount;++i){//这里使用曲线方程 y = a1*x^0 + a2*x^1 + a3*x^2 + ...      根据参数(a1,a2,a3,...)个数来设置value += params(i) * qPow(inValue,i);}return value;}
};

四:总结

1:工具:主要Qt + Eigen库 + QCustomPlot类
Eigen库是一个用于矩阵计算,代数计算库
QCustomPlot类是一个用于绘图和数据可视化

2:上面完整代码已上传GitHub

3:参考文献
黑塞矩阵和雅可比矩阵理解
高斯牛顿法详解
LM算法详解
LM论文

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

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

相关文章

Metabase学习教程:仪表盘-5

SQL查询仪表盘添加筛选器 如何将过滤器小部件添加到仪表盘&#xff0c;并将它们连接到多个SQL查询中的字段过滤器变量。 本文介绍如何创建仪表盘小工具到过滤器数据输入SQL查询。图1显示了我们将要构建的仪表盘&#xff1a; 图1。我们将要构建的&#xff1a;一个仪表盘&#…

在el-table表头上引入组件不能实时传参bug

文章目录场景还原解决方法出现原因场景还原 产品要求&#xff1a;点击表格的表头&#xff0c;能触发一个下拉的列表&#xff0c;列表能携带表格的筛选条件&#xff0c;获取相应的数据 写了一个demo&#xff0c;来还原一下bug出现的场景&#xff1a; <div id"demo&qu…

分省/市政府性债务数据财政收支数据财政透明度

&#xff08;1&#xff09;30省地方政府债务面板数据 1、数据来源&#xff1a;自身 2、时间跨度&#xff1a;2012-2018年 3、区域范围&#xff1a;全国30各省&#xff08;西藏除外&#xff09; 4、指标说明&#xff1a; 部分指标如下&#xff1a; 负债率&#xff08;地方…

【性能|优化】TB级flink任务报错分析:Could not compute the container Resource

文章目录一. 问题引入1. 场景描述2. 日志简析二. 初级问题分析与解决1. 问题分析1.1. yarn的调度器设置1.2. 程序设置2. 问题解决三. &#xff08;性能&#xff09;新的问题1. 问题描述2. 理想化的最优方案3. "PlanB"的解决方案四. 反思与迭代一. 问题引入 1. 场景描…

Focal Self-attention for Local-Global Interactions in Vision Transformers

目录 Abstract 1. Introduction 2. MEthod 2.1 Model architecture 2.2 Focal self-attention 2.2.1 Window-wise attention 2.2.2 Complexity analysis 2.3 Model configuration 3. Related work 4. Experiments 4.1 Image classification on ImageNet-1K 4.…

xss-labs/level7

我们如同一下构造那样 <script>alert(xss)</script> 产生以下回显 接着查看源代码 发现第一个输出点被转义了 没有利用价值了 第二个输出点则是可以发现script关键字直接给干没了 氧化钙!!! 似此 如何处之&#xff1f; 我们猜测后台服务器还是对一些特殊字符进…

hiveSql 相互关注问题

hiveSql 相互关注问题说明需求分析优化实现最后说明 普遍社交软件上会有关注功能&#xff0c;如何知道自己的关注是否也是关注了自己呢&#xff1f; 需求 求关注结果数据中&#xff0c;相互关注的用户对。 数据如下&#xff1a; follow表&#xff1b;from_user&#xff1a;关…

人才资源开发杂志人才资源开发杂志社人才资源开发编辑部2022年第21期目录

开卷有益《人才资源开发》投稿&#xff1a;cnqikantg126.com 年轻干部要走好成长成才之路 赖宁; 1 特别关注 迎难而上 勇担重任 推进河南人事考试高质量发展 常万琦; 6-7 工作要闻 第五届中国河南招才引智创新发展大会开幕 归欣 ;张笑闻; 8 河南省12家企业和2个…

Playwright 简明入门教程:录制自动化测试用例,结合 Docker 使用

本篇文章聊聊如何使用 Playwright 进行测试用例的录制生成&#xff0c;以及如何在Docker 容器运行测试用例&#xff0c;或许是网上最简单的入门教程。 写在前面 Playwright 是微软出品的 Web 自动化测试工具和框架&#xff0c;和 Google Puppeteer 有着千丝万缕的关系。前一阵…

电脑密码忘了怎么解除?最简单操作的方法

可能很多人都遇到过这种情况&#xff1a;忘记了电脑密码。电脑密码忘了怎么解除&#xff1f;大多数人都不知道如何解决。下面就为大家分享一下电脑密码忘记怎么解决的方法&#xff0c;方法主要分为两种情况&#xff1a;一种情况是&#xff0c;电脑开机下忘记密码&#xff1b;另…

Cpp知识点系列-类型转换

前言 在做题的时候发现了需要用到类型转换&#xff0c;于是在这里进行了简单的记录。 历史原因&#xff0c;慢慢整理着发现类型转换也能写老大一篇文章了。又花了时间来梳理一下就成了本文了。 cpp 之前使用的环境是DEV-C 5.4&#xff0c;而对应的GCC版本太低了。支持c11需要…

智慧环卫管理系统解决方案(垃圾分类)

1.1 垃圾分类管理子系统 1.1.1 公众参与互动平台 可为客户量身打造微信公众号&#xff0c;搭建互动交流的平台&#xff0c;更好的调动居民参与垃圾分类的热情。 1.1.1.1 分类指导 将目前城市的垃圾处理情况、垃圾分类现状、分类的意义&#xff0c;以数据来说明垃圾分类的…

【设计】OOA、OOD、OOP

这三者都是 OO&#xff08;Object-Oriented&#xff09;领域的思想。 一般我们我们接到产品经理的需求后&#xff0c;开发阶段分这样几个步骤&#xff1a; 可行性预研阶段&#xff0c;此阶段评估需求是否合理&#xff0c;能否实现&#xff1b;OOA阶段&#xff0c;此阶段分析用…

语文课内外杂志语文课内外杂志社语文课内外杂志社2022年第14期目录

幼儿教育《语文课内外》投稿&#xff1a;cn7kantougao163.com 家园协同视域下幼儿心理危机的预防与干预对策 曹锭1-3 幼小衔接阶段幼儿时间观念的培养对策 陈晶晶4-6 有效支持 助力幼儿在书海中徜徉 胡玲珊7-9 东西部幼儿园结对帮扶,助力乡村教育扶贫——以广州市人民政府机关幼…

多线程(2)

文章目录前言 &#xff1a;1.Thread类 &#xff1a;1.1 Thread类常见的构造方法1.2 Thread的几个常见属性1.3 中断一个线程1.4 等待一个线程-join()1.5 获取当前线程引用1.6 休眠当前线程2.线程状态前言 &#xff1a; 简单回顾上文知识点 上文我们了解了 线程是为解决并发编程引…

Java数据审计工具:Envers and JaVers比较

在Java世界中&#xff0c;有两种数据审计工具&#xff1a;Envers和JaVers。 Envers已经存在了很长时间&#xff0c;它被认为是主流。 JaVers提供全新的方法和技术独立性。 如果您考虑哪种工具更适合您的项目&#xff0c;本文是一个很好的起点。 本文分为三个部分。首先&#x…

[附源码]计算机毕业设计springboot餐馆点餐管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【新知实验室-TRTC开发】实时音视频之欢度世界杯

目录 一、什么是TRTC 二、用5分钟跑通一个demo 1、开通腾讯云-TRTC 2、获取demo必须的两把钥匙 2.1输入应用名称 2.2下载对应的源码包&#xff08;手机、web、小程序等&#xff09; 2.3拿到钥匙 2.4完成 三、搭建一起看世界杯应用 1、解压源码&#xff08;耗时30S&#x…

[附源码]计算机毕业设计springboot房屋租赁系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MySQL为自动编号的字段赋值

insert users values(NULL,ming,fasdfasdfasd,22,1); 或者 insert users values(DEFAULT,ming,fasdfasdfasd,22,1);