牛顿法、拟牛顿法、高斯-牛顿法、共轭梯度法推导总结

原文:http://ihoge.cn/2018/newton1.html

前言:

线性最小二乘问题,我们可以通过理论推导可以得到其解析解,但是对于非线性最小二乘问题,则需要依赖迭代优化的方法,牛顿算法是解决非线性最优的常见算法之一。
最近整理了几篇关于牛顿法及其优化算法都不甚满意,网上大多相关技术博客很多是拼凑起来的,多数不全面(某些推导中间过程被省略),或者数学公式的符号表达方式不统一,造成看起来非常凌乱。因此本文旨在对基于牛顿法的非线性最小二乘优化问题的基本概念和算法推导做个系统的梳理。

  • 基本数学名词及概念
  • 海赛矩阵和雅可比矩阵
  • 牛顿算法推导
  • 拟牛顿算法(DFP和BFGS)
  • 高斯牛顿算法
  • 共轭梯度法
  • 补充优化算法

一、基本概念定义

1.非线性方程定义及最优化方法简述

指因变量与自变量之间的关系不是线性的关系,比如平方关系、对数关系、指数关系、三角函数关系等等。对于此类方程,求解n元实函数f在整个n维向量空间Rn上的最优值点往往很难得到精确解,经常需要求近似解问题。

求解该最优化问题的方法大多是逐次一维搜索的迭代算法,基本思想是在一个近似点处选定一个有利于搜索方向,沿这个方向进行一维搜索,得到新的近似点。如此反复迭代,知道满足预定的精度要求为止。根据搜索方向的取法不同,这类迭代算法可分为两类:

  • 解析法 需要用目标函数的倒函数
  • 梯度法 又称最速下降法,是早期的解析法,收敛速度较慢
  • 牛顿法 收敛速度快,但不稳定,计算也较困难。高斯牛顿法基于其改进,但目标作用不同
  • 共轭梯度法 介于最速下降法与牛顿法之间。收敛较快,效果好
  • 变尺度法 效率较高,常用DFP法(Davidon Fletcher Powell)
  • 直接法 不涉及导数,只用到函数值。有交替方向法(又称坐标轮换法)、模式搜索法、旋转方向法、鲍威尔共轭方向法和单纯形加速法等。

2.非线性最小二乘问题

非线性最小二乘问题来自于非线性回归,即通过观察自变量和因变量数据,求非线性目标函数的系数参数,使得函数模型与观测量尽量相似。

高斯牛顿法是解决非线性最小二乘问题的最基本方法,并且它只能处理二次函数。(使用时必须将目标函数转化为二次的)

3.基本数学表达

  1. 梯度(gradient)

    常用 表示,由多元函数的哥哥偏导数组成的问题。以二元函数为例,其梯度为:

  2. 海赛矩阵(Hessian matrix)

    由多元函数的二阶偏导数组成的方阵,描述函数的局部曲率,以二元函数为例:

  3. 雅可比矩阵(Jacobian matrix)

    是多元函数一阶偏导数以一定方式排列成的矩阵,体现了一个可微方程与给出点的最优线性逼近。以二元函数为例:

    如果扩展多维的话F:Rn>RmF:Rn−>Rm,则雅可比矩阵是一个mmn列的矩阵,表示为:JF(x1,x2,...,xn)JF(x1,x2,...,xn)

    雅可比矩阵作用,如果PPRn中的一点,FFP点可微分,那么在这一点的导数由JF(P)JF(P)给出,在此情况下,由F(P)F(P)描述的线性算子即接近点PPF的最优线性逼近,xx逼近于P

黑森和雅可比矩阵参考:http://jacoxu.com/jacobian矩阵和hessian矩阵/

  1. 残差(residual)

    表示实际观测值与估计值(拟合值)之间的差。


二、牛顿法

从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法更快。比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。

从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。如下图是一个最小化一个目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。

1.求解方程

并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。

原理是利用泰勒公式,在x(0)x(0)处展开,且展开到一阶,即f(x)=f(x(0))+(xx(0))f(x(0))f(x)=f(x(0))+(x−x(0))f′(x(0))

求解方程f(x)=0f(x)=0,即f(x(0))+(xx(0))f(x(0))=0f(x(0))+(x−x(0))f′(x(0))=0

求解x=x(1)=x(0)f(x(0))f(x(0))x=x(1)=x(0)−f(x(0))f′(x(0))

因为这是利用泰勒公式的一阶展开,f(x)=f(x(0))+(xx(0))f(x(0))f(x)=f(x(0))+(x−x(0))f′(x(0))此处并非完全相等,而是近似相等。这里求得的x(1)x(1)并不能让f(x)=0f(x)=0,只能说f(x(1))f(x(1))f(x(0))f(x(0))更接近f(x)=0f(x)=0,这样就可以通过不断迭代去逼近f(x)f(x)

进而推出:x(k+1)=x(k)f(x(k))f(x(k))x(k+1)=x(k)−f(x(k))f′(x(k))

通过迭代,这恶搞狮子必然在f(x)=0f(x∗)=0的时候收敛,如下图:
1022856-20170916202719078-1588446775

在最优化的问题中, 线性最优化至少可以使用单纯形法(或称不动点算法)求解, 但对于非线性优化问题, 牛顿法提供了一种求解的办法。 假设任务是优化一个目标函数ff, 求函数f的极大极小问题, 可以转化为求解函数ff的导数f=0的问题, 这样求可以把优化问题看成方程求解问题。剩下的就和上面的牛顿法求解很相似了。

2.一维无约束极值最优化

minf(x),xR1minf(x),x∈R1

其中xx∗为目标函数的极小点即f(x)f′(x)的根

首先把f(x)f(x)在探索点x(k)x(k)处泰勒展开到2阶形式进行近似:

f(x)=f(x(k))+f(x(k))(xx(k))+12f(x(k))(xx(k))2f(x)=f(x(k))+f′(x(k))(x−x(k))+12f″(x(k))(x−x(k))2

然后用 f(x)f(x)的最小点作为新的探索点 x(k+1)x(k+1)

据此令:

f(x)=f(x(k))+f(x(k))(xx(k))=0f′(x)=f′(x(k))+f″(x(k))(x−x(k))=0

求出迭代公式:

x(k+1)=x(k)f(x(k))f(x(k)),k=0,1,...x(k+1)=x(k)−f′(x(k))f″(x(k)),k=0,1,...

因此,一维牛顿法最优化问题的计算步骤如下:
(1)给定初始点x(0)x(0),允许误差ϵ>0ϵ>0,置k=0k=0
(2)如果f(x(k))<ϵf′(x(k))<ϵ,则停止迭代,得到x(k)x(k);否则继续
(3)计算点x(k+1)x(k+1)x(k+1)=x(k)f(x(k))f(x(k))x(k+1)=x(k)−f(x(k))f″(x(k)),置k=k+1k=k+1,转(2)

需要注意的是,牛顿法在求极值的时候,如果初始点选取不好,则可能不收敛于极小点

3.多维无约束极值最优化

minf(x),xRnminf(x),x∈Rn

其中 xx∗为目标函数的极小点。

假设f(x)f(x)具有二阶连续偏导数,若第kk次迭代值为x(k),则可将f(x)f(x)x(k)x(k)附近进行二阶泰勒展开:

f(x)=f(x(k))+f(x(k))T(xx(k))+12(xx(k))TH(x(k))(xx(k))()f(x)=f(x(k))+∇f(x(k))T(x−x(k))+12(x−x(k))TH(x(k))(x−x(k))(式一)

这里 f(x(k))∇f(x(k)) f(x)f(x)的梯度向量在点 x(k)x(k)的值;

H(x(k))H(x(k))f(x)f(x)的海赛矩阵(Hesse matrix)H(x)=[ϑ2fϑxiϑxj]nnH(x)=[ϑ2fϑxiϑxj]n∗n在点x(k)x(k)的值;

函数f(x)f(x)有极值的必要条件是在极值点处一阶导数为0,即梯度向量为0。特别是当H(x(k))H(x(k))是正定矩阵时,函数f(x)f(x)的极值为极小值。

牛顿利用极小点的必要条件:f(x)=0∇f(x)=0

每次迭代中从点x(k)x(k)开始,求目标函数的极小点,作为第k+1k+1次迭代值x(k+1)x(k+1)

假设:x(k+1)x(k+1)满足f(x(k+1))=0∇f(x(k+1))=0

由式二得:

f(x)=f(x(k))+H(x(k))(xx(k))∇f(x)=∇f(x(k))+H(x(k))(x−x(k))

由于:

f(x(k+1))=0∇f(x(k+1))=0

即:

f(xk))+H(x(k))(x(k+1)x(k))=0∇f(xk))+H(x(k))(x(k+1)−x(k))=0

得:

x(k+1)=x(k)H(x(k))1f(x(k))x(k+1)=x(k)−H(x(k))−1∇f(x(k))

简写为:
x(k+1)=x(k)H1kgkx(k+1)=x(k)−Hk−1gk

用该公式作为迭代公式的算法就是牛顿法。其中, Hkpk=gkHkpk=−gk

下面给出计算步骤

输入:目标函数f(x)f(x),梯度为g(x)=f(x)g(x)=∇f(x),海赛矩阵H(x)H(x),精度要求ϵϵ;

输出:f(x)f(x)的极小点xx∗

(1)取初始点x(0)x(0),置k=0k=0
(2)计算梯度gk=f(x(k))gk=∇f(x(k))
(3)若||gk||<ϵ||gk||<ϵ,停止计算,得近似解x=x(k)x∗=x(k);否则转(3)
(4)计算Hk=H(x(k))Hk=H(x(k)),并根据迭代公式求出:pk=H(x(k))1f(x(k))pk=H(x(k))−1∇f(x(k))
(5)置x(k+1)=x(k)+pkx(k+1)=x(k)+pk
(6)置k=k+1k=k+1,转(2)

步骤(4)求pkpk,需要求H1KHK−1,计算比较复杂,所以有其他改进方法。


三、拟牛顿法

在牛顿法的迭代中,需要计算海赛矩阵的逆矩阵H1H−1,这一计算比较复杂,考虑用一个正定矩阵Gk=G(x(k))Gk=G(x(k))来近似代替H1K=H1(x(k))HK−1=H−1(x(k))。这就是拟牛顿法的基本想法。

1.拟牛顿法推导

先看牛顿迭代中海赛矩阵HkHk满足的条件。

首先,HkHk满足以下关系:

f(x)=f(x(k))+H(x(k))(xx(k))∇f(x)=∇f(x(k))+H(x(k))(x−x(k))
中取
x=x(k+1)x=x(k+1)

即得:

gk+1gk=H(x(k))(x(k+1)x(k))gk+1−gk=H(x(k))(x(k+1)−x(k))

记:gk=f(x(k))gk=∇f(x(k))yk=gk+1gkyk=gk+1−gkδk=x(k+1)x(k)δk=x(k+1)−x(k)Hk=H(x(k))Hk=H(x(k))pk=H1kgkpk=−Hk−1gk

则:

yk=Hkδkyk=Hkδk

H1kyk=δkHk−1yk=δk

该式称为拟牛顿条件

如果HkHk是正定的(H1kHk−1也是正定的),那么可以保证牛顿法搜索方向pkpk是下降方向。这是因为搜索方向是pk=H1kgkpk=−Hk−1gk

由式:

x(k+1)=x(k)H1kgkx(k+1)=x(k)−Hk−1gk

有:

x=x(k)+λpk=x(k)λH(1)kgkx=x(k)+λpk=x(k)−λHk(−1)gk

所以f(x)f(x)x(k)x(k)得泰勒展开式(见上文)可以近似写成:

f(x)=f(x(k))λgTkH1kgkf(x)=f(x(k))−λgkTHk−1gk

H1kHk−1正定,故有gTkH1kgk>0gkTHk−1gk>0,当λλ为一个充分小得正数时,总有f(x)<f(x(k))f(x)<f(x(k)),也就是说pkpk是下降方向。

拟牛顿法将GkGk作为H1kHk−1的近似,要求矩阵GkGk满足同样的条件。首先,每次迭代矩阵GkGk是正定的。同时,GkGk满足拟牛顿条件:Gk+1yk=δkGk+1yk=δk

按照拟牛顿条件选择GkGk作为H1kHk−1的近似或选择BkBk作为HkHk的近似的算法成为拟牛顿法。

按照拟牛顿条件选择GkGk作为H1kHk−1的近似;或者选择BkBk作为HkHk的近似的算法称为拟牛顿法。

按照拟牛顿条件,在每次迭代中可以选择更新矩阵Gk+1Gk+1

Gk+1=Gk+GkGk+1=Gk+∇Gk

这种选择有一定的灵活性,因此有多种具体实现方法。下面介绍Broyden类拟牛顿法。

2.DFP(Davidon-Fletcher-Powell)算法(DFP algorithm)

DFP算法选择Gk+1Gk+1的方法是,假设每一步迭代中矩阵Gk+1Gk+1是由GkGk加上两个附加项构成的,即:

Gk+1=Gk+Pk+QkGk+1=Gk+Pk+Qk

其中 PkQkPk,Qk是待定矩阵。这时:
Gk+1yk=Gkyk+Pkyk+QkykGk+1yk=Gkyk+Pkyk+Qkyk

为使Gk+1Gk+1满足拟牛顿条件yk=Hkδkyk=Hkδk,可使PkPkQkQk满足:

Pkyk=δkPkyk=δk

Qkyk=GkykQkyk=−Gkyk

事实上,不难找出这样的PkPkQkQk,例如取:

Pk=δkδTkδTkykPk=δkδkTδkTyk

Qk=GkykyTkGkyTkGkykQk=−GkykykTGkykTGkyk

这样就可以得到矩阵Gk+1Gk+1的迭代公式:

Gk+1=Gk+δkδTkδTkykGkykyTkGkyTkGkykGk+1=Gk+δkδkTδkTyk−GkykykTGkykTGkyk

称为 DFP算法

可以证明,如果初始矩阵$G_0$是正定的,则迭代过程中的每个矩阵$G_k$都是正定的。

DFP算法步骤迭代如下

输入:目标函数f(x)f(x),梯度g(x)=f(x)g(x)=∇f(x),精度要求为ϵϵ
输出:f(x)f(x)的极小点xx∗

(1)选定初始点x(0)x(0),取G0G0为正定对称矩阵,置k=0k=0
(2)计算gk=g(x(k))gk=g(x(k))。若||gk||<ϵ||gk||<ϵ,则停止计算,得近似解x=x(k)x∗=x(k),否则转(3)
(3)置pk=Gkgkpk=−Gkgk(这里与BFGS不同)
(4)一维搜索:求λkλk使得:

f(x(k)+λkpk)=Min(f(x(k)+λpk)),(λ0)f(x(k)+λkpk)=Min(f(x(k)+λpk)),(λ≥0)

(5)置 x(k+1)=x(k)+λkpkx(k+1)=x(k)+λkpk
(6)计算 gk+1=g(x(k+1))gk+1=g(x(k+1)),若 ||gk+1||<ϵ||gk+1||<ϵ,则停止计算,得近似解 x=x(k+1)x∗=x(k+1);否则,按 Gk+1Gk+1的迭代公式(上文)计算出 Gk+1Gk+1 (这里与BFGS不同)
(7)置 k=k+1k=k+1,转(3)

3.BFGS算法(Broyden-Fletcher-Goldfarb-Shanno)

BFGS算法是最流行的拟牛顿算法。

考虑用GkGk逼近海赛矩阵的逆矩阵H1H−1,也可以考虑用BkBk逼近海赛矩阵。

这时,相应的拟牛顿条件是:

Bk+1δk=ykBk+1δk=yk

可以用同样的方法得到另一迭代公式.首先,令:

Bk+1=Bk+Pk+QkBk+1=Bk+Pk+Qk

Bk+1δk=Bkδk+Pkδk+QkδkBk+1δk=Bkδk+Pkδk+Qkδk

考虑使PkQkPk和Qk满足:

Pkδk=ykPkδk=yk

Qkδk=BkδkQkδk=−Bkδk

找出适合条件的 PkQkPk和Qk,得到 BFGS算法矩阵Bk+1Bk+1的迭代公式:
Bk+1=Bk+ykyTkyTkδkBkδkδTkBkδTkBkδkBk+1=Bk+ykykTykTδk−BkδkδkTBkδkTBkδk

可以证明,如果初始矩阵B0B0是正定的,则迭代过程中的每个矩阵BkBk都是正定的。

BFGS拟牛顿算法的迭代步骤

输入:目标函数f(x)f(x)g(x)=f(x)g(x)=∇f(x),精度要求ϵϵ
输出:f(x)f(x)的极小点xx∗

(1)选定初始点x(0)x(0),取B0B0为正定矩阵的对称矩阵,置k=0k=0
(2)计算gk=g(x(k))gk=g(x(k))。若||gk||<ϵ||gk||<ϵ,则停止计算,得近似解x=x(k)x∗=x(k);否则转(3)
(3)由Bkpk=gkBkpk=−gk求出pkpk (这里与DFP不同)
(4)一维搜索:求λkλk使得:

f(x(k)+λkpk)=Min(f(x(k)+λpk)),(λ0)f(x(k)+λkpk)=Min(f(x(k)+λpk)),(λ≥0)

(5)置 x(k+1)=x(k)+λkpkx(k+1)=x(k)+λkpk
(6)计算 gk+1=g(x(k+1))gk+1=g(x(k+1)),若 ||gk+1||<ϵ||gk+1||<ϵ,则停止计算,得近似解 x=x(k+1)x∗=x(k+1);否则,按 Bk+1Bk+1的迭代公式(上文)计算出 Bk+1Bk+1 (这里与DFP不同)
(7)置 k=k+1k=k+1,转(3)

4.Broyden类算法(Broyden’s algorithm)

该算法是由DFP算法和BFGS算法相结合派生出的一类拟牛顿法。

我们可以从BFDS算法矩阵BkBk的迭代式(Bk+1=Bk+ykyTkyTkδkBkδkδTkBkδTkBkδkBk+1=Bk+ykykTykTδk−BkδkδkTBkδkTBkδk)得到BFGS算法关于GkGk的迭代公式。

事实上,若记Gk=B1k,Gk+1=B1k+1Gk=Bk−1,Gk+1=Bk+1−1

那么对以上BFDS算法矩阵BkBk的迭代式两次应用Sherman-Morrison公式得:

Gk+1=(IδkyTkδTkyk)Gk(IδkyTkδTkyk)T+δkδTkδTkykGk+1=(I−δkykTδkTyk)Gk(I−δkykTδkTyk)T+δkδkTδkTyk

称为 BFGS算法关于G_k的迭代公式

将DFP算法的迭代公式:

Gk+1=Gk+δkδTkδTkykGkykyTkGkyTkGkykGk+1=Gk+δkδkTδkTyk−GkykykTGkykTGkyk

记作 GDFPGDFP

将BFGS算法迭代公式:

Bk+1=Bk+ykyTkyTkδkBkδkδTkBkδTkBkδkBk+1=Bk+ykykTykTδk−BkδkδkTBkδkTBkδk

记作 GBFGSGBFGS

他们都满足方程拟牛顿条件式,所以他们的线性组合

Gk+1=αGDFP+(1α)GBFGSGk+1=αGDFP+(1−α)GBFGS
也满足拟牛顿条件式,而且是正定的。

其中0α10≤α≤1,这样就得到了一类拟牛顿法,称为Broyden类算法。其步骤与上文类似,唯(3)和(6)步有所不同。

⚠️ Sherman-Morrison公式:假设AAn阶可逆矩阵,u,vu,vnn维向量,且A+uvT也是可逆矩阵,则有:

(A+uvT)1=A1A1uvTA11+vTA1u(A+uvT)−1=A−1−A−1uvTA−11+vTA−1u

四、高斯牛顿法

以后再补充。

五、共轭梯度法(Conjugate Gradient)

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

具体的实现步骤请参加wiki百科共轭梯度法。

下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:(绿色为梯度下降法,红色代表共轭梯度法)

六、其他优化方法

1、启发式优化方法

启发式方法指人在解决问题时所采取的一种根据经验规则进行发现的方法。其特点是在解决问题时,利用过去的经验,选择已经行之有效的方法,而不是系统地、以确定的步骤去寻求答案。启发式优化方法种类繁多,包括经典的模拟退火方法、遗传算法、蚁群算法以及粒子群算法等等。

还有一种特殊的优化算法被称之多目标优化算法,它主要针对同时优化多个目标(两个及两个以上)的优化问题,这方面比较经典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。

2、解决约束优化问题——拉格朗日乘数法

有关拉格朗日乘数法的介绍请见另一篇博客:《拉格朗日乘数法》

原文:http://ihoge.cn/2018/newton1.html
参考:《统计学习方法》–2012 清华大学出版社 李航

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

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

相关文章

不用变量交换2个值

题目: 不使用变量交换2个值 代码如下: #include <iostream> using namespace std;int main() { int a = 3;int b = 4;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;a = a ^ b;b = a ^ b;a = a ^ b;cout<&…

基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C

原文链接: https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-active-directory-b2c/在本教程中&#xff0c;我将展示如何通过使用Azure AD B2C启用Oauth2和OpenId Connect来保护微服务。Azure Active Directory B2C将B2C身份认证…

java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)

DailyChallenge剑指 Offer 09. 用两个栈实现队列Easy20200630Description用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;d…

提升方法之AdaBoost算法

提升方法之AdaBoost算法 作为非数学专业出身看到密密麻麻的数学公式刚开始真的是非常头疼。算法的物理逻辑的时候尚能理解&#xff0c;但是涉及到具体的数学公式实现就开始懵逼了&#xff1a;为什么要用这个公式&#xff0c;这个公式是怎么推到的&#xff0c;这个公式达到什么…

C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

关于 Neting刚开始的时候是打算使用微软官方的 Yarp 库&#xff0c;实现一个 API 网关。目前写完了查看 Kubernetes Service 信息、创建 Route 和 Cluster 和绑定 Kubernetes Service。简单来说&#xff0c;就是完成了基础部分&#xff0c;配置路由和后端服务绑定&#xff0c;如…

CCR源码分析-CCR架构

CCR&#xff0c;并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道&#xff0c;这个东东是用来简化并发程序设计的。为何要并发呢&#xff1f;因为我们有多个任务需要处理&#xff0c;如果能同时做就会充分利用硬 件而减少处理的时间。自然的&a…

量子力学到底有多难?他用700多幅漫画,让孩子秒懂这个神奇世界!

▲ 点击查看很多朋友应该都看过Facebook创始人扎克伯格给他的女儿讲量子力学的那张照片。扎克伯格在清华大学经济管理学院做演讲时&#xff0c;曾谈到&#xff1a;学习量子力学改变了他的思维方式。到底什么是量子力学&#xff1f;我们生活面对的物质尺度大约是厘米级到千米级之…

Openssl搭建私有CA认证

概述CA英文全称Certification Authority&#xff0c;即数字证书认机构。从广义上来说&#xff0c;CA是负责发放和管理数字证书的权威机构&#xff0c;并作为用户数字认证中受信任的第三方&#xff0c;承担公钥体系&#xff08;PKI&#xff09;中公钥的合法性检验的责任&#xf…

提升树算法总结(一)

本文是综合了之前的以往多个笔记汇总而成&#xff0c;内容较长。感兴趣的建议收藏用到时随时翻阅内容包含&#xff1a; 若有遗漏错误之处请反馈修改&#xff0c;感激不尽 一、Boosting基本概念 二、前向分步加法模型1. 加法模型2. 前向分步算法 三、AdaBoost1. 算法解析2. 模…

Android之Launcher分析和修改4——初始化加载数据

上面一篇文章说了Launcher是如何被启动的&#xff0c;Launcher启动的过程主要是加载界面数据然后显示出来&#xff0c; 界面数据都是系统APP有关的数据&#xff0c;都是从Launcher的数据库读取&#xff0c;下面我们详细分析Launcher如何加载数据。 在Launcher.java的onCreate()…

图像处理技术之分辨率与压缩

一 图像分辨率数码图像有两大类&#xff0c;一类是矢量图&#xff0c;也叫向量图&#xff1b;另一类是点阵图&#xff0c;也叫位图。矢量图比较简单&#xff0c;它是由大量数学方程式创建的&#xff0c;其图形是由线条和填充颜色的块面构成的&#xff0c;而不是由像素组成的&am…

当代年轻人,都有些不成文的规定?

全世界只有3.14 % 的人关注了爆炸吧知识面对海量信息&#xff0c;我们不可能有时间去一一筛选&#xff0c;导致我们看到的总是局部。包括公众号&#xff0c;看似可以随便关注&#xff0c;但是你的选择其实是有限空间的。你可以关注更多资讯、干货十足的公号主动和别人分享有趣的…

未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?

今天有位女性乎友问&#xff1a;我家的电脑之前一直没装宽带&#xff0c;主要是家人怕影响学习&#xff0c;不过上周就涨了&#xff0c;电脑终于连上网线&#xff0c;但没办法上网&#xff0c;还发现电脑设备管理器中网络适配器出现黄色感叹号。对于电脑的网络适配器感叹号问题…

使用Spectre.Console创建漂亮的控制台应用程序

前言你是否厌倦了控制台应用程序默认的简陋界面&#xff1f;这时&#xff0c;你可以试试引用Nuget包Spectre.Console。打印使用帮助首先&#xff0c;我们可以设置控制台应用程序可以执行的命令&#xff1a;static async Task<int> Main(string[] args) {var app new Com…

Android之ComponentName的用法

ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的、 ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。 实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包…

Linux入门之进程管理(4)之进程与文件

Linux入门之进程管理(4)之进程与文件前面使用进程相关命令管理工具都是根据进程编号或者进程名称及其其它属性信息来查看和处理相关进程的&#xff0c;但是在某些情况下&#xff0c;想要查看某个文件或者某个设备被哪些进程所使用&#xff0c;使用ps、pgrep等命令查询的是不够准…

初识MASA Blazor

MASA Blazor是一个Blazor的UI组件库。就像大家写前端熟知的Bootstrap, Ant Design一样。MASA Blazor官网地址&#xff1a;https://blazor.masastack.comMASA Blazor Github地址&#xff1a;https://github.com/BlazorComponent/MASA.BlazorMASA Blazor Pro演示地址&#xff1a;…