MATLAB中LSTM算法实例_bresenham直线算法

MATLAB中LSTM算法实例_bresenham直线算法Gauss-Newton算法MATLAB实现结果回顾算法实现总结结果回顾Gauss-Newton算法对Gauss-newton算法做了详细的解释,并且使用C++做了实例程序。但是程序其实有微小错误,实际的坐标并不是年代1815—1885,而是1—8,否则p=A∗exp(B∗t)p=A*exp(B*t)p=A∗exp(B∗t)拟合时将会迅速增大,也得不到A=0.7A=0.7A=0.7…


Jetbrains全系列IDE稳定放心使用


一、结果回顾

Gauss-Newton算法(高斯牛顿法)用来估计参数,Gauss-Newton算法学习对Gauss-newton算法做了详细的解释,并且使用C++实现,写得很不错。

但是程序其实有微小错误,实际的坐标并不是年代1815-1885,而是1~8,否则 p = A e B t p = Ae^{Bt} p=AeBt拟合时将会迅速增大,也得不到 A = 0.7 A=0.7 A=0.7, B = 0.26 B=0.26 B=0.26 这一结果。 个人觉得原文对程序实现的解释也稍有不足,本文将使用 MATLAB,给出详细实现步骤。

A = 0.7 , B = 0.26 ; t = 1 − 8 , y = A e B t A = 0.7,B=0.26;t = 1-8,y = Ae^{Bt} A=0.7,B=0.26;t=1−8,y=AeBt绘图如下(星号为原始数据点,实现为拟合点)


MATLAB中LSTM算法实例_bresenham直线算法


二、Gauss-Newton算法

以下详细说明各个矩阵如何获取,逐步给出计算结果。

2.1 原始数据

时间刻度 t t t 1 2 3 4 5 6 7 8
人口数 y y y 8.3 11.0 14.7 19.7 26.7 35.2 44.4 55.9

2.2 数学模型

现需要使用指数模型拟合人口数 p 关于时间刻度 t 的变化。

数学模型为:
y ^ = x 1 e x 2 t (2.1) \hat {y} = x_1 e^{x_2 t} \tag{2.1} y^​=x1​ex2​t(2.1)

现在需要求解合适的参数 x = [ x 1 , x 2 ] x=[x_1, x_2] x=[x1​,x2​],使得有:
min ⁡ f ( x ) = 1 2 ∑ i = 1 8 r i 2 ( x ) (2.2) \min f(x)=\frac{1}{2} \sum_{i=1}^8 r_i^2(x) \tag{2.2} minf(x)=21​i=1∑8​ri2​(x)(2.2)

r i ( x ) = y i ^ − y i (2.3) r_i(x) = \hat {y_i} – y_i \tag{2.3} ri​(x)=yi​^​−yi​(2.3)

2.3 算法流程

接下来给出 x = [ x 1 , x 2 ] T x=[x_1, x_2]^T x=[x1​,x2​]T 的迭代过程,也即Gauss-Newton算法流程:
1)给定初始点 x 0 x_0 x0​,允许误差 ϵ > 0 \epsilon>0 ϵ>0,置 k = 0 k=0 k=0;
2) f ′ ( x ( k ) ) < ϵ f'(x^{(k)}) < \epsilon f′(x(k))<ϵ,导数接近0即在极小点附近,得到 x x x,算法结束,否则继续;
3)计算 x ( k + 1 ) x^{(k+1)} x(k+1), x ( k + 1 ) = x k − H − 1 x^{(k+1)}=x^{k}-H^{-1} x(k+1)=xk−H−1 ▽ \bigtriangledown ▽ f f f

2.4 梯度和黑森矩阵

根据定义,可得梯度和黑森矩阵如下:

原函数:

f ( x 1 , x 2 ) = 1 2 ∑ i = 1 8 r i 2 ( x 1 , x 2 ) (2.4) f(x_1, x_2) = \frac{1}{2} \sum_{i=1}^8 r_i^2(x_1, x_2) \tag{2.4} f(x1​,x2​)=21​i=1∑8​ri2​(x1​,x2​)(2.4)

梯度:
▽ f = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ] T = ∑ i = 1 8 [ r i ∂ r i ∂ x 1 r i ∂ r i ∂ x 2 ] T (2.5) \bigtriangledown f= \left [ \frac {\partial f} {\partial x_1}\quad \frac {\partial f} {\partial x_2} \right ]^T = \sum_{i=1}^8 \left [ r_i \frac {\partial r_i} {\partial x_1} \quad r_i \frac {\partial r_i} {\partial x_2} \right ]^T \tag{2.5} ▽f=[∂x1​∂f​∂x2​∂f​]T=i=1∑8​[ri​∂x1​∂ri​​ri​∂x2​∂ri​​]T(2.5)

黑森矩阵:

H = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 x 2 ∂ 2 f ∂ x 2 x 1 ∂ 2 f ∂ x 2 2 ] ≈ ∑ i = 1 8 [ ∂ r i ∂ x 1 ∂ r i ∂ x 1 ∂ r i ∂ x 1 ∂ r i ∂ x 2 ∂ r i ∂ x 2 ∂ r i ∂ x 1 ∂ r i ∂ x 2 ∂ r i ∂ x 2 ] (2.6) H = \left [ \begin {array}{cc} \displaystyle \frac {\partial^2f} {\partial x_1^2} & \displaystyle \frac {\partial^2f} {\partial x_1x_2}\\ \displaystyle \frac {\partial ^2f} {\partial x_2x_1} & \displaystyle \frac {\partial ^2f} {\partial x_2^2} \end {array} \right ] \approx \sum_{i=1}^8 \left [ \begin{array}{cc} \displaystyle \frac {\partial r_i}{\partial x_1} \displaystyle \frac {\partial r_i}{\partial x_1} & \displaystyle \frac {\partial r_i}{\partial x_1} \displaystyle \frac {\partial r_i}{\partial x_2} \\ \displaystyle \frac {\partial r_i}{\partial x_2} \displaystyle \frac {\partial r_i}{\partial x_1} & \displaystyle \frac {\partial r_i}{\partial x_2} \displaystyle \frac {\partial r_i}{\partial x_2} \end {array} \right ] \tag{2.6} H=⎣⎢⎢⎡​∂x12​∂2f​∂x2​x1​∂2f​​∂x1​x2​∂2f​∂x22​∂2f​​⎦⎥⎥⎤​≈i=1∑8​⎣⎢⎡​∂x1​∂ri​​∂x1​∂ri​​∂x2​∂ri​​∂x1​∂ri​​​∂x1​∂ri​​∂x2​∂ri​​∂x2​∂ri​​∂x2​∂ri​​​⎦⎥⎤​(2.6)


MATLAB中LSTM算法实例_bresenham直线算法

现在只剩下 r r r 关于 x 1 、 x 2 x_1、x_2 x1​、x2​ 的偏导,由 r r r 的定义,容易直接根据求导法则得出 r r r 关于 x 1 、 x 2 x_1、 x_2 x1​、x2​ 的偏导(也可使用数值微分,见第2.5小节),如下:


MATLAB中LSTM算法实例_bresenham直线算法

2.5 MATLAB 程序

进行运算时,C++程序需要逐个数据读取,而MATLAB擅长矩阵运算。矩阵运算一方面使得效率提高,运算简洁,但一定程度上也对运算表达能力有更高要求。

%原始数据
t = 1:8;
popu = [8.3 11.0 14.7 19.7 26.7 35.2 44.4 55.9];

%高斯牛顿法
A = 1.0;                    %待求变量1
B = 1.0;                    %待求变量2
k = 0;                      %迭代次数
eps = 1e-3;                 %允许误差
r = A*exp(B*t) - popu;      %误差
r1 = zeros(size(r));        %记录上一次误差

while(1)
    if (sum(abs(r1-r)) < eps) || (k >100)
        A 
        B
        k
        break
    else
        pA = exp(B*t);                      %关于A的偏导数
        pB = A*exp(B*t).*t;                 %关于B的偏导数
        H = [2*sum(pA.*pA) 2*sum(pA.*pB)    
             2*sum(pA.*pB) 2*sum(pB.*pB)];  %黑森矩阵
        df = [sum(r.*pA)  
              sum(r.*pB)];                %梯度
          
        k = k + 1;
        delta = inv(H) * df;                %变化量
        A = A - delta(1);                   %更新待求参数A
        B = B - delta(2);                   %更新待求参数B
        
        r1 = r;                             %记录上一次误差
        r = A*exp(B*t) - popu;              %更新误差
    end
end

运行结果为

A = 7.0001
B = 0.2621
k = 25

因此迭代13次达到满足条件,也与文章最开始的结果一致。

2.6 微分的数值运算

在很多实际问题中,往往需要计算微分、偏微分等,本例就运用了偏微分。但是并不是所有的数学模型都像本例这样能够给出微分的解析式,很多时候需要数值运算。
回到第一次接触导数时,导数的定义为

f ′ ( x ) = lim ⁡ Δ x → 0 f ( x + Δ x ) − f ( x − Δ x ) 2 Δ x f'(x)=\lim\limits_{\Delta x \to 0} \frac {f(x+\Delta x) – f(x-\Delta x)} {2 \Delta x} f′(x)=Δx→0lim​2Δxf(x+Δx)−f(x−Δx)​

这里两边都取 Δ \Delta Δ x x x,有助于提高精度,偏微分与之类似。
本例中

r i = x 1 e x 2 t i − y i r_i = x_1 e^{x_2 t_i} – y_i ri​=x1​ex2​ti​−yi​

偏导即为:

∂ r i ∂ x 1 = r ( x 1 + Δ x 1 , x 2 ) − r ( x 1 − Δ x 1 , x 2 ) 2 Δ x 1 = ( x 1 + Δ x 1 ) e x 2 t i − ( x 1 − Δ x 1 ) e x 2 t i 2 Δ x 1 \frac {\partial r_i}{\partial x_1} = \frac {r(x_1+\Delta x_1, x_2) – r(x_1-\Delta x_1, x_2)} {2\Delta x_1} = \frac { (x_1+\Delta x_1)e^{x_2t_i} – (x_1-\Delta x_1) e^{x_2t_i}} {2\Delta x_1} ∂x1​∂ri​​=2Δx1​r(x1​+Δx1​,x2​)−r(x1​−Δx1​,x2​)​=2Δx1​(x1​+Δx1​)ex2​ti​−(x1​−Δx1​)ex2​ti​​

∂ r i ∂ x 2 = r ( x 1 , x 2 + Δ x 2 ) − r ( x 1 , x 2 − Δ x 2 ) 2 Δ x 2 = x 1 e ( x 2 + Δ x 2 ) t i − x 1 e ( x 2 − Δ x 2 ) t i 2 Δ x 2 \frac {\partial r_i}{\partial x_2} = \frac {r(x_1, x_2 + \Delta x_2) – r(x_1, x_2-\Delta x_2)} {2\Delta x_2} = \frac {x_1 e^{(x_2 + \Delta x_2) t_i} – x_1 e^{(x_2 – \Delta x_2)t_i}} {2\Delta x_2} ∂x2​∂ri​​=2Δx2​r(x1​,x2​+Δx2​)−r(x1​,x2​−Δx2​)​=2Δx2​x1​e(x2​+Δx2​)ti​−x1​e(x2​−Δx2​)ti​​

再取 Δ x 1 = Δ x 2 = 0.0001 \Delta x_1 = \Delta x_2 =0.0001 Δx1​=Δx2​=0.0001 例如,一个很小的值,我们就能够得出关于 x 1 、 x 2 x_1、x_2 x1​、x2​的偏导数。值得注意的是,我们其实也没必要过多地化简,因为很多时候是很复杂的,例如此时 x 2 x_2 x2​ 的偏导数就比较难化简,何不充分发挥计算机的计算能力呢?

修改程序如下,程序中使用 A A A 代替 x 1 x_1 x1​, B B B 代替 x 2 x_2 x2​:

%原始数据
t = 1:8;
popu = [8.3 11.0 14.7 19.7 26.7 35.2 44.4 55.9];

%高斯牛顿法
A = 1.0;                    %待求变量1
B = 1.0;                    %待求变量2
k = 0;                      %迭代次数
eps = 1e-3;                 %允许误差
r = A*exp(B*t) - popu;      %误差
r1 = zeros(size(r));        %记录上一次误差
dA = 1e-4;                  %求导时变化率
dB = 1e-4;                  %求导时变化率
while(1)
    if (sum(abs(r1-r)) < eps) || (k >100)
        A 
        B
        k
        break
    else
        pA = (((A+dA)*exp(B*t)) - (A-dA)*exp(B*t)) / (2*dA);%关于A的偏导数
        pB = (A*exp((B+dB)*t) - A*exp((B-dB)*t)) / (2*dB) ; %关于B的偏导数
        
        H = [2*sum(pA.*pA) 2*sum(pA.*pB)    
             2*sum(pA.*pB) 2*sum(pB.*pB)];  %黑森矩阵
        df = [sum(r.*pA)  
              sum(r.*pB)];                %梯度
          
        k = k + 1;
        delta = inv(H) * df;                %变化量
        A = A - delta(1);                   %更新待求参数A
        B = B - delta(2);                   %更新待求参数B
        
        r1 = r;                             %记录上一次误差
        r = A*exp(B*t) - popu;              %更新误差
    end
end

代码主要修改了pA,pB的计算方式,结果跟上面一致

A = 7.0001
B = 0.2621
k = 25

三、LM算法

3.1 算法原理

LM算法结合高斯牛顿法和梯度下降法,虽然听起来很复杂的样子,实际上很简单,就是在高斯牛顿法的基础上添加一个梯度下降因子,算法如下:

1)给定初始点 x 0 x_0 x0​,允许误差 ϵ > 0 \epsilon>0 ϵ>0,置 k = 0 k=0 k=0;
2) f ′ ( x ( k ) ) < ϵ f'(x^{(k)}) < \epsilon f′(x(k))<ϵ,导数接近0即在极小点附近,得到 x x x,算法结束,否则继续;
3)计算 x ( k + 1 ) x^{(k+1)} x(k+1), x ( k + 1 ) = x k − ( H + x^{(k+1)}=x^{k}-(H+ x(k+1)=xk−(H+ α \alpha α I ) − 1 I)^{-1} I)−1 ▽ \bigtriangledown ▽ f f f (高斯牛顿法为 x ( k + 1 ) = x k − H − 1 x^{(k+1)}=x^{k}-H^{-1} x(k+1)=xk−H−1 ▽ \bigtriangledown ▽ f f f)

3.2 MATLAB程序

% 原始数据
t = 1:8;
popu = [8.3 11.0 14.7 19.7 26.7 35.2 44.4 55.9];

% LM法
A = 1.0;                    %待求变量1
B = 1.0;                    %待求变量2
k = 0;                      %迭代次数
eps = 1e-3;                 %允许误差
r = A*exp(B*t) - popu;      %误差
r1 = zeros(size(r));        %记录上一次误差
dA = 1e-4;                  %求导时变化率
dB = 1e-4;                  %求导时变化率
alpha = 10;					%LM法梯度下降因子 =====此行添加=====
while(1)
    if (sum(abs(r1-r)) < eps) || (k >100)
        A 
        B
        k
        break
    else
        pA = (((A+dA)*exp(B*t)) - (A-dA)*exp(B*t)) / (2*dA);%关于A的偏导数
        pB = (A*exp((B+dB)*t) - A*exp((B-dB)*t)) / (2*dB) ; %关于B的偏导数
        
        H = [2*sum(pA.*pA) 2*sum(pA.*pB)    
             2*sum(pA.*pB) 2*sum(pB.*pB)];  %黑森矩阵
        df = [sum(r.*pA)  
              sum(r.*pB)];                 	%梯度
          
        k = k + 1;
        delta = (inv(H + alpha*eye(2))) * df;	%变化量 =====此行修改=====
        A = A - delta(1);                   %更新待求参数A
        B = B - delta(2);                   %更新待求参数B
        
        r1 = r;                             %记录上一次误差
        r = A*exp(B*t) - popu;              %更新误差
    end
end
A = 6.9999
B = 0.2621
k = 33									

结果基本一致,但比高斯牛顿法还多运行了几代。


四、多变量问题

先说明一下,多变量时结果并不如预期所想,存在一些问题!

由于其他博友问到多自变量时怎么办这个问题,思考后觉得可行,做此补充。方便起见,直接把上面的时间换成两个吧:

时间刻度 t 1 t_1 t1​ 1 2 3 4 5 6 7 8
时间刻度 t 2 t_2 t2​ 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8
人口数 y y y 8.3 11.0 14.7 19.7 26.7 35.2 44.4 55.9

数学模型为:
y ^ = x 1 e x 2 t 1 + x 3 e x 4 t 2 \hat {y} = x_1 e^{x_2 t_1} + x_3e^{x_4 t_2} y^​=x1​ex2​t1​+x3​ex4​t2​

现在需要求解合适的参数 x = [ x 1 , x 2 , x 3 , x 4 ] x=[x_1, x_2, x_3, x_4] x=[x1​,x2​,x3​,x4​],使得有:
min ⁡ f ( x ) = 1 2 ∑ i = 1 8 r i 2 ( x ) r i ( x ) = y i ^ − y i \min f(x)=\frac{1}{2} \sum_{i=1}^8 r_i^2(x) \\ r_i(x) = \hat {y_i} – y_i minf(x)=21​i=1∑8​ri2​(x)ri​(x)=yi​^​−yi​

由于梯度和雅可比矩阵都使用一阶偏导即可计算,因此需要分别计算: ∂ y ^ ∂ x 1 \displaystyle \frac {\partial \hat y}{\partial x_1} ∂x1​∂y^​​, ∂ y ^ ∂ x 2 \displaystyle \frac {\partial \hat y}{\partial x_2} ∂x2​∂y^​​, ∂ y ^ ∂ x 3 \displaystyle \frac {\partial \hat y}{\partial x_3} ∂x3​∂y^​​, ∂ y ^ ∂ x 4 \displaystyle \frac {\partial \hat y}{\partial x_4} ∂x4​∂y^​​ 。此处导数可以直接运用公式计算,也可利用数值方式计算,程序将采用数值方式计算。

类比式(2.5),梯度为:

▽ f = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ∂ f ∂ x 3 ∂ f ∂ x 4 ] T = ∑ i = 1 8 [ r i ∂ r i ∂ x 1 r i ∂ r i ∂ x 2 r i ∂ r i ∂ x 3 r i ∂ r i ∂ x 4 ] T (4.1) \bigtriangledown f= \left [ \frac {\partial f} {\partial x_1}\quad \frac {\partial f} {\partial x_2} \quad \frac {\partial f} {\partial x_3} \quad \frac {\partial f} {\partial x_4} \right]^T = \sum_{i=1}^8 \left [ r_i \frac {\partial r_i} {\partial x_1} \quad r_i \frac {\partial r_i} {\partial x_2} \quad r_i \frac {\partial r_i} {\partial x_3} \quad r_i \frac {\partial r_i} {\partial x_4}\right ]^T \tag{4.1} ▽f=[∂x1​∂f​∂x2​∂f​∂x3​∂f​∂x4​∂f​]T=i=1∑8​[ri​∂x1​∂ri​​ri​∂x2​∂ri​​ri​∂x3​∂ri​​ri​∂x4​∂ri​​]T(4.1)

类比式(2.6),黑森矩阵为:

H = [ ∂ 2 f x 1 2 ⋯ ∂ 2 f ∂ x 1 x 4 ⋮ ⋱ ⋮ ∂ 2 f x 4 x 1 ⋯ ∂ 2 f ∂ x 4 2 ] ≈ ∑ i = 1 8 [ ∂ r i ∂ x 1 ∂ r i ∂ x 1 ⋯ ∂ r i ∂ x 1 ∂ r i ∂ x 4 ⋮ ⋱ ⋮ ∂ r i ∂ x 4 ⋯ ∂ r i ∂ x 4 ∂ r i ∂ x 4 ] (2.6) H = \left [ \begin {array}{ccc} \displaystyle \frac {\partial^2f} {x_1^2}& \cdots &\displaystyle \frac {\partial^2f} {\partial x_1x_4}\\ \vdots & \ddots & \vdots \\ \displaystyle \frac {\partial^2f} {x_4x_1}& \cdots &\displaystyle \frac {\partial^2f} {\partial x_4^2} \end {array} \right ] \approx \sum_{i=1}^8 \left [ \begin{array}{ccc} \displaystyle \frac {\partial r_i}{\partial x_1} \frac {\partial r_i}{\partial x_1} & \cdots & \displaystyle \frac {\partial r_i}{\partial x_1} \frac {\partial r_i}{\partial x_4} \\ \vdots & \ddots & \vdots \\ \displaystyle \frac {\partial r_i}{\partial x_4} & \cdots & \displaystyle \frac {\partial r_i}{\partial x_4} \displaystyle \frac {\partial r_i}{\partial x_4} \end {array} \right ] \tag{2.6} H=⎣⎢⎢⎢⎢⎢⎡​x12​∂2f​⋮x4​x1​∂2f​​⋯⋱⋯​∂x1​x4​∂2f​⋮∂x42​∂2f​​⎦⎥⎥⎥⎥⎥⎤​≈i=1∑8​⎣⎢⎢⎢⎢⎡​∂x1​∂ri​​∂x1​∂ri​​⋮∂x4​∂ri​​​⋯⋱⋯​∂x1​∂ri​​∂x4​∂ri​​⋮∂x4​∂ri​​∂x4​∂ri​​​⎦⎥⎥⎥⎥⎤​(2.6)

公式有了,写程序,程序中使用 A , B , C , D A, B, C, D A,B,C,D 代替 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1​,x2​,x3​,x4​ :

%原始数据
t1 = 1:8;
t2 = 1.1:0.1:1.8;
popu = [8.3 11.0 14.7 19.7 26.7 35.2 44.4 55.9];

%高斯牛顿法
A = 1.0;                    %待求变量1
B = 1.0;                    %待求变量2
C = 1.0;
D = 1.0;

k = 0;                      %迭代次数
eps = 1e-3;                 %允许误差(相比之前,降低了一个数量级精度)
r = A*exp(B*t1)+ C*exp(D*t2) - popu;      %误差
r1 = zeros(size(r));        %记录上一次误差
dA = 1e-4;                  %求导时变化率
dB = 1e-4;                  %求导时变化率
dC = 1e-4;
dD = 1e-4;

alpha = 5;                 % 梯度下降因子

while(1)
    if (sum(abs(r1-r)) < eps) || (k >50)
        A 
        B
        C
        D
        k
        break
    else
        % 计算偏导
        pA = (((A+dA)*exp(B*t1)) - (A-dA)*exp(B*t1)) / (2*dA);%关于A的偏导数
        pB = (A*exp((B+dB)*t1) - A*exp((B-dB)*t1)) / (2*dB) ; %关于B的偏导数
        pC = (((C+dC)*exp(D*t2)) - (C-dC)*exp(D*t2)) / (2*dC);%关于C的偏导数
        pD = (C*exp((D+dD)*t2) - C*exp((D-dD)*t2)) / (2*dD) ; %关于D的偏导数
        
        % 黑森矩阵
        H = [2*sum(pA.*pA) 2*sum(pA.*pB) 2*sum(pA.*pC)  2*sum(pA.*pD)   
             2*sum(pB.*pA) 2*sum(pB.*pB) 2*sum(pB.*pC)  2*sum(pB.*pD)
             2*sum(pC.*pA) 2*sum(pC.*pB) 2*sum(pC.*pC)  2*sum(pC.*pD)
             2*sum(pD.*pA) 2*sum(pD.*pB) 2*sum(pD.*pC)  2*sum(pD.*pD)];  
         
        % 梯度
        df = [sum(r.*pA)  
              sum(r.*pB)
              sum(r.*pC)
              sum(r.*pD)];                
          
        k = k + 1;
        delta =  (inv(H + alpha*eye(4))) * df;                %变化量
        A = A - delta(1);                   %更新待求参数A
        B = B - delta(2);                   %更新待求参数B
        C = C - delta(3);
        D = D - delta(4);
        
        r1 = r;                             %记录上一次误差
        r = A*exp(B*t1)+ C*exp(D*t2) - popu;              %更新误差
    end
end

结果如下:

A = -0.2168
B = 0.5926
C = 0.2473
D = 3.2152
k = 51

注意,不使用LM算法只使用Gauss-Newton法会出现矩阵奇异的问题,难以继续。


总结

本文在Gauss-Newton算法学习的基础上给出具体公式及推导,使用 MATLAB 详细地实现Gauss-Newton算法和LM算法,并给出数值计算偏导数方法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187174.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 阿里编程规范 pdf_阿里前端开发规范

    阿里编程规范 pdf_阿里前端开发规范阿里编程规范及阿里Java开发规约插件AlibabaJavaCodingGuidelines统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。2017年年初,首次公开了《阿里巴巴Java开发手册》,自从第一个版本起,倍受业界关注。为了让开发者更加方便、快速的将规范推动并实行起来,阿里巴巴基于手册内容,研发了一套自动化的IDE检测插件(…

    2022年10月28日
  • MySQL常用命令大全(完整)「建议收藏」

    MySQL常用命令大全(完整)「建议收藏」打开Linux或MacOS的Terminal(终端)直接在终端中输入windows快捷键win+R,输入cmd,直接在cmd上输入1、mysql服务的启动和停止netstopmysqlnetstartmysql启动失败可按快捷键win+R,输入services.msc,找到MySQL服务器的名称启动2、登陆mysqlmysql(…

    2022年6月30日
  • JavaActivity工作流

    JavaActivity工作流一、什么是工作流以请假为例,现在大多数公司的请假流程是这样的员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑采用工作流技术的公司的请假流程是这样的员工使用账户登录系统——点击请假——上级登录系统点击允许就这样,一个请假流程就结束了有人会问,那上级不用向公司提交请假记录?公司不用将记录录入电脑?答案

    2022年5月27日
  • pycharm学生怎么免费使用_pycharm学生延期

    pycharm学生怎么免费使用_pycharm学生延期首先登陆到官网:点击Buy-&gt; 选择 DISCOUNTEDANDCOMPLIMENTARYLICENSES,你会看到下面的内容freeforstudentandteachers,opensourceproject非盈利组织50%等,在这里,如果你是学生的话,点进去有两种获取激活码的方式,一种是有校内邮箱,一种是ISICcard,国际学生证。一般在…

    2022年8月28日
  • 网站推荐:11个相似图片搜索网站(以图找图)

    网站推荐:11个相似图片搜索网站(以图找图)你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出原始大图吗?下面的十款搜索引擎可以帮你实现,以图找图,以图搜图,以图片搜索相似的图片。一:http://tineye.com/Tineye是典型的以图找图搜索引擎,输入本地硬盘上的图片或者输入图片网址,即可自动帮你搜索相似图片,搜索准确度相对来说还比较令人满意。TinEye是加拿大Idée公司研发…

    2022年7月17日
  • python 小波包分解_小波分解示意图

    python 小波包分解_小波分解示意图由于最近正好在学习用python进行小波分解,看的英文的pywt库的各种属性和方法及其使用示例,在这里记录下来,方便以后查阅,前面的小波分解部分忘了记录了,就只能从小波包分解开始了。小波包:首先导入pywt库:>>>importpywt一、创建小波包结构:接下来我们实例化一个小波包对象:>>>x=[1,2,3,4,5,6,7,…

    2022年10月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号