基于Bregman的交替方向乘子法

news2025/1/2 22:40:56

目录标题


基于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 plt


def 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.shape
    x = np.zeros(n)  # 原始变量
    z = np.zeros(n)  # 辅助变量
    y = np.zeros(n)  # 对偶变量

    # 用于记录每次迭代的目标函数值
    objective_values = []

    # 计算A的转置
    At = A.T
    xs=[]
    # 迭代求解
    for i in range(max_iter):
        # 更新x
        x_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)

        # 更新对偶变量y
        y_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_new

    return 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 plt


def 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) ** 2


def 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) ** 2


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
    使用Bregman散度来优化。

    参数:
    - A: 输入矩阵 (m, n)
    - b: 输入向量 (m,)
    - lambda_val: 正则化参数
    - max_iter: 最大迭代次数
    - tol: 收敛阈值

    返回:
    - x: 最优解
    - iterates: 每次迭代的目标函数值,用于可视化
    """

    # 初始化
    m, n = A.shape
    x = np.zeros(n)  # 原始变量
    z = np.zeros(n)  # 辅助变量
    y = np.zeros(n)  # 对偶变量

    # 用于记录每次迭代的目标函数值
    objective_values = []

    # 迭代求解
    for i in range(max_iter):
        # 更新x
        x_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)

        # 更新对偶变量y
        y_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_new

    return 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.coloradmin.cn/o/2267433.html

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

相关文章

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串&#xff1f;2、两个引号之间加上空格 好的&#xff0c;我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别&#xff0c;以及它们在 SQL 查询中的作用&#xff1a; 1. we_chat_union_id IS NOT NULL 含…

随机变量是一个函数-如何理解

文章目录 一. 随机变量二. 随机变量是一个函数-栗子(一对一)1. 掷骰子的随机变量2. 掷骰子的随机变量&#xff08;求点数平方&#xff09;3. 抛硬币的随机变量4. 学生考试得分的随机变量 三. 随机变量是一个函数-理解(多对一) 一. 随机变量 随机变量就是定义在样本空间上的函数…

jwt在express中token的加密解密实现方法

在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后&#xff0c;今天来详细学习一下token是如何生成的&#xff0c;secret密钥的加密解密过程是怎么样的。 安装依赖 express&#xff1a;用于创建服务器jsonwebtoken&#xff1a;用于生成和验证JWTbody-parser&#xff1…

大厂开发规范-如何规范的提交Git

多人协作开发提交代码通常是遵循约定式提交规范&#xff0c;如果严格安照约定式提交规范&#xff0c; 手动进行代码提交的话&#xff0c;那么是一件非常痛苦的事情&#xff0c;但是 Git 提交规范的处理又势在必行&#xff0c;那么怎么办呢&#xff1f; 经过了很多人的冥思苦想…

企业安装加密软件有什么好处?

加密软件为企业的安全提供了很多便利&#xff0c;从以下几点我们看看比较重要的几个优点&#xff1a; 1、数据保护&#xff1a;企业通常拥有大量的商业机密、客户数据、技术文档等敏感信息。加密软件可以对这些信息进行加密处理&#xff0c;防止未经授权的人员访问。即使数据被…

【ANGULAR网站开发】初始环境搭建

1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs&#xff0c;这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…

Python 屏幕取色工具

Python 屏幕取色工具 1.简介&#xff1a; 屏幕取色小工具‌是一种实用的软件工具&#xff0c;主要用于从屏幕上精确获取颜色值&#xff0c;非常适合设计、编程等需要精确配色的领域。这类工具通常能够从屏幕上任何区域精确提取颜色值&#xff0c;支持在整数值、RGB值、BGR值之…

宏集eX710物联网工控屏在石油开采机械中的应用与优势

案例概况 客户&#xff1a;天津某石油机械公司 应用产品&#xff1a;宏集eX710物联网工控屏 应用场景&#xff1a;钻井平台设备控制系统 一、应用背景 石油开采和生产过程复杂&#xff0c;涵盖钻井平台、采油设备、压缩机、分离器、管道输送系统等多种机械设备。这些设备通…

实验室服务器Ubuntu安装使用全流程

一、制作U盘启动盘 工具&#xff1a; 一个32G以上的U盘Rufuse镜像烧录软件下载&#xff1a;https://cn.ultraiso.net/xiazai.htmlRufus - 轻松创建 USB 启动盘https://cn.ultraiso.net/xiazai.htmlUbuntu系统镜像&#xff1a;https://ubuntu.com/download/alternative-downlo…

2-198基于Matlab-GUI的运动物体追击问题

基于Matlab-GUI的运动物体追击问题&#xff0c;定义目标航速、航线方向、鱼雷速度&#xff0c;并设置目标和鱼雷初始位置&#xff0c;根据航速和航向优化鱼雷路径&#xff0c;实现精准打击。程序已调通&#xff0c;可直接运行。 2-198基于Matlab-GUI的运动物体追击问题

实验五 时序逻辑电路部件实验

一、实验目的 熟悉常用的时序逻辑电路功能部件&#xff0c;掌握计数器、了解寄存器的功能。 二、实验所用器件和仪表 1、双 D触发器 74LS74 2片 2、74LS162 1片 3、74194 1片 4、LH-D4实验仪 1台 1.双…

UnityURP 自定义PostProcess之深度图应用

UnityURP 自定义PostProcess之深度图 前言项目Shader代码获取深度图ASE连线获取深度图 前言 在Unity URP中利用深度图可以实现以下两种简单的效果&#xff0c;其他设置参考 UnityURP 自定义PostProcess 项目 Shader代码获取深度图 Shader "CustomPost/URPScreenTintSha…

PlasmidFinder:质粒复制子的鉴定和分型

质粒&#xff08;Plasmid&#xff09;是一种细菌染色体外的线性或环状DNA分子&#xff0c;也是一种重要的遗传元素&#xff0c;它们具有自主复制能力&#xff0c;可以在细菌之间传播&#xff0c;并携带多种重要的基因(如耐药基因与毒力基因等)功能。根据质粒传播的特性&#xf…

mongodb(6.0.15)安装注意事项,重装系统后数据恢复

window10系统 上周重装了系统&#xff0c;环境变量之类的都没有了。现在要恢复。 我电脑里之前的安装包没有删除&#xff08;虽然之前也没在C盘安装&#xff0c;但是找不到了&#xff0c;所以需要重新下载安装&#xff09;&#xff0c;长下图这样。这个不是最新版本&#xff0…

【AI学习】DeepSeek-V3 技术报告学习:总体架构

翻了一下DeepSeek-V3 技术报告学习&#xff0c;太长&#xff0c;只是大概翻了一下&#xff0c;其中Multi-Token Prediction的技术就很亮眼。 摘要 本文介绍了DeepSeek-V3&#xff0c;这是一个拥有671B总参数的强大混合专家&#xff08;MoE&#xff09;语言模型&#xff0c;每…

b站ip属地评论和主页不一样怎么回事

在浏览B站时&#xff0c;细心的用户可能会发现一个有趣的现象&#xff1a;某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测&#xff0c;究竟是什么原因导致了这种情况的发生呢&#xff1f;本文将对此进行深入解析&#xff0c;帮助大家揭开这一…

Java中三大构建工具的发展历程(Ant、Maven和Gradle)

&#x1f438; 背景 我们要写一个Java程序&#xff0c;一般的步骤是编译&#xff0c;测试&#xff0c;打包。 这个构建的过程&#xff0c;如果文件比较少&#xff0c;我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大&#xff0c;文件越来越多&#xff0c…

Wend看源码-Java-Map学习

摘要 在当今的编程世界中&#xff0c;深入了解各类数据类型对于开发者而言至关重要。本篇聚焦于 JDK 21 版本下&#xff0c;Java.util 包所提供的 Map 类型。Map 作为一种关键的数据结构&#xff0c;能够以键值对的形式高效存储和检索数据&#xff0c;广泛应用于众多领域。 本文…

uniapp开发微信小程序实现获取“我的位置”

1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…

如何使用 Firewalld 设置 Linux 防火墙

简介 在 Linux 中&#xff0c;防火墙是一个应用程序或服务&#xff0c;它使用预定的规则集来过滤或控制进出 Linux 服务器的网络流量。通常将防火墙配置为允许所需的流量通过&#xff0c;同时阻止其余的外部流量。 Firewalld 是一个用于 Linux 系统的防火墙管理解决方案。它是…