基于Bregman的交替方向乘子法

目录标题


基于Bregman的交替方向乘子法(Bregman Alternating Direction Method of Multipliers,简称Bregman ADMM)是一种优化算法,结合了Bregman散度和交替方向乘子法(ADMM)的思想,用于解决一些复杂的优化问题,尤其是具有约束的最优化问题。它广泛应用于稀疏信号恢复、图像处理、机器学习等领域。

ADMM方法简介

ADMM是一种分裂算法,它通过将原问题分解为多个较容易处理的子问题来进行求解,通常包括以下几个步骤:

  1. 原始问题分解:将原问题转化为多个子问题,使得每个子问题可以通过优化一个变量来求解。
  2. 交替更新:交替更新各个变量,同时通过乘子法确保子问题的约束得到满足。

Bregman散度

Bregman散度是一种度量两点间差异的函数,通常用于替代传统的欧氏距离。与传统的距离度量不同,Bregman散度并不对称,并且其定义依赖于一个特定的凸函数。对于两个点 x x x y y y,Bregman散度定义为:

D ϕ ( x , y ) = ϕ ( x ) − ϕ ( y ) − ⟨ ∇ ϕ ( y ) , x − y ⟩ D_\phi(x, y) = \phi(x) - \phi(y) - \langle \nabla \phi(y), x - y \rangle Dϕ(x,y)=ϕ(x)ϕ(y)ϕ(y),xy

其中, ϕ \phi ϕ 是一个凸函数, ∇ ϕ ( y ) \nabla \phi(y) ϕ(y) 是函数 ϕ \phi ϕ 在点 y y y 处的梯度。

Bregman ADMM的原理

Bregman ADMM结合了Bregman散度和ADMM的思想,通过在更新过程中引入Bregman散度来代替传统的欧氏距离度量。具体来说,Bregman ADMM方法通过以下步骤来进行迭代更新:

  1. 原问题分解:将原优化问题转化为多个子问题。
  2. Bregman散度引入:在每个子问题的约束和目标函数中引入Bregman散度,用于度量解之间的差异。这可以帮助克服传统ADMM在某些优化问题上的收敛问题。
  3. 交替更新:在每次迭代中,交替优化每个子问题,并更新相应的乘子。通过引入Bregman散度,能够更有效地处理复杂的非线性约束。

主要优势

  • 收敛性:引入Bregman散度可以增强ADMM在处理某些问题时的收敛性,特别是在解空间非欧几里得时。
  • 灵活性:通过选择合适的Bregman散度函数,可以针对不同的优化问题进行调整,适应更多类型的约束和目标函数。
  • 适用范围广:能够应用于许多高维、稀疏或非线性优化问题,尤其适用于图像恢复、机器学习等领域。

总结来说,Bregman ADMM通过引入Bregman散度改进了经典ADMM算法,使其在处理具有复杂约束和目标函数的优化问题时更加高效和稳定。

代码示例:

# time: 2024/12/26 10:24
# author: YanJP
import numpy as np
import matplotlib.pyplot as pltdef objective_function(A, b, x, lambda_val):"""计算目标函数 f(x) = (1/2) * ||Ax - b||_2^2 + lambda * ||x||_1"""return 0.5 * np.linalg.norm(A @ x - b) ** 2 + lambda_val * np.linalg.norm(x, 1)def bregman_admm(A, b, lambda_val, max_iter=100, tol=1e-6):"""基于Bregman散度的ADMM求解L1正则化的线性回归问题目标: min_x  (1/2) * ||Ax - b||_2^2 + lambda * ||x||_1参数:- A: 输入矩阵 (m, n)- b: 输入向量 (m,)- lambda_val: 正则化参数- max_iter: 最大迭代次数- tol: 收敛阈值返回:- x: 最优解- iterates: 每次迭代的目标函数值,用于可视化"""# 初始化m, n = A.shapex = np.zeros(n)  # 原始变量z = np.zeros(n)  # 辅助变量y = np.zeros(n)  # 对偶变量# 用于记录每次迭代的目标函数值objective_values = []# 计算A的转置At = A.Txs=[]# 迭代求解for i in range(max_iter):# 更新xx_new = np.linalg.inv(A.T @ A + np.eye(n)) @ (A.T @ b + z - y)xs.append(np.copy(x_new))# 更新z(通过soft-thresholding实现L1正则化)z_new = np.sign(x_new + y) * np.maximum(np.abs(x_new + y) - lambda_val, 0)# 更新对偶变量yy_new = y + (x_new - z_new)# 记录目标函数值objective_values.append(objective_function(A, b, x_new, lambda_val))# 判断收敛性if np.linalg.norm(x_new - x) < tol and np.linalg.norm(z_new - z) < tol:print(f"Converged at iteration {i + 1}")break# 更新变量x, z, y = x_new, z_new, y_newreturn xs, objective_values# 示例数据
np.random.seed(0)
m, n = 100, 200
A = np.random.randn(m, n)  # 随机生成一个矩阵A
b = np.random.randn(m)  # 随机生成一个向量b
lambda_val = 0.5  # 设置L1正则化参数# 使用Bregman ADMM求解问题并获取目标函数的值
x_opt, objective_values = bregman_admm(A, b, lambda_val)# 可视化目标函数值的变化
iterations = range(len(objective_values))
plt.figure(figsize=(12, 6))
# 绘制x的变化
plt.subplot(1, 2, 1)
plt.plot(iterations, [np.linalg.norm(x) for x in x_opt], label='||x||')
plt.xlabel('Iteration')
plt.ylabel('||x||')
plt.title('Convergence of ||x||')
plt.grid(True)# 绘制目标函数值的变化
plt.subplot(1, 2, 2)
plt.plot(iterations, objective_values, label='Objective Function Value')
plt.xlabel('Iteration')
plt.ylabel('Objective Function Value')
plt.title('Objective Function Value vs Iterations')
plt.grid(True)
plt.legend()
plt.show()# 输出最优解
print("最优解x:", x_opt[-1])# -------上面是非bregman Admm算法,和下面可以对比看,基于Bregman的Admm目标函数收敛更快-----------------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as pltdef bregman_divergence(x, z):"""计算Bregman散度 D_phi(x, z),这里使用的是一个简单的二次Bregman散度。例如,可以选择phi(x) = 1/2 * ||x||_2^2。"""return 0.5 * np.linalg.norm(x - z) ** 2def objective_function_with_bregman(A, b, x, lambda_val, z):"""计算目标函数 f(x) = D_phi(x, z) + lambda * ||x||_1这里使用的D_phi是Bregman散度。"""return bregman_divergence(x, z) + lambda_val * np.linalg.norm(x, 1) + 0.5 * np.linalg.norm(A @ x - b) ** 2def bregman_admm(A, b, lambda_val, max_iter=100, tol=1e-6):"""基于Bregman散度的ADMM求解L1正则化的线性回归问题目标: min_x  (1/2) * ||Ax - b||_2^2 + lambda * ||x||_1使用Bregman散度来优化。参数:- A: 输入矩阵 (m, n)- b: 输入向量 (m,)- lambda_val: 正则化参数- max_iter: 最大迭代次数- tol: 收敛阈值返回:- x: 最优解- iterates: 每次迭代的目标函数值,用于可视化"""# 初始化m, n = A.shapex = np.zeros(n)  # 原始变量z = np.zeros(n)  # 辅助变量y = np.zeros(n)  # 对偶变量# 用于记录每次迭代的目标函数值objective_values = []# 迭代求解for i in range(max_iter):# 更新xx_new = np.linalg.inv(A.T @ A + np.eye(n)) @ (A.T @ b + z - y)# 更新z(通过soft-thresholding实现L1正则化)z_new = np.sign(x_new + y) * np.maximum(np.abs(x_new + y) - lambda_val, 0)# 更新对偶变量yy_new = y + (x_new - z_new)# 记录目标函数值(包含Bregman散度)objective_values.append(objective_function_with_bregman(A, b, x_new, lambda_val, z_new))# 判断收敛性if np.linalg.norm(x_new - x) < tol and np.linalg.norm(z_new - z) < tol:print(f"Converged at iteration {i + 1}")break# 更新变量x, z, y = x_new, z_new, y_newreturn x, objective_values# 示例数据
np.random.seed(0)
m, n = 100, 200
A = np.random.randn(m, n)  # 随机生成一个矩阵A
b = np.random.randn(m)  # 随机生成一个向量b
lambda_val = 0.1  # 设置L1正则化参数# 使用Bregman ADMM求解问题并获取目标函数的值
x_opt, objective_values = bregman_admm(A, b, lambda_val)# 可视化目标函数值的变化
iterations = range(len(objective_values))# 绘制目标函数值的变化
plt.figure(figsize=(8, 6))
plt.plot(iterations, objective_values, label='Objective Function Value')
plt.xlabel('Iteration')
plt.ylabel('Objective Function Value')
plt.title('Objective Function Value vs Iterations (Bregman ADMM)')
plt.grid(True)
plt.legend()
plt.show()# 输出最优解
print("最优解x:", x_opt)

在这里插入图片描述

  • 左图为普通ADMM算法,右图为基于Bregman散度的ADMM算法。

表达式 ⟨ ∇ ϕ ( z ) , x − z ⟩ \langle \nabla \phi(z), x - z \rangle ϕ(z),xz内积(dot product)形式,其中 ∇ ϕ ( z ) \nabla \phi(z) ϕ(z) 是函数 ϕ \phi ϕ 在点 z z z 处的梯度,而 x − z x - z xz 是向量 x x x z z z 之间的差。

具体来说,这个内积项是 Bregman 散度公式的一部分,Bregman 散度 D ϕ ( x , z ) D_{\phi}(x, z) Dϕ(x,z) 用于度量点 x x x z z z 之间的“距离”,它定义为:

D ϕ ( x , z ) = ϕ ( x ) − ϕ ( z ) − ⟨ ∇ ϕ ( z ) , x − z ⟩ D_{\phi}(x, z) = \phi(x) - \phi(z) - \langle \nabla \phi(z), x - z \rangle Dϕ(x,z)=ϕ(x)ϕ(z)ϕ(z),xz

各个符号的解释:

- ϕ ( x ) \phi(x) ϕ(x) ϕ ( z ) \phi(z) ϕ(z) 是函数 ϕ \phi ϕ 在点 x x x z z z 处的值。
- ∇ ϕ ( z ) \nabla \phi(z) ϕ(z) 是函数 ϕ \phi ϕ 在点 z z z 处的梯度向量。
- ⟨ ⋅ , ⋅ ⟩ \langle \cdot, \cdot \rangle , 表示内积操作,具体为向量的乘积和,即 ⟨ ∇ ϕ ( z ) , x − z ⟩ = ∑ i = 1 n ∇ ϕ ( z ) i ( x i − z i ) \langle \nabla \phi(z), x - z \rangle = \sum_{i=1}^{n} \nabla \phi(z)_i (x_i - z_i) ϕ(z),xz=i=1nϕ(z)i(xizi)

梯度的几何含义

- ∇ ϕ ( z ) \nabla \phi(z) ϕ(z) 是函数 ϕ \phi ϕ 在点 z z z 处的梯度,它表示 ϕ \phi ϕ 在该点的最速上升方向。梯度告诉我们,在点 z z z 处,如何沿着各坐标轴的方向变化来最速地增加 ϕ ( z ) \phi(z) ϕ(z) 的值。
- x − z x - z xz 是从点 z z z 到点 x x x 的向量,表示两点之间的差距。

因此,内积 ⟨ ∇ ϕ ( z ) , x − z ⟩ \langle \nabla \phi(z), x - z \rangle ϕ(z),xz 可以看作是 在梯度方向上, x x x z z z 之间的“投影”,即梯度方向上, x x x 相对 z z z 的变化量。

具体数学公式:

如果我们以欧几里得空间中的标准内积为例(假设 ∇ ϕ ( z ) \nabla \phi(z) ϕ(z) x − z x - z xz 是向量),则内积的具体形式为:
⟨ ∇ ϕ ( z ) , x − z ⟩ = ∑ i = 1 n ∇ ϕ ( z ) i ( x i − z i ) \langle \nabla \phi(z), x - z \rangle = \sum_{i=1}^{n} \nabla \phi(z)_i (x_i - z_i) ϕ(z),xz=i=1nϕ(z)i(xizi)
这里, ∇ ϕ ( z ) i \nabla \phi(z)_i ϕ(z)i 是梯度向量 ∇ ϕ ( z ) \nabla \phi(z) ϕ(z) 在第 i i i 维的分量, x i x_i xi z i z_i zi 分别是向量 x x x z z z 在第 i i i 维的分量。

应用示例

对于常见的函数 ϕ ( x ) = 1 2 ∥ x ∥ 2 2 \phi(x) = \frac{1}{2} \|x\|_2^2 ϕ(x)=21x22(即欧几里得范数的平方),它的梯度为:
∇ ϕ ( x ) = x \nabla \phi(x) = x ϕ(x)=x
因此,对于这个特定的 ϕ ( x ) \phi(x) ϕ(x),Bregman 散度的计算公式就变成了:
D ϕ ( x , z ) = 1 2 ∥ x ∥ 2 2 − 1 2 ∥ z ∥ 2 2 − ⟨ z , x − z ⟩ = 1 2 ∥ x − z ∥ 2 2 D_{\phi}(x, z) = \frac{1}{2} \|x\|_2^2 - \frac{1}{2} \|z\|_2^2 - \langle z, x - z \rangle = \frac{1}{2} \|x - z\|_2^2 Dϕ(x,z)=21x2221z22z,xz=21xz22
这就是传统的欧几里得距离的平方。

但如果选择不同的 ϕ ( x ) \phi(x) ϕ(x)(例如 ϕ ( x ) = ∥ x ∥ 1 \phi(x) = \|x\|_1 ϕ(x)=x1,即 L 1 L_1 L1 范数),则 ∇ ϕ ( x ) \nabla \phi(x) ϕ(x) 会有所不同,导致 Bregman 散度的形式和性质发生变化。这也是 Bregman 散度的一个重要特点:它依赖于所选择的函数 ϕ \phi ϕ,因此在不同情形下,Bregman 散度能够提供更为灵活的度量方式。

总结:
⟨ ∇ ϕ ( z ) , x − z ⟩ \langle \nabla \phi(z), x - z \rangle ϕ(z),xz
是一个内积,它表示梯度 ∇ ϕ ( z ) \nabla \phi(z) ϕ(z) x − z x - z xz 之间的投影关系,在Bregman散度中用来衡量从点 z z z 向点 x x x 的偏移。

在**ADMM(Alternating Direction Method of Multipliers)**中,变量 x x x, y y y, 和 z z z 扮演了不同的角色,它们之间的联系和交互是ADMM成功应用的核心。在Bregman ADMM中,这些变量的关系可能会稍有变化,但整体框架大致保持一致。下面我会详细介绍它们在标准ADMM中的作用及其相互关系。

ADMM的标准形式:

考虑如下的优化问题:
min ⁡ x , z f ( x ) + g ( z ) \min_{x, z} \, f(x) + g(z) x,zminf(x)+g(z)
受制于线性约束:
A x + B z = c Ax + Bz = c Ax+Bz=c

其中, f ( x ) f(x) f(x) g ( z ) g(z) g(z) 是关于 x x x z z z 的凸函数, A A A, B B B 是矩阵, c c c 是常数向量。这个问题可以通过交替方向法来分解成两个子问题,每个子问题分别涉及到 x x x z z z 的优化。

ADMM中的变量角色:

  1. 原始变量 x x x

    • x x x 是优化问题中的原始变量,通常是我们关心的决策变量。
    • 在每次迭代中, x x x 需要通过优化 f ( x ) f(x) f(x) 来更新。
  2. 辅助变量 z z z

    • z z z 是为了引入额外约束而引入的辅助变量。
    • 在标准ADMM中, z z z 通常和 x x x 之间有某种约束(例如, A x + B z = c Ax + Bz = c Ax+Bz=c)。
    • 在每次迭代中, z z z 通过优化 g ( z ) g(z) g(z) 来更新。
  3. 对偶变量 y y y

    • y y y 是对偶变量,代表约束 A x + B z = c Ax + Bz = c Ax+Bz=c 的松弛程度。它是ADMM的关键,因为它允许我们分离出原始变量 x x x z z z 的更新,从而使问题可以交替求解。
    • y y y 是通过调整约束的违反程度来不断调整 x x x z z z 之间的关系。

ADMM中的更新步骤与变量之间的联系:

1. 更新原始变量 x x x

在每次迭代中,我们首先优化关于 x x x 的目标函数。由于我们正在考虑约束 A x + B z = c Ax + Bz = c Ax+Bz=c,优化步骤需要通过对约束条件进行考虑来更新 x x x

更新规则如下:
x k + 1 = arg ⁡ min ⁡ x ( f ( x ) + ρ 2 ∥ A x + B z k − c + y k ρ ∥ 2 ) x^{k+1} = \arg\min_{x} \left( f(x) + \frac{\rho}{2} \|Ax + Bz^k - c + \frac{y^k}{\rho}\|^2 \right) xk+1=argxmin(f(x)+2ρAx+Bzkc+ρyk2)
这里的目标函数除了包含原始目标函数 f ( x ) f(x) f(x) 外,还包括一个关于约束 A x + B z = c Ax + Bz = c Ax+Bz=c 的惩罚项,惩罚项的强度由对偶变量 y y y 和超参数 ρ \rho ρ(ADMM的步长参数)决定。

  • 在这一更新步骤中, y k y^k yk ρ \rho ρ 控制着原始变量 x x x 如何受约束条件的影响。
  • 更新后的 x k + 1 x^{k+1} xk+1 是根据当前 z k z^k zk 和对偶变量 y k y^k yk 更新的。
2. 更新辅助变量 z z z

更新 z z z 的过程实际上是解决一个涉及到 g ( z ) g(z) g(z) 的优化问题。这个问题通常是L1正则化或类似的形式,需要对 x k + 1 x^{k+1} xk+1 进行约束处理。

更新规则如下:
z k + 1 = arg ⁡ min ⁡ z ( g ( z ) + ρ 2 ∥ A x k + 1 + B z − c + y k ρ ∥ 2 ) z^{k+1} = \arg\min_{z} \left( g(z) + \frac{\rho}{2} \|Ax^{k+1} + Bz - c + \frac{y^k}{\rho}\|^2 \right) zk+1=argzmin(g(z)+2ρAxk+1+Bzc+ρyk2)

  • 这个步骤确保了 z z z 的更新遵循优化目标中的约束 A x + B z = c Ax + Bz = c Ax+Bz=c
  • 类似地, y k y^k yk ρ \rho ρ 在这里的作用是通过对偶变量来调整 z z z 的值。
3. 更新对偶变量 y y y

对偶变量 y y y 的更新是基于约束的违反程度。它通过惩罚项来调整 x x x z z z 之间的关系,以确保约束 A x + B z = c Ax + Bz = c Ax+Bz=c 被更好地满足。

更新规则如下:
y k + 1 = y k + ρ ( A x k + 1 + B z k + 1 − c ) y^{k+1} = y^k + \rho (Ax^{k+1} + Bz^{k+1} - c) yk+1=yk+ρ(Axk+1+Bzk+1c)

  • 在这个步骤中, y k + 1 y^{k+1} yk+1 会增加或减少,以反映约束 A x + B z = c Ax + Bz = c Ax+Bz=c 的违反程度。
  • 当约束得到满足时, y y y 会收敛到一个稳定值。

变量之间的相互关系:

  1. x x x z z z 的关系

    • 在ADMM中, x x x z z z 之间的关系由约束 A x + B z = c Ax + Bz = c Ax+Bz=c 决定。在每次迭代中, x x x z z z 需要交替更新,通过各自的优化步骤逐步逼近满足约束条件的解。
    • 通过ADMM的交替优化, x x x z z z 会逐渐收敛于一个一致的解,使得约束得以满足。
  2. x x x y y y 的关系

    • 对偶变量 y y y 是用来惩罚约束的违反的。在每次迭代中, y y y 根据 x x x z z z 之间的差距(即约束的松弛程度)进行更新。特别地,如果约束没有得到满足, y y y 会被调整,以推动 x x x z z z 靠近约束。
    • 这种调整机制使得 y y y 成为推动优化过程中的一个重要因素,它与 x x x z z z 的变化紧密相关。
  3. z z z y y y 的关系

    • 对偶变量 y y y 的更新也会影响 z z z,因为 y y y 调整的是 x x x z z z 之间的约束误差。如果 x x x z z z 之间存在较大的差异(即约束未被很好地满足),那么 y y y 会相应地增加,从而推动 z z z 发生调整。
    • 通过不断调整 y y y,ADMM确保了 x x x z z z 能够逐步收敛到一个满足约束条件的解。

总结:

  • x x x 是优化问题中的原始变量,代表我们优化的核心目标。
  • z z z 是辅助变量,通常引入约束关系,并在ADMM中与 x x x 一起被更新,以满足约束条件。
  • y y y 是对偶变量,负责惩罚约束的违反,并通过调整 x x x z z z 之间的关系来推动它们收敛。

这些变量在每一轮迭代中交替更新,从而使得原始问题的解逐步得到改进。ADMM通过这种交替优化机制,能高效地解决约束优化问题,尤其是涉及到大规模和非光滑正则化项(如L1正则化)的问题。

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

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

相关文章

【操作系统】课程 3进程同步与通信 同步测练 章节测验

3.1知识点导图 无 3.2进程同步与互斥 【本章学习目标】 &#xff08;1&#xff09;了解进程通信的机制和通信方式。 &#xff08;2&#xff09;理解多道程序环境下进程间通信的机制&#xff1b;消息传递系统的实现。 &#xff08;3&#xff09;掌握临界资源和临界区的概念…

React中最优雅的异步请求

给大家分享在React19中使用useSuspense处理异步请求为什么是被认为最优雅的解决方案 一. 传统方案 解决异步请求的方案中&#xff0c;我们要处理至少两个最基本的逻辑 正常的数据显示数据加载的UI状态 例如&#xff1a; export default function Index(){const [content, …

《机器视觉:开启智能新时代》

《机器视觉&#xff1a;开启智能新时代》 一、机器视觉&#xff1a;工业之眼的崛起二、核心组件&#xff1a;构建精准视觉系统&#xff08;一&#xff09;光源&#xff1a;照亮视界的画笔&#xff08;二&#xff09;镜头&#xff1a;聚焦精准的慧眼&#xff08;三&#xff09;相…

STM32F103RCT6学习之四:定时器

1.基础 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff0c;而且还包含内外时钟源选择、输入捕获、…

3DMAX镂空星花球建模插件FloralStarBall使用方法

3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模&#xff0c;再也不用手动做了&#xff0c;使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成&#xff01; 3DMAX镂空星花球建模插件FloralStarBall&#xff0c;经典星形球体的美丽变体。星形…

Nginx区分PC端和移动端访问

在使用Nginx时&#xff0c;可以通过$http_user_agent变量来判断用户访问的客户端类型&#xff0c;从而提供不同的内容或服务。下面是一个基于$http_user_agent变量来判断是否为PC访问的Nginx配置示例。 1. 理解$http_user_agent变量的含义及其在Nginx中的用途 $http_user_agen…

Jmeter快速入门

目录 1.安装Jmeter 1.1.下载 1.2.解压 1.3.运行 2.快速入门 2.1.设置中文语言 2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载&#xff0c;地址…

Ftrans数据摆渡系统 搭建安全便捷跨网文件传输通道

一、专业数据摆渡系统对企业的意义 专业的数据摆渡系统对企业具有重要意义&#xff0c;主要体现在以下几个方面‌&#xff1a; 1、‌数据安全性‌&#xff1a;数据摆渡系统通过加密传输、访问控制和审计日志等功能&#xff0c;确保数据在传输和存储过程中的安全性。 2、‌高…

Jupyter在运行上出现错误:ModuleNotFoundError: No module named ‘wordcloud‘

问题分析&#xff1a;显示Jupyter未安装这个模板 解决办法&#xff1a;在单元格内输入&#xff1a;!pip install wordcloud

JS媒体查询之matchMedia API 实现跟随系统主题色切换效果

&#x1f4ca;写在前面 在网页设计中&#xff0c;跟随系统主题切换可以通过CSS和JavaScript实现。可以通过定义两套CSS变量&#xff0c;根据系统主题的颜色来切换变量的生效&#xff0c;从而实现不同主题下的页面样式变化。 例如&#xff0c;可以使用媒体查询API来获取系统主题…

PageRank Web页面分级算法 HNUST【数据分析技术】(2025)

1.理论知识 算法原理PageRank 通过网络浩瀚的超链接关系来确定一个页面的等级。 Google 把从 A 页面到 B 页面的链接解释为A页面给B页面投票&#xff0c; Google 根据投票来源&#xff08;甚至来源的来源&#xff0c; 即链接到A页面的页面&#xff09;和投票目标的等级来决定新…

OTA场景使用mbed TLS 进行 MD5 校验

应用场景&#xff1a; OTA或者IAP等升级场景&#xff0c;或者数据传输过程中的文件校验. 在使用 mbed TLS 进行 MD5 校验时&#xff0c;首先需要理解 MD5 是一种哈希算法&#xff0c;用于生成一个 128 位&#xff08;16 字节&#xff09;的哈希值&#xff0c;通常用于校验数据…

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]

Gin 是一个用 Go 语言编写的 HTTP Web 框架&#xff0c;以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能&#xff0c;使得开发者可以轻松地定义 URL 路由规则&#xff0c;并将这些规则映射到具体的处理函数&#xff08;handler&#xff09;。以下是关于 Gin 路由的…

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子&#xff0c;没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子&#xff0c;我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

[江科大STM32] 第五集STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 再添加一些文件&#xff0c;自己看路径 然后去 复习这三文件 打开KEIL add existing那个&#xff0c;添加已经存在的文件 还有5个.c.h文件也要添加进来 回到KEIL 点击旁边的settings 如果你用寄存器开发就建到这里就可…

目标检测,语义分割标注工具--labelimg labelme

1 labelimg labelimg可以用来标注目标检测的数据集&#xff0c; 提供多种格式的输出&#xff0c; 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单&#xff0c; 不做过细的介绍&#xff0…

沪深300股指期货一点多少钱?

首先&#xff0c;我们得知道什么是沪深300股指期货。简单来说&#xff0c;它就是一种期货合约&#xff0c;这个合约的“价格”是根据沪深300指数的点数来定的。沪深300指数是由上海和深圳两个交易所里300只最大的股票组成的一个指数&#xff0c;代表了整个股市的大体走势。 沪…

kettle经验篇:Pentaho Repository 类型资源库卡顿问题

2024年马上就结束了&#xff0c;终于在结束前解决了困扰许久的一个问题&#xff1a;kettle的Pentaho Repository 资源库异常卡顿。所以在此也梳理、记录下2024年的最后一个大问题。 项目场景 工作中一个重要内容是数据中心项目&#xff0c;也就必不可少的要用到ETL技术&#x…

工具变量笔记

补充知识 简单介绍工具变量 假设 Y i α β D i ϵ i Y_i\alpha\beta D_i\epsilon_i Yi​αβDi​ϵi​, where E ( ϵ i ∣ D i ) 0 E(\epsilon_i\mid D_i)0 E(ϵi​∣Di​)0. 但是通常这个条件不满足。于是假如有这样一个工具变量 Z i Z_i Zi​存在的话&#xff0c;满…

简易CPU设计入门:本系统中的通用寄存器(五)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff0c;我…