【强化学习的数学原理】课程笔记--3(蒙特卡洛方法)

目录

蒙特卡洛方法

第二节 推导贝尔曼最优公式中的:
q π k ( s , a ) = ∑ r P ( r ∣ s , a ) r + γ ∑ s ′ P ( s ′ ∣ s , a ) v π k ( s ′ ) q_{\pi_k}(s,a) = \sum_{r} P(r|s,a)r + \gamma \sum_{s'} P(s'|s,a) v_{\pi_k}(s') qπk(s,a)=rP(rs,a)r+γsP(ss,a)vπk(s)
时提到过,其中的 P ( r ∣ s , a ) , P ( s ′ ∣ s , a ) P(r|s,a), P(s'|s,a) P(rs,a),P(ss,a) 都认为是已知的,这种也被称为 model-based 强化学习。而这一节中,我们要考虑 model-free 的强化学习形式。此时 P ( r ∣ s , a ) , P ( s ′ ∣ s , a ) P(r|s,a), P(s'|s,a) P(rs,a),P(ss,a) 不再是已知的,那么为了“估计”这些信息,我们需要使用到蒙特卡洛方法。简单来说,就是 通过大量的模拟实验,用大量的实验的结果来估测模型参数,蒙特卡洛方法的可行性由 大数定律 保证:

对一个随机变量 X X X,假设 { x i } \{x_i\} {xi} 是独立同分布的样本,记 x ˉ = 1 n ∑ i n x i \bar{x} = \frac{1}{n} \sum_{i}^n x_i xˉ=n1inxi,则:
E ( x ˉ ) = E [ X ] v a r [ x ˉ ] = 1 n v a r [ X ] \begin{aligned}E(\bar{x}) &= E[X]\\ var[ \bar{x}] &= \frac{1}{n} var[X]\end{aligned} E(xˉ)var[xˉ]=E[X]=n1var[X]
因此 x ˉ \bar{x} xˉ E [ X ] E[X] E[X] 的无偏估计,且由于 lim ⁡ n → ∞ v a r [ x ˉ ] = 0 \lim_{n \rightarrow \infin} var[ \bar{x}] = 0 limnvar[xˉ]=0,因此当 n 足够大, x ˉ \bar{x} xˉ 趋于 E [ X ] E[X] E[X]

事实上,用蒙特卡洛方法来估计 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a),用其原始的定义更易理解和使用:
q π k ( s , a ) = E [ G t ∣ S t = s , A t = a ] q_{\pi_k}(s,a) = E[G_t | S_t =s, A_t =a] qπk(s,a)=E[GtSt=s,At=a]


MC Basic算法

回忆 第二节 中策略迭代的步骤:

已知 π k → ( v π k ( 0 ) → v π k ( 1 ) → . . . → v π k ( ∞ ) = v π k ) → 求解 q π k ( s , a ) → π k + 1 = { 1 , a = a ∗ ( s ) 0 , a ≠ a ∗ ( s ) → . . . 已知 \pi_k \rightarrow (v_{\pi_k}^{(0)} \rightarrow v_{\pi_k}^{(1)} \rightarrow ... \rightarrow v_{\pi_k}^{(\infin)} = v_{\pi_k}) \rightarrow 求解 q_{\pi_k}(s,a) \rightarrow \pi_{k+1}= \begin{cases} 1, \quad a = a^*(s)\\ 0, \quad a \neq a^*(s) \end{cases} \rightarrow ... 已知πk(vπk(0)vπk(1)...vπk()=vπk)求解qπk(s,a)πk+1={1,a=a(s)0,a=a(s)...
上面跟值迭代相比最主要的不同是 ( v π k ( 0 ) → v π k ( 1 ) → . . . → v π k ( ∞ ) = v π k ) (v_{\pi_k}^{(0)} \rightarrow v_{\pi_k}^{(1)} \rightarrow ... \rightarrow v_{\pi_k}^{(\infin)} = v_{\pi_k}) (vπk(0)vπk(1)...vπk()=vπk),将其展开:
v π k ( 1 ) = r π k + γ P π k v π k ( 0 ) v π k ( 2 ) = r π k + γ P π k v π k ( 1 ) … v π k ( ∞ ) = r π k + γ P π k v π k ( ∞ ) \begin{aligned} v_{\pi_k}^{(1)} &= r_{\pi_k} + \gamma P_{\pi_k} v_{\pi_k}^{(0)}\\ v_{\pi_k}^{(2)} &= r_{\pi_k} + \gamma P_{\pi_k} v_{\pi_k}^{(1)}\\ & \dots \\ v_{\pi_k}^{(\infin)} &= r_{\pi_k} + \gamma P_{\pi_k} v_{\pi_k}^{(\infin)}\\ \end{aligned} vπk(1)vπk(2)vπk()=rπk+γPπkvπk(0)=rπk+γPπkvπk(1)=rπk+γPπkvπk()

这里由于 P ( r ∣ s , a ) , P ( s ′ ∣ s , a ) P(r|s,a), P(s'|s,a) P(rs,a),P(ss,a) 未知,我们 不再通过迭代的方式求解 v π k v_{\pi_k} vπk,再来求解 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a) 了,而是直接根据一些 experiment (即样本) 来估计 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a) ,上述算法变成:

已知 π k → 从 ( s , a ) 出发,做 n 次实验,有 n 个结果 g π k ( i ) ( s , a ) → 估计 q π k ( s , a ) = 1 n ∑ i g π k ( i ) ( s , a ) → π k + 1 = { 1 , a = a π k ( s ) 0 , a ≠ a π k ( s ) → . . . 已知 \pi_k \rightarrow 从 (s,a) 出发,做n次实验,有n个结果 g_{\pi_k}^{(i)}(s,a) \rightarrow 估计 q_{\pi_k}(s,a) = \frac{1}{n}\sum_i g_{\pi_k}^{(i)}(s,a) \rightarrow \pi_{k+1}= \begin{cases} 1, \quad a = a_{\pi_k}(s)\\ 0, \quad a \neq a_{\pi_k}(s) \end{cases} \rightarrow ... 已知πk(s,a)出发,做n次实验,有n个结果gπk(i)(s,a)估计qπk(s,a)=n1igπk(i)(s,a)πk+1={1,a=aπk(s)0,a=aπk(s)...
其中 a π k ( s ) = arg max ⁡ a ∈ A q π k ( s , a ) a_{\pi_k}(s) = \argmax_{a \in A} q_{\pi_k}(s,a) aπk(s)=aAargmaxqπk(s,a)

下面可以看一些例子:

对于上图这样一个 grid-world 而言,一共有9个 state,每个 state 都有五种 action,假设对于每个 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a) 需要找 n n n 个样本来做估计,那么一共需要 45 ∗ n 45*n 45n 个样本。下面我们仅以 s 1 s_1 s1 为例来拆解一下:

由于上述 grid-world 是确定形式的,因此每个 ( s , a ) (s,a) (s,a) 实际不论采多少次样,结果都是相同的,即 g π k ( i ) ( s , a ) , i = 1 , 2 , 3... g_{\pi_k}^{(i)}(s,a), i = 1,2,3... gπk(i)(s,a),i=1,2,3... 都相同。(对于概率形式的 policy 而言,就可以进行大量不同的采样)

  • ( s 1 , a 1 ) (s_1, a_1) (s1,a1),路径总为 s 1 → a 1 s 1 → a 1 s 1 → a 1 . . . s_1 \overset{a_1} \rightarrow s_1 \overset{a_1} \rightarrow s_1 \overset{a_1} \rightarrow ... s1a1s1a1s1a1... q π 0 ( s 1 , a 1 ) = − 1 + γ ( − 1 ) + γ 2 ( − 1 ) + . . . = − 1 1 − γ q_{\pi_0}(s_1, a_1) = -1 + \gamma (-1) + \gamma^2 (-1) + ... = \frac{-1}{1-\gamma} qπ0(s1,a1)=1+γ(1)+γ2(1)+...=1γ1
  • ( s 1 , a 2 ) (s_1, a_2) (s1,a2),路径总为 s 1 → a 2 s 2 → a 3 s 5 → a 3 . . . s_1 \overset{a_2} \rightarrow s_2 \overset{a_3} \rightarrow s_5 \overset{a_3} \rightarrow ... s1a2s2a3s5a3... q π 0 ( s 1 , a 2 ) = 0 + γ ( 0 ) + γ 2 ( 0 ) + γ 3 ( 1 ) + γ 4 ( 1 ) + . . . = γ 3 1 − γ q_{\pi_0}(s_1, a_2) = 0 + \gamma (0) + \gamma^2 (0) + \gamma^3 (1) + \gamma^4 (1) + ... = \frac{\gamma^3}{1-\gamma} qπ0(s1,a2)=0+γ(0)+γ2(0)+γ3(1)+γ4(1)+...=1γγ3
  • ( s 1 , a 3 ) (s_1, a_3) (s1,a3),路径总为 s 1 → a 3 s 4 → a 2 s 5 → a 3 . . . s_1 \overset{a_3} \rightarrow s_4 \overset{a_2} \rightarrow s_5 \overset{a_3} \rightarrow ... s1a3s4a2s5a3... q π 0 ( s 1 , a 2 ) = 0 + γ ( 0 ) + γ 2 ( 0 ) + γ 3 ( 1 ) + γ 4 ( 1 ) + . . . = γ 3 1 − γ q_{\pi_0}(s_1, a_2) = 0 + \gamma (0) + \gamma^2 (0) + \gamma^3 (1) + \gamma^4 (1) + ... = \frac{\gamma^3}{1-\gamma} qπ0(s1,a2)=0+γ(0)+γ2(0)+γ3(1)+γ4(1)+...=1γγ3
  • ( s 1 , a 4 ) (s_1, a_4) (s1,a4),路径总为 s 1 → a 4 s 1 → a 1 s 1 → a 1 . . . s_1 \overset{a_4} \rightarrow s_1 \overset{a_1} \rightarrow s_1 \overset{a_1} \rightarrow ... s1a4s1a1s1a1... q π 0 ( s 1 , a 1 ) = − 1 + γ ( − 1 ) + γ 2 ( − 1 ) + . . . = − 1 1 − γ q_{\pi_0}(s_1, a_1) = -1 + \gamma (-1) + \gamma^2 (-1) + ... = \frac{-1}{1-\gamma} qπ0(s1,a1)=1+γ(1)+γ2(1)+...=1γ1
  • ( s 1 , a 5 ) (s_1, a_5) (s1,a5),路径总为 s 1 → a 5 s 1 → a 1 s 1 → a 1 . . . s_1 \overset{a_5} \rightarrow s_1 \overset{a_1} \rightarrow s_1 \overset{a_1} \rightarrow ... s1a5s1a1s1a1... q π 0 ( s 1 , a 1 ) = 0 + γ ( − 1 ) + γ 2 ( − 1 ) + . . . = − γ 1 − γ q_{\pi_0}(s_1, a_1) = 0 + \gamma (-1) + \gamma^2 (-1) + ... = \frac{-\gamma}{1-\gamma} qπ0(s1,a1)=0+γ(1)+γ2(1)+...=1γγ

因此 a π 0 ( s ) = arg max ⁡ a ∈ A q π 0 ( s 1 , a ) = 2 或  3 a_{\pi_0}(s) = \argmax_{a \in A} q_{\pi_0}(s_1,a) = 2 \text{ 或 } 3 aπ0(s)=argmaxaAqπ0(s1,a)=2  3。实时上我们也可直观看到,将 s 1 s_1 s1 处的 action 改成 a 2 a_2 a2 或者 a 3 a_3 a3 均可将 s 1 s_1 s1 处的 action 调整至最优。

NOTE: 上述例子中,是为了方便理解,所以相当于是把 model (即 P ( r ∣ s , a ) P(r|s,a) P(rs,a) P ( s ′ ∣ s , a ) P(s'|s,a) P(ss,a) )都展示出来了,但实际的情况应该是:我们并不知道 model 是怎样的,但是从每个 ( s 1 , a i ) (s_1, a_i) (s1,ai) 出发采样 n n n 次,会发现每次采出来的 trajectory 都是相同的,然后我们依然按 q π 0 ( s 1 , a ) = 1 n ∑ i g π 0 ( i ) ( s 1 , a ) q_{\pi_0}(s_1,a) = \frac{1}{n}\sum_i g_{\pi_0}^{(i)}(s_1,a) qπ0(s1,a)=n1igπ0(i)(s1,a) 来估计 q π 0 ( s 1 , a ) q_{\pi_0}(s_1,a) qπ0(s1,a),其实就还是上述的结果。

另一个更有意思的例子是:

前一个例子,我们采样的 trajectory 是无限长的,但在这个例子中,我们将采样的 trajectory 的长度从1开始逐渐递增,然后可以观察到一个有趣的现象:当采样的 trajectory 的长度比较小时,只有更靠近 target state的 state,其 state value 才能算到为正,而更远的 state,其 state value 都为0。从公式上来说也很好理解,由于: v π ( s ) = ∑ a π ( a ∣ s ) q π ( s , a ) v_{\pi}(s) = \sum_a \pi(a|s) q_{\pi}(s,a) vπ(s)=aπ(as)qπ(s,a) ,因此贪婪policy下, v π ( s ) = max ⁡ a q π ( s , a ) v_{\pi}(s) = \max_{a}q_{\pi}(s,a) vπ(s)=amaxqπ(s,a),而从上一个例子不难得知 q π ( s , a ) q_{\pi}(s,a) qπ(s,a) 要能走到 target state,才能开始拿到正的分数,因此如果 trajectory 的长度太短,以至于甚至走不到 target state,那么 q π ( s , a ) = 0 q_{\pi}(s,a) = 0 qπ(s,a)=0,因此 v π ( s ) v_{\pi}(s) vπ(s) 也为0。

sparse reward

上述现象也称为 sparse reward,因为其 reward 是稀疏的,即前面走对很多步都没有reward,必须到 target state 开始才有 reward。对于特别大的 state space 来说, sparse reward 会导致模型效率低下,因为每个样本的计算量都大大提升。有一些方法可以缓解这样的问题,例如:如果能走到离 target state 比较近的 state,那么也可以拿到一定的 reward,离得越近,reward 越大。更多可见 Reference


MC Greedy 算法

上述 MC Basic 方法在实际使用时,还有很多地方需要改进:

样本使用效率

以上面第一个例子为例:

当从 ( s 1 , a 2 ) (s_1, a_2) (s1,a2) 出发,其实计算其 action state 时,还同时可以算到很多后面的 state 的 action state
s 1 → a 2 s 2 → a 4 s 1 → a 2 s 2 → a 3 s 5 → a 1 ⋯ [ ( s 1 , a 2 ) 的样本 ] s 2 → a 4 s 1 → a 2 s 2 → a 3 s 5 → a 1 ⋯ [ ( s 2 , a 4 ) 的样本 ] s 1 → a 2 s 2 → a 3 s 5 → a 1 ⋯ [ ( s 1 , a 2 ) 的样本 ] s 2 → a 3 s 5 → a 1 ⋯ [ ( s 2 , a 3 ) 的样本 ] s 5 → a 1 ⋯ [ ( s 5 , a 1 ) 的样本 ] \begin{aligned} s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_4} s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1}& \cdots \quad [(s_1, a_2)\text{ 的样本}]\\ \quad\\ s_2 \xrightarrow{a_4} s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1}& \cdots \quad [(s_2, a_4)\text{ 的样本}]\\ \quad\\ s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1}& \cdots \quad [(s_1, a_2)\text{ 的样本}]\\ \quad\\ s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1}& \cdots \quad [(s_2, a_3)\text{ 的样本}]\\ \quad\\ s_5 \xrightarrow{a_1}& \cdots \quad [(s_5, a_1)\text{ 的样本}] \end{aligned} s1a2 s2a4 s1a2 s2a3 s5a1 s2a4 s1a2 s2a3 s5a1 s1a2 s2a3 s5a1 s2a3 s5a1 s5a1 [(s1,a2) 的样本][(s2,a4) 的样本][(s1,a2) 的样本][(s2,a3) 的样本][(s5,a1) 的样本]

因此我们会发现:可能不需要从每一个 state 出发,而只要从一些比较前面的 state 出发,就有可能给后面的 (state, action) 也得到足够多的样本。

顺便再介绍两个相关的概念,从上例也能发现,即使是同一条 trajectory ,也可能经过某对 (state, action) 好几次 (eg:上面的 ( s 1 , a 2 ) (s_1, a_2) (s1,a2)) :

  1. first-visit strategy:如果采样时,只采第一次出现的样本
  2. every-visit strategy:如果采样时,采全部出现的样本

MC ϵ \epsilon ϵ-Greedy 算法

上面我们已经探讨了 MC Basic 的一个改进方向,就是不用真的对每一个 (state, action) 进行遍历,而是可以选几个 state ,然后进行足够长的探索。那么问题来了:需要选怎样的 state,多长的 trajectory ,才能让每对 (state, action) 都采到足够的样本呢?

这里就来到了 exploration 和 exploitation 的balanceexploitation:很好理解,就是要选取最优的 Policy,而前面我们已经证明过,最优的 Policy 就是贪婪形式的: π k + 1 ( a ∣ s ) = { 1 , a = a k ∗ ( s ) 0 , a ≠ a k ∗ ( s ) \pi_{k+1}(a|s) = \begin{cases} 1, \quad a = a^*_k(s)\\ 0, \quad a \neq a^*_k(s) \end{cases} πk+1(as)={1,a=ak(s)0,a=ak(s)

那既然能找到最优策略,又扯到 exploration 什么事呢?这是因为 a k ∗ ( s ) = arg max ⁡ a ∈ A q π k ( s , a ) a^*_k(s) = \argmax_{a \in A} q_{\pi_k}(s,a) ak(s)=aAargmaxqπk(s,a) 实际是求不到的。因为 第一节 就提到过: 为了一般性,我们后面讨论的都是 continuing task,将 target state 也看作普通的 state,可以离开,只是每次进入 target state 时 ,reward 加 1 。所以每个 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a) 对应的都是一个无限长的 trajectory ,上例中可以把值求出来,是因为它刚好是一个收敛的级数,但不是所有的情况我们都保证 reward 级数可以收敛。这样就会导致一个问题:我们不能直接信任贪婪形式的结果。与此同时,贪婪形式带来的坏处是:它的每一条 trajectory 能覆盖的样本比较有限,所以需要的 trajectory 会比较多,计算量也比较大。既然反正都无法保证得到的策略是最优的,还不如为了更快得得到一个可用的策略,再保留一些探索性,因此提出了 MC ϵ \epsilon ϵ-Greedy 算法 :

π k + 1 ( a ∣ s ) = { 1 − ∣ A ∣ − 1 ∣ A ∣ ϵ , a = a k ∗ ( s ) 1 ∣ A ∣ ϵ , a ≠ a k ∗ ( s ) \pi_{k+1}(a|s) = \begin{cases} 1 - \frac{|A|-1}{|A|} \epsilon, \quad a = a^*_k(s)\\ \frac{1}{|A|} \epsilon, \quad a \neq a^*_k(s) \end{cases} πk+1(as)={1AA1ϵ,a=ak(s)A1ϵ,a=ak(s)

其中 ∣ A ∣ |A| A 是 action 的种数。即对每个非最优的 action,仍然给一点点的概率,使得 trajectory 仍有可能往这个方向走。 (这里与深度学习中 “贪婪搜索会导致局部最优,所以用 beam search 来增大一些探索的空间” 形似而神不似,因为对于很多的序列学习任务,它的长度是 有限且已知 的,因此它的最优解是可以求到的,只是计算量过大实际不太可行。而这里的最优解,是理论都不可知的 (model-free 时,前面 model-based 的情况,理论上还是可以用贝尔曼最优公式求解的),增大搜索的目的是为了减少计算量,而 beam search 是为了得到更好的结果而增加计算量 )。以下是 exploration 和 exploitation 的balance 的总结:

  • ϵ \epsilon ϵ + 短&少的 trajectory,偏向于 exploration。样本量少,计算快,但找到的策略差
  • ϵ \epsilon ϵ + 长&多的 trajectory,偏向于 exploitation。样本量大,计算慢,但找到的策略更优

一些例子

还是看一些例子来加深理解:

  1. ϵ \epsilon ϵ 的影响

从 (a) 到 (d), ϵ \epsilon ϵ 从0开始逐渐增大,可以看到 state value 也在逐渐变小,说明策略在逐渐变“差”,但 (b) 至少跟 (a) 还是 consistent 的,即最大概率的 action 和 (a) 还是相同,而 © 和 (d),甚至有的 state 最优 action 已经变了。这其中的原因,可以以 target value 为例讨论一下: ϵ \epsilon ϵ 比较大时,从 target state 出发,往各个方向探索的概率都比较大了,但是 target value 周围大部分都是 forbidden state,因此总是会拿到负分,尽管我们希望的结果是:在 target state 学会呆在原地,但呆在原地就有比较大的几率拿负分,相反往下走出去了,反而不容易拿负分,因此它最后学到的是在 target state 要往下走出去。

  1. ϵ \epsilon ϵ 的大小与所需 trajectory 条数的关系

左边一列是 ϵ = 1 \epsilon =1 ϵ=1 时,表明各个方向探索的概率相等。右边一列是 ϵ = 0.5 \epsilon =0.5 ϵ=0.5 时,表明探索性弱一些。可以看到:

  • ϵ \epsilon ϵ 较大时,同样长度的 trajectory 探索到的 (state,action) 种数更多,甚至长度较长时,一条 trajectory 就足以产生所有 (state,action) 的样本了
  • ϵ \epsilon ϵ 较大时,一条 trajectory 产生的样本在不同 (state,action) 的分布也比较均匀,即采样比较均匀;而 ϵ \epsilon ϵ 较小时,会出现大部分 (state,action) 采样比较少,而个别 (state,action) 采样多得多的情况

结论: ϵ \epsilon ϵ 和 trajectory 的条数,均为MC ϵ \epsilon ϵ-Greedy 算法的超参数,需要根据实验来调整,更大的 ϵ \epsilon ϵ 可以减少马尔可夫模拟次数,但是得到的策略效果也会更差一些,而更小的 ϵ \epsilon ϵ 计算量更大,结果也更好。一般可以前期采用大的 ϵ \epsilon ϵ ,加大探索空间,快速找到一个差不多的策略,后期再改成小的 ϵ \epsilon ϵ ,找更好的策略。


Reference:
1.强化学习的数学原理

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

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

相关文章

vue3 ~ pinia学习

先看两个图 一个vuex 一个pinia 根据图看出来 pinia更简单了 那么具体怎么操作呢 我们来看下~ 第一步 下载 yarn add pinia # 或者使用 npm npm install pinia 第二步 注册 创建一个 pinia 实例 (根 store) 并将其传递给应用: import { createApp } from v…

代码随想录算法训练Day57|LeetCode200-岛屿数量、LeetCode695-岛屿的最大面积

岛屿数量 题目描述 力扣200-岛屿数量 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此…

前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架&#xff0c;后台只需一个工具类即可实现下载 后端下载实现 依赖 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

【web前端HTML+CSS+JS】--- HTML学习笔记01

学习链接&#xff1a;黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程_哔哩哔哩_bilibili 学习文档&#xff1a; Web 开发技术 | MDN (mozilla.org) 一、前后端工作流程 WEB模型&#xff1a;前端用于采集和展示信息&#xff0c;中…

Web漏洞扫描工具AppScan与AWVS测评及使用体验

AppScan和AWVS业界知名的Web漏洞扫描工具&#xff0c;你是否也好奇到底哪一个能力更胜一筹呢&#xff1f;接下来跟随博主一探究竟吧。 1. 方案概览 第一步&#xff1a;安装一个用于评测的Web漏洞靶场&#xff08;本文采用最知名和最广泛使用的靶场&#xff0c;即OWASP Benchma…

啥?你没听过SpringBoot的FatJar?

写在最前面&#xff1a; SpringBoot是目前企业里最流行的框架之一&#xff0c;SpringBoot的部署方式多数采用jar包形式。通常&#xff0c;我们使用java -jar便可以直接运行jar文件。普通的jar只包含当前 jar的信息&#xff0c;当内部依赖第三方jar时&#xff0c;直接运行则会报…

robotframework-appiumLibrary 应用 - 实现 app 自动化

1、安装appiumLibrary第三方库 运行pip命令&#xff1a;pip install robotframework-appiumlibrary 若已安装&#xff0c;需要更新版本可以用命令&#xff1a;pip install -U robotframework-appiumlibrary 2、安装app自动化环境。 参考我的另外一篇专门app自动化环境安装的…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

打卡第4天----链表

通过学习基础,发现我的基本功还得需要再练练,思路得再更加清晰明了,这样子做算法题才能驾轻就熟。每天记录自己的进步。 一、两两交换 题目编号:24 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

[数据结构] 基于交换的排序 冒泡排序快速排序

标题&#xff1a;[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;冒泡排序 优化后实现&#xff1a; &#xff08;二&#xff09;快速排序 I、实现方法&#xff1a; &#…

opencv环境搭建-python

最近遇到了一些图像处理的需求&#xff0c;所以需要学习一下opencv,来记录一下我的学习历程。 安装numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy安装matplotlib pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib安装opencv …

ctfshow web入门 web338--web344

web338 原型链污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …

gcc/g++的四步编译

目录 前言1.预处理&#xff08;进行宏替换&#xff09;2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成二进制文件&#xff09;4. 链接 &#xff08;生成可执行文件&#xff09;a. 动态库 && 动态链接b. 静态库 && 静态链接c. 验证d. 动静态链接…

技术实现路径怎么写?(Word项目技术路径文档参考)

软件项目编写技术实现路径至关重要&#xff0c;因为它为项目团队提供了清晰的开发蓝图。这一路径明确了从项目启动到交付各阶段所需的技术方案、步骤及预期成果&#xff0c;有助于团队统一认识&#xff0c;确保开发工作有序进行。同时&#xff0c;技术实现路径有助于识别潜在的…

HetuEngine简介

目录 HetuEngine是什么&#xff1f; HetuEngine的特点以及使用场景 特点 使用场景 HetuEngine介绍 结构 近期用到了Hetu&#xff0c;了解下这个工具是起什么作用的。 HetuEngine是什么&#xff1f; 是引擎&#xff0c;设计是为了让与当前的大数据生态完美融合的引擎&am…

本安防爆手机:危险环境下的安全通信解决方案

在石油化工、煤矿、天然气等危险环境中&#xff0c;通信安全是保障工作人员生命安全和生产顺利进行的关键。防爆智能手机作为专为这些环境设计的通信工具&#xff0c;提供了全方位的安全通信解决方案。 防爆设计与材料&#xff1a; 防爆智能手机采用特殊的防爆结构和材料&…

Mysql部署MHA高可用

部署前准备&#xff1a; mysql-8.0.27下载地址&#xff1a;https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar mha-manager下载地址&#xff1a;https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-mana…

为什么需要做网络安全服务?

网络安全服务之所以重要&#xff0c;是因为它在保护数字资产、维护企业运营、确保法规遵从、防范恶意行为以及建立信任等方面扮演着关键角色。以下是一些主要的理由&#xff1a; 保护核心资产和数据&#xff1a; 数字化转型使得企业数据变得极其宝贵&#xff0c;包括知识产权、…

深度学习模型加密python版本

支持加密的模型: # torch、torch script、onnx、tensorrt 、torch2trt、tensorflow、tensorflow2tensorrt、paddlepaddle、paddle2tensorrt 深度学习推理模型通常以文件的形式进行保存&#xff0c;相应的推理引擎通过读取模型文件并反序列化即可进行推理过程. 这样一来&#…