【机器学习】期望最大算法(EM算法)解析:Expectation Maximization Algorithm

【机器学习】期望最大算法(EM算法):Expectation Maximization Algorithm

文章目录

  • 【机器学习】期望最大算法(EM算法):Expectation Maximization Algorithm
    • 1. 介绍
    • 2. EM算法数学描述
    • 3. EM算法流程
    • 4. 两个问题
      • 4.1 EM算法如何保证?
      • 4.2 EM算法如果收敛,那么能保证收敛到全局最大值吗?
    • 5. 总结
    • 参考

1. 介绍

EM 算法,全称 Expectation Maximization Algorithm。期望最大算法是一种迭代算法,用于含有隐变量(Hidden Variable)的概率参数模型的最大似然估计或极大后验概率估计。

我们经常会从样本观察数据中,找出样本的模型参数。 最常用的方法就是极大化模型分布的对数似然函数。

  • 但是在一些情况下,我们得到的观察数据有未观察到的隐含数据,此时我们未知的有隐含数据和模型参数,因而无法直接用极大化对数似然函数得到模型分布的参数。

怎么办呢?这就是EM算法可以派上用场的地方了。

  • EM算法解决这个的思路是使用启发式的迭代方法,既然我们无法直接求出模型分布参数,那么我们可以先猜想隐含数据(EM算法的E步),接着基于观察数据和猜测的隐含数据一起来极大化对数似然,求解我们的模型参数(EM算法的M步)。
  • 由于我们之前的隐藏数据是猜测的,所以此时得到的模型参数一般还不是我们想要的结果。不过没关系,我们基于当前得到的模型参数,继续猜测隐含数据(EM算法的E步),然后继续极大化对数似然,求解我们的模型参数(EM算法的M步)。以此类推,不断的迭代下去,直到模型分布参数基本无变化,算法收敛,找到合适的模型参数。

从上面的描述可以看出,EM算法是迭代求解最大值的算法,同时算法在每一次迭代时分为两步,E步和M步。一轮轮迭代更新隐含数据和模型分布参数,直到收敛,即得到我们需要的模型参数。

  • 一个最直观了解EM算法思路的是K-Means算法,见之前写的K-Means聚类算法原理。在K-Means聚类时,每个聚类簇的质心是隐含数据。
  • 我们会假设K个初始化质心,即EM算法的E步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即EM算法的M步。重复这个E步和M步,直到质心不再变化为止,这样就完成了K-Means聚类。

当然,K-Means算法是比较简单的,实际中的问题往往没有这么简单。接下来我们需要用数学的语言精准描述。

在这里插入图片描述

2. EM算法数学描述

对于 M M M个样本数据 X = { x 1 , x 2 , x 3 , . . . x M } X = \{ x_1, x_2, x_3,... \ x_M \} X={x1,x2,x3,... xM},找出样本的模型参数 θ \theta θ,极大化模型分布的对数似然函数如下:
θ ∗ = arg ⁡ max ⁡ θ ∑ i = 1 M log ⁡ P θ ( x i ) \begin{align} \theta ^{*} = \mathop{\arg\max}\limits_{\theta} \sum^{M}_{i=1} \log P_{\theta}(x_i) \end{align} θ=θargmaxi=1MlogPθ(xi)

假设我们得到的观察数据,含有有未观察到的隐含数据: C = { c 1 , c 2 , c 3 , . . . z K } C = \{ c_1, c_2, c_3,... \ z_K \} C={c1,c2,c3,... zK},此时我们的极大化模型分布的对数似然函数如下:
θ ∗ = arg ⁡ max ⁡ θ ∑ i = 1 M log ⁡ P θ ( x i ) = arg ⁡ max ⁡ θ ∑ i = 1 M log ⁡ ∑ k = 1 K P θ ( x i , c k ) \begin{align} \theta ^{*} = \mathop{\arg\max}\limits_{\theta} \sum^{M}_{i=1} \log P_{\theta}(x_i) = \mathop{\arg\max}\limits_{\theta} \sum^{M}_{i=1} \log \sum_{k=1}^{K} P_{\theta}(x_i, c_k) \end{align} θ=θargmaxi=1MlogPθ(xi)=θargmaxi=1Mlogk=1KPθ(xi,ck)
上面这个式子是没有 办法直接求出 θ \theta θ 的。因此需要一些特殊的技巧,我们首先对这个式子进行缩放如下:
∑ i = 1 M log ⁡ ∑ k = 1 K P θ ( x i , c k ) = ∑ i = 1 M log ⁡ ∑ k = 1 K Q ( c k ) P θ ( x i , c k ) Q ( c k ) ≥ ∑ i = 1 M ∑ k = 1 K Q ( c k ) log ⁡ P θ ( x i , c k ) Q ( c k ) \begin{align} \sum^{M}_{i=1} \log \sum_{k=1}^{K} P_{\theta}(x_i, c_k) = & \sum^{M}_{i=1} \log \sum_{k=1}^{K} Q(c_k) \frac{P_{\theta}(x_i, c_k)}{Q(c_k)}\\ \geq & \sum^{M}_{i=1} \sum_{k=1}^{K} Q(c_k) \log \frac{P_{\theta}(x_i, c_k)}{Q(c_k)} \end{align} i=1Mlogk=1KPθ(xi,ck)=i=1Mlogk=1KQ(ck)Q(ck)Pθ(xi,ck)i=1Mk=1KQ(ck)logQ(ck)Pθ(xi,ck)
上面 (3) 式引入了一个未知的新的分布, Q ( c ) Q(c) Q(c),(4)式用到了Jensen不等式:
log ⁡ ∑ j q j x j ≥ ∑ j q j log ⁡ x j \begin{align} \log \sum_j q_j x_j \geq \sum_j q_j \log x_j \end{align} logjqjxjjqjlogxj
具体来说,由于对数函数是凹函数,所以有:
f ( E ( x ) ) ≥ E ( f ( x ) ) ,如果  f ( x ) 是凹函数(如果是凸函数,则: ≤ ) \begin{align} f(\mathbb E(x)) \geq \mathbb E(f(x)),如果\ f(x) \ 是凹函数(如果是凸函数,则:\leq) \end{align} f(E(x))E(f(x)),如果 f(x) 是凹函数(如果是凸函数,则:
此时如果要满足Jensen不等式的等号,则有:
P θ ( x i , c k ) Q ( c k ) = t , t 为常数 \begin{align} \frac{P_{\theta}(x_i, c_k)}{Q(c_k)} = t,t为常数 \end{align} Q(ck)Pθ(xi,ck)=tt为常数
由于 Q ( c ) Q(c) Q(c)是一个分布,所以:
∑ k = 1 K Q ( c k ) = 1 \begin{align} \sum_{k=1}^K Q(c_k) = 1 \end{align} k=1KQ(ck)=1
从上面两式,我们可以得到:
Q ( c k ) = P θ ( x i , c k ) ∑ k = 1 K P θ ( x i , c k ) = P θ ( x i , c k ) P θ ( x i ) = P θ ( c k ∣ x i ) \begin{align} Q(c_k) = \frac{P_{\theta}(x_i, c_k)}{ \sum_{k=1}^K P_{\theta}(x_i, c_k)} = \frac{P_{\theta}(x_i, c_k)}{P_{\theta}(x_i)} = P_{\theta}(c_k|x_i) \end{align} Q(ck)=k=1KPθ(xi,ck)Pθ(xi,ck)=Pθ(xi)Pθ(xi,ck)=Pθ(ckxi)
因此,如果 Q ( c k ) = P θ ( c k ∣ x i ) Q(c_k) = P_{\theta}(c_k|x_i) Q(ck)=Pθ(ckxi),则 (4)式是我们的包含隐藏数据的对数似然的一个下界。如果我们能极大化这个下界,也就意味着可以极大化我们的对数似然。即我们需要最大化下式:
arg max ⁡ θ ∑ i = 1 M ∑ k = 1 K Q ( c k ) log ⁡ P θ ( x i , c k ) Q ( c k ) \begin{align} \argmax_\theta \sum^{M}_{i=1} \sum_{k=1}^{K} Q(c_k) \log \frac{P_{\theta}(x_i, c_k)}{Q(c_k)} \end{align} θargmaxi=1Mk=1KQ(ck)logQ(ck)Pθ(xi,ck)
去掉上式中为常数的部分,由于上式中 0 ≤ Q ( c k ) ≤ 1 0 \leq Q(c_k) \leq 1 0Q(ck)1,则我们需要极大化的对数似然下界为,
arg max ⁡ θ ∑ i = 1 M ∑ k = 1 K Q ( c k ) log ⁡ P θ ( x i , c k ) \begin{align} \argmax_\theta \sum^{M}_{i=1} \sum_{k=1}^{K} Q(c_k) \log P_{\theta}(x_i, c_k) \end{align} θargmaxi=1Mk=1KQ(ck)logPθ(xi,ck)
上式也就是我们的EM算法的M步,那E步呢?注意到上式中 Q ( c k ) Q(c_k) Q(ck) 是一个分布,因此 ∑ k = 1 K Q ( c k ) log ⁡ P θ ( x i , c k ) \sum_{k=1}^{K} Q(c_k) \log P_{\theta}(x_i, c_k) k=1KQ(ck)logPθ(xi,ck) 可以理解为 log ⁡ P θ ( x i , c k ) \log P_{\theta}(x_i, c_k) logPθ(xi,ck) 基于条件概率分布 Q ( c k ) Q(c_k) Q(ck) 的一个期望。

至此,我们理解了EM算法中E步和M步的具体数学含义。

3. EM算法流程

  • 输入
    • 观察数据: X = { x 1 , x 2 , x 3 , . . . x M } X = \{ x_1, x_2, x_3,... \ x_M \} X={x1,x2,x3,... xM}
    • 联合分布: P θ ( x , c ) P_\theta (x, c) Pθ(x,c)
    • 条件分布
    • 最大迭代次数: S S S
  • 主要流程
    • 1)随机初始化模型参数 θ \theta θ 的初始值 θ 0 \theta^0 θ0
    • 2)EM算法迭代(V次)
      • E步:计算联合分布的条件概率期望:
        Q ( c k ) = P θ s ( c k ∣ x i ) L ( θ , θ s ) = ∑ i = 1 M ∑ k = 1 K Q ( c k ) log ⁡ P θ ( x i , c k ) \begin{align} Q(c_k) = P_{\theta^s}(c_k|x_i) \\ L(\theta, \theta^s) = \sum^{M}_{i=1} \sum_{k=1}^{K} Q(c_k) \log P_{\theta}(x_i, c_k) \end{align} Q(ck)=Pθs(ckxi)L(θ,θs)=i=1Mk=1KQ(ck)logPθ(xi,ck)
      • M步:极大化 L ( θ , θ s ) L(\theta, \theta^s) L(θ,θs),得到 θ s + 1 \theta^{s+1} θs+1
        θ s + 1 = arg max ⁡ θ L ( θ , θ s ) \begin{align} \theta^{s+1} = \argmax_{\theta} L (\theta, \theta^s) \end{align} θs+1=θargmaxL(θ,θs)
      • 如果 θ s + 1 \theta^{s+1} θs+1 已收敛,则算法结束。否则继续进行迭代。
  • 输出
    • 模型参数 θ \theta θ

4. 两个问题

4.1 EM算法如何保证?

要证明EM算法收敛,则我们需要证明我们的对数似然函数的值在迭代的过程中一直在增大。即:
log ⁡ P θ s + 1 ( x i ) ≥ log ⁡ P θ s ( x i ) \begin{align} \log P_{\theta^{s+1}}(x_i) \geq \log P_{\theta^{s}}(x_i) \end{align} logPθs+1(xi)logPθs(xi)
由于,
L ( θ , θ s ) = ∑ i = 1 M ∑ k = 1 K P θ s ( c k ∣ x i ) log ⁡ P θ ( x i , c k ) … … 注: Q ( c k ) = P θ s ( c k ∣ x i ) \begin{align} L(\theta, \theta^s) = \sum^{M}_{i=1} \sum_{k=1}^{K} P_{\theta^s}(c_k|x_i) \log P_{\theta}(x_i, c_k) ……注:Q(c_k) = P_{\theta^s}(c_k|x_i) \end{align} L(θ,θs)=i=1Mk=1KPθs(ckxi)logPθ(xi,ck)……注:Q(ck)=Pθs(ckxi)
令:
H ( θ , θ s ) = ∑ i = 1 M ∑ k = 1 K P θ s ( c k ∣ x i ) log ⁡ P θ ( c k ∣ x i ) \begin{align} H(\theta, \theta^s) = \sum^{M}_{i=1} \sum_{k=1}^{K} P_{\theta^s}(c_k|x_i) \log P_{\theta}(c_k|x_i) \end{align} H(θ,θs)=i=1Mk=1KPθs(ckxi)logPθ(ckxi)
上两式相减得到:
L ( θ , θ s ) − H ( θ , θ s ) = ∑ i = 1 M ∑ k = 1 K P θ s ( c k ∣ x i ) log ⁡ P θ ( x i , c k ) P θ ( c k ∣ x i ) = ∑ i = 1 M ∑ k = 1 K P θ s ( c k ∣ x i ) log ⁡ P θ ( x i ) … … P θ s ( c k ∣ x i ) 已知,且和为 1 = ∑ i = 1 M log ⁡ P θ ( x i ) \begin{align} L(\theta, \theta^s) - H(\theta, \theta^s) = & \sum^{M}_{i=1} \sum_{k=1}^{K} P_{\theta^s}(c_k|x_i) \log \frac{P_{\theta}(x_i, c_k) }{P_{\theta}(c_k|x_i)} \\ = & \sum^{M}_{i=1} \sum_{k=1}^{K} P_{\theta^s}(c_k|x_i) \log P_{\theta}(x_i) …… P_{\theta^s}(c_k|x_i) 已知,且和为1\\ = & \sum^{M}_{i=1} \log P_{\theta}(x_i) \end{align} L(θ,θs)H(θ,θs)===i=1Mk=1KPθs(ckxi)logPθ(ckxi)Pθ(xi,ck)i=1Mk=1KPθs(ckxi)logPθ(xi)……Pθs(ckxi)已知,且和为1i=1MlogPθ(xi)
在上式最后得到式子中, θ \theta θ 分别取 θ s \theta^{s} θs θ s + 1 \theta^{s+1} θs+1,并相减得到:
∑ i = 1 M log ⁡ P θ s + 1 ( x i ) − ∑ i = 1 M log ⁡ P θ s ( x i ) = [ L ( θ s + 1 , θ s ) − L ( θ s , θ s ) ] − [ H ( θ s + 1 , θ s ) − H ( θ s , θ s ) ] \begin{align} & \sum^{M}_{i=1} \log P_{\theta^{s+1}}(x_i) - \sum^{M}_{i=1} \log P_{\theta^{s}}(x_i) \\ = & [L(\theta^{s+1}, \theta^s) - L(\theta^{s}, \theta^s)] - [H(\theta^{s+1}, \theta^s) - H(\theta^{s}, \theta^s)] \end{align} =i=1MlogPθs+1(xi)i=1MlogPθs(xi)[L(θs+1,θs)L(θs,θs)][H(θs+1,θs)H(θs,θs)]
要证明EM算法的收敛性,我们只需要证明上式的右边是非负的即可。由于 θ s + 1 \theta^{s+1} θs+1 使 L ( θ , θ s ) L(\theta, \theta^s) L(θ,θs) 极大,因此有:
L ( θ s + 1 , θ s ) − L ( θ s , θ s ) ≥ 0 \begin{align} L(\theta^{s+1}, \theta^s) - L(\theta^{s}, \theta^s) \geq 0 \end{align} L(θs+1,θs)L(θs,θs)0
而对于第二部分,我们有:
H ( θ s + 1 , θ s ) − H ( θ s , θ s ) = ∑ i = 1 M ∑ k = 1 K P θ s ( c k ∣ x i ) log ⁡ P θ s + 1 ( c k ∣ x i ) P θ s ( c k ∣ x i ) ≤ ∑ i = 1 M log ⁡ ∑ k = 1 K P θ s ( c k ∣ x i ) P θ s + 1 ( c k ∣ x i ) P θ s ( c k ∣ x i ) = ∑ i = 1 M log ⁡ ∑ k = 1 K P θ s + 1 ( c k ∣ x i ) = 0 \begin{align} H(\theta^{s+1}, \theta^s) - H(\theta^{s}, \theta^s) = & \sum^{M}_{i=1} \sum_{k=1}^{K} P_{\theta^s}(c_k|x_i) \log \frac{P_{\theta^{s+1}}(c_k|x_i)}{P_{\theta^{s}}(c_k|x_i)}\\ \leq & \sum^{M}_{i=1} \log \sum_{k=1}^{K} P_{\theta^s}(c_k|x_i) \frac{P_{\theta^{s+1}}(c_k|x_i)}{P_{\theta^{s}}(c_k|x_i)} \\ = & \sum^{M}_{i=1} \log \sum_{k=1}^{K} P_{\theta^{s+1}}(c_k|x_i) = 0 \end{align} H(θs+1,θs)H(θs,θs)==i=1Mk=1KPθs(ckxi)logPθs(ckxi)Pθs+1(ckxi)i=1Mlogk=1KPθs(ckxi)Pθs(ckxi)Pθs+1(ckxi)i=1Mlogk=1KPθs+1(ckxi)=0
其中(25)式用到了Jensen不等式,只不过和第二节的使用相反而已,第(26)式用到了概率分布累积为1的性质。至此,我们便得到了:
log ⁡ P θ s + 1 ( x i ) − log ⁡ P θ s ( x i ) ≥ 0 \begin{align} \log P_{\theta^{s+1}}(x_i) - \log P_{\theta^{s}}(x_i) \geq 0 \end{align} logPθs+1(xi)logPθs(xi)0
进而证明了EM算法的收敛性。

4.2 EM算法如果收敛,那么能保证收敛到全局最大值吗?

从上面的推导不难看出,EM算法可以保证收敛到一个稳定点,但是却不能保证收敛到全局的极大值点,因此它是局部最优的算法,当然,如果我们的优化目标 L ( θ , θ s ) L(\theta, \theta^s) L(θ,θs) 是凸的,则EM算法可以保证收敛到全局最大值,这点和梯度下降法这样的迭代算法相同。

5. 总结

如果我们从算法思想的角度来思考EM算法,我们可以发现:

  • 算法里已知的是观察数据,
  • 未知的是隐含数据和模型参数,
  • 在E步,我们所做的事情是固定模型参数的值,优化隐含数据的分布,
  • 而在M步,我们所做的事情是固定隐含数据分布,优化模型参数的值。

比较下其他的机器学习算法,其实很多算法都有类似的思想。比如SMO算法(支持向量机原理(四)SMO算法原理),坐标轴下降法(Lasso回归算法: 坐标轴下降法与最小角回归法小结),都使用了类似的思想来求解问题。

参考

【1】http://www.cnblogs.com/pinard/p/6912636.html

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

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

相关文章

性能测试 —— Tomcat监控与调优:Jconsole监控

JConsole的图形用户界面是一个符合Java管理扩展(JMX)规范的监测工具,JConsole使用Java虚拟机(Java VM),提供在Java平台上运行的应用程序的性能和资源消耗的信息。在Java平台,标准版(Java SE平台)6,JConsole的已经更新到目前的外观…

Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令

1、什么是buffer/cache ? buffer/cache 其实是作为服务器系统的文件数据缓存使用的,尤其是针对进程对文件存在 read/write 操作的时候,所以当你的服务进程在对文件进行读写的时候,Linux内核为了提高服务的读写速度,则将…

linux 约束

linux 约束 1、约束的概念1.1什么是约束1.2约束的优劣势 2、约束的作用3、约束的分类4、约束的应用场景5、约束的管理5.1创建5.2查看5.3插入5.4删除 6、总结 1、约束的概念 1.1什么是约束 在关系型数据库中,约束是用于限制表中数据规则的一种机制。它可以确保表中…

数据库数据恢复-ORACLE常见故障有哪些?恢复数据的可能性高吗?

ORACLE数据库常见故障: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE数据库ASM存储破坏。 3、ORACLE数据库数据文件丢失。 4、ORACLE数据库数据文件部分损坏。 5、ORACLE数据库DUMP文件损坏。 ORACLE数据库数据恢复可能性分析: 1、ORACLE数据库无…

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备,通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集,将采集到的信息在本地LCD显示屏上显示,同时,使用4G模块…

小程序如何关联公众号来发送模板消息

有时候我们可能需要通过公众号来发送一些小程序的服务通知,比如订单提醒、活动通知等。那么要如何操作呢? 1. 有一个通过了微信认证的服务号。需要确保小程序和公众号是同一个主体的。也就是说,小程序和公众号应该都是属于同一个企业。如果还…

RestTemplate:简化HTTP请求的强大工具

文章目录 什么是RestTemplateRestTemplate的作用代码示例 RestTemplate与HttpClient 什么是RestTemplate RestTemplate是一个在Java应用程序中发送RESTful HTTP请求的强大工具。本文将介绍RestTemplate的定义、作用以及与HttpClient的对比,以帮助读者更好地理解和使…

Vis.js教程(一):基础教程

1、Vis.js是什么 一个动态的、基于浏览器的可视化库。 该库的设计易于使用,能够处理大量动态数据,并能够对数据进行操作和交互。 该库由 DataSet、Timeline、Network、Graph2d 和 Graph3d 组件组成。 Vis.js官网:https://visjs.org/ github…

电脑计算机xinput1_3.dll丢失的解决方法分享,四种修复手段解决问题

日常生活中可能会遇到的问题——xinput1_3.dll丢失的解决方法。我相信,在座的很多朋友都曾遇到过这个问题,那么接下来,我将分享如何解决这个问题的解决方法。 首先,让我们来了解一下xinput1_3.dll文件。xinput1_3.dll是一个动态链…

第1篇 目标检测概述 —(1)目标检测基础知识

前言:Hello大家好,我是小哥谈。目标检测是计算机视觉领域中的一项任务,旨在自动识别和定位图像或视频中的特定目标,目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置,并使用边界框将其标…

安全防御第二次作业

1. 防火墙支持那些NAT技术,主要应用场景是什么? 防火墙支持几乎所有的NAT技术,包括源NAT、目标NAT、双向NAT等,主要应用场景是保护内部网络免受外部网络的攻击 NAT技术可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff…

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇 🌿相关项目介绍《基于stc8H驱动三相无刷电机开源项目技术专题概要》 🔨停机状态,才能进入设置状态,可以设置调速模式,以及转动方向。 ✨所有的功能基本已经完成调试,目前所想到的功能基本已经都添加和实现。引脚利…

C++入门知识

Hello,今天我们分享一些关于C入门的知识,看完至少让你为后面的类和对象有一定的基础,所以在讲类和对象的时候,我们需要来了解一些关于C入门的知识。 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对…

【Python从入门到进阶】37、selenium关于phantomjs的基本使用

接上篇《36、Selenium 动作交互》 上一篇我们介绍了selenium操作网页的动作内容。本篇我们来学习有关phantomjs的相关知识。 一、selenium的缺点 在介绍PhantomJS之前,让我们先讨论一下直接使用Selenium的一些缺点。 1、显示浏览器窗口:Selenium通常需…

CUDA学习笔记0924

一、nvprof分析线程束和内存读写 (1)线程束占用率分析 线程束占用率:nvprof --metrics achieved_occupancy (2)内存读写分析 内核数据读取效率:nvprof --metrics gld_throughput 程序对设备内存带宽利…

《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.4.1 Inception块 GoogLNet 中的基本卷积块叫做 Inception 块(大概率得名于盗梦空间),由 4 条并行路径组成。 前 3 条路径使用窗口…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中,为了真实模拟多个用户同时进行操作以度量服务器的处理能力,可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意:虽然通过加入集合点可…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数,不是关键字。 变量初始化,一般分为2步,变量声明变量内存分配,var 关键字就是用来声明变量的,new和make 函数主要是用来分配内存的。 var 声明值类型的变量时,系统会默…

Vector Art - 矢量艺术

什么是矢量艺术? 矢量图形允许创意人员构建高质量的艺术作品,具有干净的线条和形状,可以缩放到任何大小。探索这种文件格式如何为各种规模的项目提供创造性的机会。 什么是矢量艺术作品? 矢量艺术是由矢量图形组成的艺术。这些图形是基于…

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 第二题 题目来源 题目内容 解决方法 方法一:模拟 方法二:数学规律 方法三:分组 第三题 题目来源 题目内容 解决方法 方法一:数学方法 方法…