无约束优化算法之拟牛顿法

2024-01-20 15:40

本文主要是介绍无约束优化算法之拟牛顿法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拟牛顿法

牛顿法在理论上有很好的效果,然而对于大规模问题,函数的海塞矩阵计算待解特别大或者难以得到,即便得到海塞矩阵我们还需要求解一个大规模线性方程组。那么能否使用海塞矩阵或其逆矩阵的近似来进行牛顿迭代呢?拟牛顿法便是这样的算法,它能够在每一步以较小的代价生成近似矩阵,并且使用近似矩阵代替海塞矩阵,而产生的迭代序列仍具有超线性收敛的性质。
拟牛顿法不计算海塞矩阵 ∇ 2 f ( x ) \nabla^2f(x) 2f(x),而是构造其近似矩阵 B k B^k Bk或其逆的近似矩阵 H k H^k Hk。我们希望 B k B^k Bk H k H^k Hk仍然保留海塞矩阵的部分性质,例如使得 d k d^k dk仍然为下降方向。

一、割线方程
回顾牛顿法的推导过程。设 f ( x ) f(x) f(x)是二阶连续可微函数,根据泰勒展开,向量值函数 ∇ f ( x ) \nabla f(x) f(x)在点 x k + 1 x^{k+1} xk+1处的近似为:
∇ f ( x ) = ∇ f ( x k + 1 ) + ∇ 2 f ( x k + 1 ) ( x − x k + 1 ) + O ( ∣ ∣ x − x k + 1 ∣ ∣ ) (1) \nabla f(x)=\nabla f(x^{k+1})+\nabla^2f(x^{k+1})(x-x^{k+1}) + O(||x-x^{k+1}||) \tag{1} f(x)=f(xk+1)+2f(xk+1)(xxk+1)+O(∣∣xxk+1∣∣)(1)
x = x k , s k = x k + 1 − x k x=x^k,s^k=x^{k+1}-x^k x=xk,sk=xk+1xk y k = ∇ f ( x k + 1 ) − ∇ f ( x k ) y^k=\nabla f(x^{k+1})-\nabla f(x^k) yk=f(xk+1)f(xk),得到
∇ 2 f ( x k + 1 ) s k + O ( ∣ ∣ s k ∣ ∣ ) = y k (2) \nabla^2f(x^{k+1})s^k+O(||s^k||)=y^k \tag{2} 2f(xk+1)sk+O(∣∣sk∣∣)=yk(2)
忽略高阶项 ∣ ∣ s k ∣ ∣ ||s^k|| ∣∣sk∣∣,我们希望海塞矩阵的近似矩阵 B k + 1 B^{k+1} Bk+1满足方程
y k = B k + 1 s k (3) y^k=B^{k+1}s^k \tag{3} yk=Bk+1sk(3)
或者其逆矩阵的近似矩阵 H k + 1 H^{k+1} Hk+1满足方程
s k = H k + 1 y k (4) s^k=H^{k+1}y^k \tag{4} sk=Hk+1yk(4)
并称(3)式与(4)式为割线方程。
在通常情况下,近似矩阵 B k + 1 B^{k+1} Bk+1 H k + 1 H^{k+1} Hk+1是由上一步迭代加上一个修正得到的,并且要求满足割线方程。这里先给出拟牛顿法的一般计算框架


拟牛顿算法的一般算法框架

  1. 给定 x 0 ∈ R x^0\in\mathbb{R} x0R,初始矩阵 B 0 ∈ R n × n B^0\in\mathbb{R^{n\times n}} B0Rn×n H 0 H^0 H0,令 k = 0 k=0 k=0
  2. while 未达到停机准则 do
  3. 计算方向 d k = − ( B k ) − 1 ∇ f ( x k ) d^k=-(B^k)^{-1}\nabla f(x^k) dk=(Bk)1f(xk) d k = − H k ∇ f ( x k ) d^k=-H^k\nabla f(x^k) dk=Hkf(xk)
  4. 通过线搜索找到合适的步长 α k > 0 \alpha_k>0 αk>0,令 x k + 1 = x k + α k d k x^{k+1}=x^k+\alpha^kd^k xk+1=xk+αkdk
  5. 更新海塞矩阵的近似矩阵 B k + 1 B^{k+1} Bk+1或其逆矩阵的近似矩阵 H k + 1 H^{k+1} Hk+1
  6. k ← k + 1 k\leftarrow k+1 kk+1
  7. end while

二、BFGS算法
在实际应用中基于 H k H^k Hk的拟牛顿法更加实用,这是因为根据 H k H^k Hk计算下降方向 d k d^k dk不需要求解线性方程组,而求解线性方程组在大规模问题上是非常耗时的。

后续我们重点关注在以 H k H^k Hk为目标的拟牛顿计算方法
这里给出秩2的BFGS公式推导过程,我们采用待定系数法推导公式,设
B k + 1 = B k + a u u T + b v v T B^{k+1}=B^k+auu^T+bvv^T Bk+1=Bk+auuT+bvvT
其中 u , v ∈ R n , a , b ∈ R u,v\in\mathbb{R^n},a,b\in\mathbb{R} u,vRn,a,bR。根据割线方程(3)有
B k + 1 s k = ( B k + a u u T + b v v T ) s k = y k B^{k+1}s^k=(B^k+auu^T+bvv^T)s^k=y^k Bk+1sk=(Bk+auuT+bvvT)sk=yk
整理可得
( a ⋅ u T s k ) u + ( b ⋅ v T s k ) v = y k − B k s k (a\cdot u^Ts^k)u+(b\cdot v^Ts^k)v=y^k-B^ks^k (auTsk)u+(bvTsk)v=ykBksk
我们通过选取 u u u v v v让以上等式成立即可。实际上 u u u v v v有非常多的取法,一种最直接的取法是让上面灯饰左右两边分别对应相等,即
u = y k , a ⋅ u T s k = 1 , v = B k s k , b ⋅ v T s k = − 1 \begin{aligned} u=y^k,a\cdot u^Ts^k=1,\\ v=B^ks^k,b\cdot v^Ts^k=-1 \end{aligned} u=yk,auTsk=1,v=Bksk,bvTsk=1
因此得到更新方式
B k + 1 = B k + y k ( y k ) T ( s k ) T y k − B k s k ( B k s k ) T ( s k ) T B k s k (5) B^{k+1}=B^k+\frac{y^k(y^k)^T}{(s^k)^Ty^k}-\frac{B^ks^k(B^ks^k)^T}{(s^k)^TB^ks^k} \tag{5} Bk+1=Bk+(sk)Tykyk(yk)T(sk)TBkskBksk(Bksk)T(5)
(5)式被成为基于 B k B^k Bk的BFGS公式,同理假设 H k = ( B k ) − 1 H^k=(B^k)^{-1} Hk=(Bk)1,可推出基于 H k H^k Hk的BFGS公式
H k + 1 = ( I − ρ k s k ( y k ) ) T H k ( I − ρ k s k ( y k ) ) + ρ k s k ( s k ) T (6) H^{k+1}=(I-\rho_ks^k(y^k))^TH^k(I-\rho_ks^k(y^k))+\rho_ks^k(s^k)^T \tag{6} Hk+1=(Iρksk(yk))THk(Iρksk(yk))+ρksk(sk)T(6)
其中 ρ k = 1 ( s k ) T y k \rho_k=\frac{1}{(s^k)^Ty^k} ρk=(sk)Tyk1。容易看出,若要BFGS公式更新产生的矩阵 H k + 1 H^{k+1} Hk+1正定,一个充分条件式不等式 ( s k ) T y k > 0 (s^k)^Ty^k>0 (sk)Tyk>0成立且上一步更新矩阵 H k H^k Hk正定,在问题求解过程中,不等式不一定会得到满足,此时应该使用Wolfe准则的线搜索来迫使不等式成立。
BFGS公式式目前最有效的拟牛顿更新格式之一,它有比较好的理论性质,实现起来也并不复杂,通过对(6)式进行改动可得到优先内存的BFGS格式(L-BFGS),它是常用的处理大规模优化问题的拟牛顿算法。

BFGS算法实现与数值实验

BFGS代码实现

function [fmin, xmin] = BFGS(func, gfunc, x0, epsilon)HOld = eye(length(x0));maxIter = 500;
xOld = x0;
iIter = 1;while iIter < maxItergOld = feval(gfunc, xOld);dk = -HOld * gOld;[~, ~, alpha] = armijo_rule(func, gfunc, xOld, 0.2, dk);xNew = xOld + alpha * dk;gNew = feval(gfunc, xNew);if norm(gNew, 2) < epsilonxmin = xNew;break;endgDiff = gNew - gOld;xDiff = xNew - xOld;I = eye(length(xNew));rho = 1 / ((xDiff)' * gDiff);HNew = (I - rho * gDiff * xDiff')' * HOld * (I - rho * gDiff * xDiff') ...+ rho * xDiff * xDiff';HOld = HNew;xOld = xNew;iIter = iIter + 1;
endif iIter == maxIterfprintf('exceed maximum iteration, and not found xmin\n');xmin = xNew;
endfmin = feval(func, xmin);end

armijo-rule代码实现

function [fnew, xnew, alpha] = armijo_rule(func, gfunc, x0, alpha0, dk)c1 = 1e-3;
alpha = alpha0;
gamma = 0.8;iIter = 0;
iterMax = 200;
alphaMin = 1e-5;while iIter < iterMax xnew = x0 + alpha * dk;fnew = feval(func, xnew);f0 = feval(func, x0);if fnew <= f0 + c1 * feval(gfunc, x0)' * dkbreak;endif alpha < alphaMinbreak;endalpha = gamma * alpha;iIter = iIter + 1;   
endif iIter == iterMaxalpha = alphaMin;fprintf('reach maximum iteration, and not found suitable alpha.\n');
endxnew = x0 + alpha * dk;
fnew = feval(func, xnew);end

算例
(0) f 0 = x 1 2 + 2 x 2 2 − 2 x 1 x 2 − 4 x 1 f_0 = x_1^2+2x_2^2-2x_1x_2-4x_1 f0=x12+2x222x1x24x1
(1) f 1 = x 2 2 + x 2 2 − x 1 x 2 − 10 x 1 − 4 x 2 f_1 =x_2^2+x_2^2-x_1x_2-10x_1-4x_2 f1=x22+x22x1x210x14x2
(2) f 2 = x 1 2 − 2 x 1 x 2 + 2 x 2 2 − 4 x 1 f_2 =x_1^2-2x_1x_2+2x_2^2-4x_1 f2=x122x1x2+2x224x1
(3) f 3 = x 1 2 − 2 x 1 x 2 + 3 x 2 2 − 4 x 1 − 5 x 2 f_3 = x_1^2 -2x_1x_2+3x_2^2-4x_1-5x_2 f3=x122x1x2+3x224x15x2

数值实验代码

% test bfgs% example 
x0 = [1, 1]';
epsilon = 1e-6;[fmin, xmin] = BFGS('bfgsTestFun0', 'bfgsTestGfun0', x0, epsilon);
fprintf('fmin = %f, xmin = (%f, %f)\n', fmin, xmin(1), xmin(2));
[x, f] = fminsearch('bfgsTestFun0', x0);
fprintf('build-in search: fmin = %f, xmin = (%f, %f)\n', f, x(1), x(2));% exercise
% ex 4-4 (1)
x0 = [1, 1]';
epsilon = 1e-6;[fmin, xmin] = BFGS('bfgsTestFun1', 'bfgsTestGfun1', x0, epsilon);
fprintf('fmin = %f, xmin = (%f, %f)\n', fmin, xmin(1), xmin(2));
[x, f] = fminsearch('bfgsTestFun1', x0);
fprintf('build-in search: fmin = %f, xmin = (%f, %f)\n', f, x(1), x(2));% ex 4-4 (2)
x0 = [1, 1]';
epsilon = 1e-6;[fmin, xmin] = BFGS('bfgsTestFun2', 'bfgsTestGfun2', x0, epsilon);
fprintf('fmin = %f, xmin = (%f, %f)\n', fmin, xmin(1), xmin(2));
[x, f] = fminsearch('bfgsTestFun2', x0);
fprintf('build-in search: fmin = %f, xmin = (%f, %f)\n', f, x(1), x(2));% ex 4-4 (3)
x0 = [1, 1]';
epsilon = 1e-6;[fmin, xmin] = BFGS('bfgsTestFun3', 'bfgsTestGfun3', x0, epsilon);
fprintf('fmin = %f, xmin = (%f, %f)\n', fmin, xmin(1), xmin(2));
[x, f] = fminsearch('bfgsTestFun3', x0);
fprintf('build-in search: fmin = %f, xmin = (%f, %f)\n', f, x(1), x(2));
function f = bfgsTestFun0(x)f = x(1)^2 + 2 * x(2)^2 - 2 * x(1) * x(2) - 4 * x(1);end
function f = bfgsTestFun1(x)f = x(1)^2 + x(2)^2 - x(1) * x(2) - 10 * x(1) - 4 * x(2);end
function f = bfgsTestFun2(x)f = x(1)^2 - 2 * x(1) * x(2) + 2 * x(2)^2 - 4 * x(1);end
function f = bfgsTestFun3(x)f = x(1)^2 - 2 * x(1) * x(2) + 3 * x(2)^2 - 4 * x(1) - 5 * x(2);end
function g = bfgsTestGfun0(x)g = [2 * x(1) - 2 * x(2) - 4; ...-2 * x(1) + 4 * x(2)];end
function g = bfgsTestGfun1(x)g = [2 * x(1) - x(2) - 10;...2 * x(2) - x(1) - 4];end
function g = bfgsTestGfun2(x)g = [2 * x(1) - 2 * x(2) - 4;...-2 * x(1) + 4 * x(2)];end
function g = bfgsTestGfun3(x)g = [2 * x(1) - 2 * x(2) - 4;...-2 * x(1) + 6 * x(2) - 5];end

计算结果为:

>> bfgsTest
fmin = -8.000000, xmin = (3.999999, 1.999999)
build-in search: fmin = -8.000000, xmin = (3.999976, 1.999973)
fmin = -52.000000, xmin = (7.999999, 6.000000)
build-in search: fmin = -52.000000, xmin = (8.000014, 5.999992)
fmin = -8.000000, xmin = (3.999999, 1.999999)
build-in search: fmin = -8.000000, xmin = (3.999976, 1.999973)
fmin = -14.125000, xmin = (4.250000, 2.250000)
build-in search: fmin = -14.125000, xmin = (4.249959, 2.249993)

三、L-BFGS算法
拟牛顿法虽然克服了计算海塞矩阵的困难,但是它仍然无法应用在大规模优化问题上。一般来说,拟牛顿矩阵 B k B^k Bk H k H^k Hk是稠密矩阵,而存储稠密矩阵要小号 O ( n 2 ) O(n^2) O(n2)的内存,这对于大规模问题,尤其是处理高分辨率图像问题时是不可能接受的。本部分介绍有效内存的BFGS方法解决了这一问题,从而使得人们在大规模问题上也可应用拟牛顿方法加速迭代的收敛。
L-BFGS方法根据公式(5)和(6)变形而来的。为了推导方便,我们以 H k H^k Hk的更新公式(6)为基础推导相应的L-BFGS,为了方便推导,引入新的记号重写公式(6)
H k + 1 = ( V k ) T H k V k + ρ s k ( s k ) T (7) H^{k+1}=(V^k)^TH^kV^k+\rho s^k(s^k)^T \tag{7} Hk+1=(Vk)THkVk+ρsk(sk)T(7)
其中
ρ k = 1 ( y k ) T s k , V k = I − ρ k y k ( s k ) T (8) \rho^k=\frac{1}{(y^k)^Ts^k},V^k=I-\rho^ky^k(s^k)^T \tag{8} ρk=(yk)Tsk1,Vk=Iρkyk(sk)T(8)
观察到(7)式有类似地推的性质,为了我们将(7)式递归地展开 m m m次,其中 m m m是一个给定的整数:
H k = ( V k − m ⋯ V k − 1 ) T H k − m ( V k − m ⋯ V k − 1 ) + ρ k − m ( V k − m + 1 ⋯ V k − 1 ) T s k − m ( s k − m ) ( V k − m + 1 ⋯ V k − 1 ) + ρ k − m + 1 ( V k − m + 2 ⋯ V k − 1 ) T s k − m + 1 ( s k − m + 1 ) ( V k − m + 2 ⋯ V k − 1 ) + ⋯ + ρ k − 1 s k − 1 ( s k − 1 ) T (9) \begin{aligned} &H^k = \\ &(V^{k-m}\cdots V^{k-1})^TH^{k-m}(V^{k-m}\cdots V^{k-1})+\\ &\rho_{k-m}(V^{k-m+1}\cdots V^{k-1})^Ts^{k-m}(s^{k-m})^(V^{k-m+1}\cdots V^{k-1})+\\ &\rho_{k-m+1}(V^{k-m+2}\cdots V^{k-1})^Ts^{k-m+1}(s^{k-m+1})^(V^{k-m+2}\cdots V^{k-1})+\cdots + \\ &\rho_{k-1}s^{k-1}(s^{k-1})^T \end{aligned} \tag{9} Hk=(VkmVk1)THkm(VkmVk1)+ρkm(Vkm+1Vk1)Tskm(skm)Vkm+1Vk1+ρkm+1(Vkm+2Vk1)Tskm+1(skm+1)Vkm+2Vk1++ρk1sk1(sk1)T(9)
为了达到节省内存的目的,(7)式不能无限展开下去,当这会产生一个问题, H k − m H^{k-m} Hkm还是无法求出。一个自然的想法就是用 H k − m H^{k-m} Hkm的近似矩阵来代替 H k − m H^{k-m} Hkm进行计算,近似矩阵的选取方式很多,但基本原则是要保证近似矩阵具有非常简单的结构,假定我们给出了 H k − m H^{k-m} Hkm的一个近似矩阵(9)式便可以用于计算拟牛顿迭代。
在拟牛顿迭代中,实际上并不需要计算 H k H^k Hk的显示形式,只需要利用 H k ∇ f ( x k ) H^k\nabla f(x^k) Hkf(xk)来计算迭代方向 d k d^k dk。为此先直接给出一个利用展开式(9)直接求解 H k ∇ f ( x k ) H^k\nabla f(x^k) Hkf(xk)的算法。见L-BFGS双循环递归算法。改算法的设计很精妙,充分利用了(9)式的结构来尽量节省计算 H k ∇ f ( x k ) H^k\nabla f(x^k) Hkf(xk)的开销。


L-BFGS双循环递归算法

  1. 初始化 q ← ∇ f ( x k ) q\leftarrow\nabla f(x^k) qf(xk)
  2. for i = k-1,k-2, …, k-m do
  3. 计算并保存 α i ← ρ i ( s i ) T q \alpha_i\leftarrow\rho_i(s^i)^Tq αiρi(si)Tq.
  4. 更新 q ← q − α i y i q\leftarrow q-\alpha_iy^i qqαiyi.
  5. end for
  6. 初始化 r ← H ^ k − m q r\leftarrow\hat{H}^{k-m}q rH^kmq,其中 H ^ k − m \hat{H}^{k-m} H^km H k − m {H}^{k-m} Hkm的近似矩阵
  7. for i = k-m, k-m+1, …, k-1 do
  8. 计算 β ← ρ i ( y i ) T r \beta\leftarrow\rho_i(y^i)^Tr βρi(yi)Tr
  9. 更新 r ← r + ( α i − β ) s i r\leftarrow r+(\alpha_i-\beta)s^i rr+(αiβ)si
  10. end for
  11. 输出 r r r,即 H k ∇ f ( x k ) H^k\nabla f(x^k) Hkf(xk)

上述L-BFGS双循环递归算法约需要4mn次乘法运算与2mn次加法运算,若近似矩阵 H ^ k − m \hat{H}^{k-m} H^km是对角矩阵,则额外需要n次乘法运算。由于m不会很大,因此该算法的复杂度为 O ( m n ) O(mn) O(mn)。算法所需要的额外存储为临时变量 α i \alpha_i αi,它的大小是 O ( m ) O(m) O(m)。综上所述,L-BFGS双循环算法是非常高效的。
近似矩阵 H ^ k − m \hat{H}^{k-m} H^km的取法可以是对角矩阵 H ^ k − m = γ k I \hat{H}^{k-m}=\gamma_kI H^km=γkI,其中
γ k = ( s k − 1 ) T y k − 1 ( y k − 1 ) T y k − 1 \gamma_k=\frac{(s^{k-1})^Ty^{k-1}}{(y^{k-1})^Ty^{k-1}} γk=(yk1)Tyk1(sk1)Tyk1
这恰好是BB方法的第一个步长。

这里给出L-BFGS的具体算法流程


  1. 选择初始点 x 0 x^0 x0,参数 m > 0 , k ← 0 m>0,k\leftarrow 0 m>0,k0.
  2. while 未达到收敛准者 do
  3. 选择近似矩阵 H ^ k − m \hat{H}^{k-m} H^km.
  4. 使用双循环算法计算下降方向 d k = − H k ∇ f ( x k ) d^k=-H^k\nabla f(x^k) dk=Hkf(xk)
  5. 使用线搜索算法计算满足Wolfe准则的步长 α k \alpha_k αk.
  6. 更新 x k + 1 = x k + α k d k x^{k+1}=x^k+\alpha_kd^k xk+1=xk+αkdk.
  7. if k > m then
  8. 从内存空间中删除 s k − m , y k − m s^{k-m},y^{k-m} skm,ykm.
  9. end if
  10. 计算并保存 s k = x k + 1 − x k , y k = ∇ f ( x k + 1 ) − ∇ f ( x k ) s^k=x^{k+1}-x^k,y^k=\nabla f(x^{k+1})-\nabla f(x^k) sk=xk+1xk,yk=f(xk+1)f(xk)
  11. k = ← k + 1 k=\leftarrow k+1 k=←k+1
  12. end while

正因为L-BFGS方法的出现,人们可以使用拟牛顿类算法求解优化问题。虽然有关L-BFGS方法的收敛性依然有限,但实际应用中L-BFGS方法很快成为应用最广泛的拟牛顿类算法。

在这里插入图片描述

这篇关于无约束优化算法之拟牛顿法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626508

相关文章

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6