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

news2025/2/23 17:08:42

【机器学习】期望最大算法(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.coloradmin.cn/o/1037795.html

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

相关文章

C++核心编程——P25-拷贝构造函数调用时机

拷贝构造函数调用时机 C中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕的对象来初始化一个新对象值传递的方式给函数参数传值以值方式返回局部对象 #include<iostream> using namespace std; class Person { public:Person(){cout << "Person…

深入理解Linux中信号处理过程

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0…

联想笔记本怎么关闭/开启自带键盘

搜索&#xff0c;命令提示符&#xff0c;以管理员身份运行在弹出的窗口中将下面这段代码输入进去&#xff0c;并且回车。 sc config i8042prt startdisabled&#xff0c;提示成功即可然后重启&#xff0c; 笔记本自带键盘就会关闭。如果想恢复&#xff0c; 只要以同样方法输入下…

开发板TFTP调试

问题描述 开发板和host(此处指虚拟机linux)可以平通&#xff0c;但是通过uboot tftp下载请求时一直显示T T T, 即超时 使用wireshark抓包也显示超时 措施 关闭windows和linux的防火墙 重新进行下载成功

智慧公厕,公共厕所数字化促进智慧城市管理的成效

随着科技的不断进步和城市化的快速发展&#xff0c;城市管理也面临着新的挑战和机遇。而智慧公厕作为基层配套设施&#xff0c;通过数字化提升城市管理的效能&#xff0c;成为了现代智慧城市建设的重要一环。本文以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量项目案…

MySQL学习笔记11

MySQL日期类型&#xff1a; ###㈠ DATE类型&#xff08;年-月-日&#xff09; The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values inYYYY-MM-DD format. The supported range is 1000-01-01 to 9999-12-31. ##…

RASP hook插桩原理解析

javaagent技术&#xff0c;实现提前加载类字节码实现hook&#xff0c;插桩技术 javassist技术ASM字节码技术 像加载jar&#xff0c;有两种方式 premain启动前加载&#xff1a;每次变动jar包内容&#xff0c;都需要进行重启服务器利用java的动态attch加载原理&#xff0c;采用pr…

查询统计当前日期往前推近七天每天的记录数

1、查询统计当前日期往前推近七天每天的记录数。 并且如果某一天没有数据&#xff0c;则该天不会显示在结果集中&#xff0c;也不会用零值补充 SELECT date_format(create_time, %Y-%m-%d), count(*) FROM your_table WHERE create_time > date_sub(curdate(), interval 6…

恒合仓库 - 采购单管理模块

采购单管理模块 文章目录 采购单管理模块一、添加采购单(核心)1.1 采购流程1.2 采购单实体类1.3 添加采购单1.3.1 Mapper1.3.2 Service1.3.3 Controller1.3.4 效果图 二、采购单管理模块2.1 仓库数据回显2.1.1 Mapper2.1.2 Service2.1.3 Controller2.1.4 效果图 2.2 采购单列表…

Docker - Docker启动的MySql修改密码

基于上篇文章《Docker - Docker安装MySql并启动》&#xff0c;在Docker中启动了mysql服务&#xff0c;但是密码设置成了123456&#xff0c;想起来学生时代数据库被盗走&#xff0c;然后邮箱收到被勒索BTC的场景还历历在目&#x1f62d;&#xff0c;密码不能再设置这么简单了啊&…

【prometheus+grafana】快速入门搭建-服务监控各插件及企业微信告警

目录 1. 安装qywechat_webhook插件通知企业微信 1.1. 新建目录/opt/prometheus/qywechathook/conf 1.2. 新建编辑wx.js文件 1.3. 运行启动容器 1.4. 查看容器启动情况 1.5 企业微信通知地址为&#xff1a; 2. 安装altermanager 2.1. 下载altermanager 2.2. 解压alterm…

Linux 远程登录(Xshell7)

为什么需要远程登录Linux&#xff1f;因为通常在公司做开发的时候&#xff0c;Linux 一般作为服务器使用&#xff0c;而服务器一般放在机房&#xff0c;linux服务器是开发小组共享&#xff0c;且正式上线的项目是运行在公网&#xff0c;因此需要远程登录到Liux进行项日管理或者…

LeetCode算法二叉树—二叉树的中序遍历

目录 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&am…

Linux--线程 创建、等待、退出

Linux上线程开发API概要 多线程开发的最基本概念主要包含&#xff1a;线程&#xff0c;互斥锁&#xff0c;条件。   线程 3 种操作&#xff1a;线程的创建&#xff0c;退出&#xff0c;等待。   互斥锁 4 种操作&#xff1a;创建&#xff0c;销毁&#xff0c;加锁和解锁。…

iterm2 配置自动登录跳板机,无需输入密码和google验证码

1、准备&#xff1a;编写Python脚本计算生成google身份验证码&#xff0c;参考python3 实现 google authenticator 认证/校验_我要买GTR45的博客-CSDN博客 脚本拿来就可以用&#xff0c;只需要替换脚本中的secret字段的值为自己的密钥即可 2、在~/.ssh/目录下编写expect脚本 …

多台群晖实现按计划WOL网络自动唤醒数据冷备份

几年前买了2盘位的DS218&#xff0c;但是随着照片的增加已经不够用。年中购入了4盘位的群晖DS923、2块16T西数数企业级硬盘、1块2T intel企业级 SSD 1.什么是冷备份 冷备是离线备份&#xff0c;备份好的数据可以单独存取&#xff0c;定期冷备可以保证数据安全&#xff0c;适合…

怎样快速打开github.com

1访问这个网站很慢是因为有DNS污染&#xff0c;被一些别有用心的人搞了鬼了&#xff0c; 2还有一个重要原因是不同的DNS服务器解析的速度不一样。 1 建议设置dns地址为114.114.114.114.我觉得假设一个县城如果有一个DNS服务器的话&#xff0c;这个服务器很可能不会存储…

求组合数(递归版)(杨辉三角形)

description 请编写递归函数&#xff0c;求组合数。 函数原型 double Cmb(int x, int y); 说明&#xff1a;x 和 y 为非负整数&#xff0c;且 x≥y&#xff0c;函数值为组合数 C x y ​ 。 裁判程序 #include <stdio.h> double Cmb(int x, int y); int main() { int m…

基于华为云云耀云服务器L实例下的场景体验 | Docker可视化工具Portainer

基于华为云云耀云服务器L实例下的场景体验 | Docker可视化工具Portainer 1. 简介2. 准备工作3. 工具配置3.1. 配置安全组3.2. 初始化配置Portainer 4. 使用Portainer部署MySQL容器4.1. 创建MySQL容器4.2. 连接MySQL容器 1. 简介 随着云计算时代的进一步深入&#xff0c;越来越多…

【计算机网络笔记三】传输层

端口 在网络中如何标记一个进程&#xff1f; TCP/IP 体系的传输层使用【端口号】来标记区分应用层的不同应用进程。这里说的端口是一个逻辑的概念&#xff0c;并不是实实在在的物理端口。 端口号使用 16 比特表示&#xff0c;取值范围是 0 ~ 65535&#xff0c;端口号分为以…