【机器学习】期望最大算法(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内核为了提高服务的读写速度,则将…

如何正确选择研究方向?如何实现论文创新?

学术评价是遵循“质量第一”原则的,所以对于研究生来说,从一开始就要把路子走正,自觉树立精品意识,把精力高度集中到提高学位论文的质量上来。这里,根据本人多年来指导博士和硕士研究生的体会,就人文社科研究生学位论文的选题与创新略述管见。 学位论文选题的两个层面 …

ssm课程实验教学系统hsg5740Y3-计算机毕业设计源码+数据库+lw文档+系统+部署

ssm课程实验教学系统hsg5740Y3-(毕业设计毕设项目源代码课程设计程序设计指导xz2023)

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模块…

pytorch 实战【以图像处理为例】

pytorch 实战【以图像处理为例】 训练过程中保存模型具体在训练中断如何继续 训练过程中保存模型 在PyTorch中,模型训练过程中保存模型通常涉及以下几个步骤: 保存整个模型: 使用 torch.save 函数,你可以保存整个模型,包括模型的…

hive分区表的元数据信息numRows显示为0

创建分区表 CREATE TABLE `dept_partition`(`deptno` int, `dname` string, `loc` string) PARTITIONED BY (

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

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

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

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

postgresql 内核源码分析 clog机制流程 commit log文件格式,分离的原因,分组优化及leader更新机制

clog 介绍 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君…

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

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

TongWeb8 专用机使用指导

前言 专用机要求软件以deb、rpm安装包形式提供,通过三合一安全管理工具进行安装,否则软件的可执行程序无法运行,所以TongWeb6、7版本的专用机版本遵循此原则。 TongWeb8安装使用方式 TongWeb8除可以提供deb、rpm安装包形式外,还支…

设计模式:备忘录模式

目录 组件代码示例源码中使用优缺点总结 备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和恢复对象的内部状态。备忘录模式可以将对象的状态保存到备忘录对象中,并在需要时从备忘录…

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

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

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

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

Go基础语法:map

9 map Go 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。 Go 语言中的 map 是引用类型,必须初始化之后才能使用。 9.1 map 定义 Go 语言中 map 的定义语法为&…

sql on条件判断是要注意null值

我是因为用了merge into语法,然后on条件中判断的字段是可配置的,这就导致了,有时候判断条件多的情况下,判断的字段会碰到有null值的情况,如果on两边的字段都是null,null和null对比就会导致结果为false&…