凸优化 3:最优化方法

凸优化 3:最优化方法

    • 最优化方法
      • 适用场景对比
      • 费马引理
      • 一阶优化算法
        • 梯度下降
        • 最速下降
      • 二阶优化算法
        • 牛顿法
          • Hessian矩阵
          • Hessian矩阵的逆
          • Hessian矩阵和梯度的区别
          • 牛顿法和梯度下降法的区别
        • 拟牛顿法
          • DFP、BFGS/L-BFGS
      • 数值优化算法
        • 坐标下降法
        • SMO算法
      • 基于导数的函数优化
        • 解析优化算法/精确解
        • 无约束问题-求解驻点方程
        • 有等式约束问题-拉格朗日乘数法
        • 有等式和不等式约束问题-KKT条件
      • 基于随机数函数优化
        • 启发式搜索
        • 遗传算法
        • 模拟退火
        • 蚁群优化
      • 多目标函数优化
      • 泛函优化
        • 欧拉-拉格朗日方程
        • 拉格朗日乘法

 


最优化方法

适用场景对比


各自适用的场景:

 


费马引理

  • 解决什么问题:寻找函数在某个区域内的局部极值点(最高点或最低点)。
  • 知识点:如果函数的导数在某点为零,并且该点是可导的,那么该点可能是一个局部极值点。
  • 应用:在实际问题中,例如经济学中的成本最小化或收益最大化问题,经常用到这个引理。
  • 特点:简单易用,但仅限于可导函数,并且导数为零的点不一定总是极值点。

为了找到函数的局部最小值,一阶导数(或梯度)等于零是极小值存在的必要条件,但不足以保证这是极小值点。

  • 等于零这意味着在该点,函数在所有方向上的变化率都为零,因此这个点可能是一个极小值点。

比如,线性回归模型:

  • 假设你有一个数据集,其中包含了一系列的点 (x, y),你的目标是找到一条直线,这条直线可以尽可能好地拟合这些点。
  • 这条直线的方程可以表示为 y = mx + b,其中 m 是斜率,b 是截距。
  • 你需要找到最佳的 mb 值,使得这条直线与所有数据点的总误差最小。
  • 这个误差通常用所有点的实际值与预测值之间差的平方和来衡量。

费马引理应用

  • 要最小化这个误差,我们可以利用费马引理。
  • 找到误差函数关于 mb 的导数,并将这些导数设置为零。
  • 这些点就是可能的极值点。

拆解步骤

  1. 定义误差函数:首先,定义一个误差函数(也称为损失函数),如均方误差函数。
  2. 计算导数:接下来,计算这个误差函数关于 mb 的导数。
  3. 设置导数为零:根据费马引理,我们知道极值点(在这个案例中是最小值点)可能出现在导数为零的位置。因此,我们将这些导数设置为零。
  4. 解方程:解出这些方程,找到 mb 的值。

在实际的机器学习实践中,我们通常使用算法(如梯度下降法)来自动进行这些计算和优化。

梯度下降法会迭代地调整 mb 的值,以逐步逼近导数为零的点。

局限性

  • 费马引理在这个案例中很有用,因为我们处理的是一个可导函数。
  • 但在某些更复杂的机器学习模型中,比如无法处理非可导函数(如某些类型的神经网络激活函数),就不能直接应用费马引理。
  • 在这些情况下,我们可能需要使用其他优化方法,如数值优化或基于随机数的方法。

费马引理在机器学习中的应用是通过找到损失函数的潜在极值点来优化模型参数,而这通常是通过计算导数并将其设置为零来实现的。
 


一阶优化算法

  • 解决什么问题:找到函数的最小值点。
  • 知识点:使用函数的一阶导数信息来确定下降方向。
  • 应用:广泛应用于机器学习中的参数优化,如神经网络的训练。
  • 特点:相比二阶优化算法,通常计算成本较低,但可能收敛速度较慢。
  • 一阶优化算法是初学者入门优化问题的好选择,因为它们较易于理解和实现。

一阶算法(如梯度下降和最速下降)主要依赖一阶导数,而二阶算法(如牛顿法和拟牛顿法)则进一步利用了二阶导数信息。

二阶算法通常更精确且收敛速度更快,但计算成本也更高,特别是在高维问题中。

 


梯度下降
  • 为解决什么问题:寻找函数的最小值点。
  • 知识点:利用目标函数的一阶导数(梯度)来确定下降方向。
  • 应用:在机器学习中调整模型参数以最小化损失函数。
  • 特点:实现简单,但可能会陷入局部最小值,收敛速度可能较慢。

假设你正在使用线性回归模型来预测房屋价格。

你的模型试图通过公式 y = mx + b(其中 y 是房屋价格,x 是房屋大小,mb 是模型参数)来拟合数据。

  • 为解决什么问题:你需要找到最佳的 mb 值,使得预测价格与实际价格之间的差异(损失)最小。
  • 梯度下降实现:你通过计算损失函数(如均方误差)相对于 mb 的梯度(即导数)来实现。梯度告诉你损失函数上升最快的方向。因此,你需要往梯度的相反方向调整 mb(因为你想最小化损失)。
  • 迭代过程:通过反复计算梯度并更新 mb,你的模型逐渐逼近损失函数的最小值。

这个过程很直观,但可能需要很多迭代才能找到最小值,尤其是在复杂的数据集上。

  • 如果要学习详细版,请猛击:https://blog.csdn.net/qq_41739364/article/details/113872421


 


最速下降
  • 为解决什么问题:在梯度下降基础上寻求最快的下降速度,以更快找到最小值点。
  • 知识点:在每一步中选择最优的步长(学习率)。
  • 应用:在需要快速收敛的优化问题中使用,比如某些数值计算问题。
  • 特点:可以更快收敛到最小值点,但需要适当的步长选择策略。

根据一系列特征来预测电子邮件是否为垃圾邮件。

  • 为解决什么问题:你需要找到一组模型参数,这组参数可以最大化分类准确性(或最小化分类错误)。
  • 最速下降实现:在最速下降法中,不仅计算损失函数相对于参数的梯度,还会在每次迭代时动态调整步长(学习率)。这意味着算法不仅关注方向(由梯度决定),还关注在这个方向上前进多远。
  • 选择步长:最优步长的选择通常通过一些额外的策略来确定,比如线搜索。目标是在每一步中尽可能大地减少损失。

最速下降法比普通梯度下降更快地接近最小值点,但需要谨慎选择步长,否则可能会越过最小值点或导致不稳定的收敛。

梯度下降注重于确定下降的方向,而最速下降则在此基础上进一步优化步长,以加快收敛速度。

 


二阶优化算法

  • 解决什么问题:更精确和快速地找到函数的最小值点。
  • 知识点:除了一阶导数,还利用了二阶导数(即曲率)信息。
  • 应用:在需要快速准确找到最优解的工程和科学计算中使用。
  • 特点:通常比一阶方法收敛更快,但计算二阶导数的成本较高。

二阶算法在处理复杂问题时非常有效,但在大规模问题上可能不太实用。

 


牛顿法
  • 为解决什么问题:更快地找到函数的最小值点,尤其是当函数的二阶导数可用时。
  • 知识点:使用函数的一阶和二阶导数信息。
  • 应用:用于参数较少的优化问题,因为二阶导数的计算成本高。
  • 特点:收敛速度快,但计算Hessian矩阵及其逆矩阵非常昂贵,特别是在高维问题中。

牛顿法是一种迭代算法,用于近似求解方程的根。

其基本思想是从一个初始估计值出发,通过泰勒近似和迭代不断逼近方程的实际解。

在迭代过程中,新的近似值 是通过当前近似值 减去 函数值与其导数 的比值得到的:

  • x_new = x_current - f(x_current) / f’(x_current)。

每次迭代都会使新的近似值更接近实际解。

以方程x^3 - 2x - 5 = 0为例,我们使用牛顿法来找到它的一个根。假设初始猜测为x0 = 2

  1. 第一次迭代:

    • 计算函数值: f(2) = 2^3 - 2*2 - 5 = -1
    • 计算导数值: f'(2) = 3*2^2 - 2 = 10
    • 更新x: x_new = 2 - (-1) / 10 = 2.1
  2. 第二次迭代:

    • x = 2.1开始。
    • 计算新的函数值和导数值。
    • 更新x

这个过程重复进行,每次迭代都会使x的值更接近方程的实际根。牛顿法的效率通常很高,特别是当初始猜测接近实际根时。

通过这种方式,我们可以逐渐逼近并最终找到满足方程的x的值。

在使用牛顿法进行迭代求根时,初始值的选择非常关键。

如果初始值选得不合适,可能导致求解过程失效。

例如,设想一个函数f(x),其导数在某点附近变化很快。

如果选取的初始点x0使得比值f(x0) / f'(x0)很大,那么每次迭代可能会在真实根附近摆动,而不是逐渐接近它。

例如,对于函数f(x) = x^2 - 2,如果选择x0 = -2作为初始点,迭代可能会在正负根之间摆动,而难以快速收敛到实际根sqrt(2)

正确选择初始点有助于加快收敛速度并避免无效迭代。
 


Hessian矩阵
  • 定义:这是一阶导数的进一步推广,形成了一个矩阵。它告诉我们函数在各个方向上的曲率,也就是变化的变化速度。

    具体来说,对于一个具有多个参数的函数,Hessian矩阵包含了这个函数关于这些参数的所有二阶偏导数。

    想象你在一座山上,Hessian矩阵就像是告诉你这个山在每个方向上的陡峭程度。

    对于机器学习中的优化问题,这就像是了解你的模型参数改变时,预测误差会如何变化。

    如果在某点这个矩阵是半正定的(所有特征值非负),那么这个点可能是极小值点。如果这个矩阵是正定的(所有特征值都是正的),这个点就是严格的局部极小值点。

Hessian矩阵的逆
  • 定义:Hessian矩阵的逆是这个矩阵的倒数,用于牛顿法中优化问题的解决方案。

    如果Hessian矩阵告诉你山的陡峭程度,那么它的逆就像是提供一种“调节器”,帮助你调整每一步的大小和方向,以便更有效地到达山谷(最小误差点)。

在机器学习中的应用

当你训练一个模型(比如线性回归或神经网络)时,你的目标是最小化一个损失函数,这个函数衡量了模型预测和实际值之间的差异。

  1. 使用Hessian矩阵

    • 在使用牛顿法进行优化时,Hessian矩阵提供了关于损失函数曲率的信息。这有助于更准确地确定如何调整模型参数,以更快地达到最小损失。
  2. 使用Hessian矩阵的逆

    • 牛顿法通过使用Hessian矩阵的逆来更新模型参数。这意味着它不仅考虑了损失函数的下降方向,还考虑了下降的步长,从而能更快地找到损失最小的点。

Hessian矩阵和它的逆在机器学习中的优化问题中非常重要,它们提供了关于如何调整模型参数以最小化损失函数的重要信息。

牛顿法等高级优化技术利用这些信息,以期更快速、更精确地找到最优解。

 

Hessian矩阵和梯度的区别

梯度和Hessian矩阵都提供了关于函数形状的重要信息,但它们关注的方面有所不同。

  1. 梯度

    • 类比:假设你站在山坡上,梯度就像是指南针,告诉你哪个方向是下山(或上山)最快的。
    • 在优化问题中:梯度(即一阶导数)告诉你目标函数(比如损失函数)在参数空间的每个点上增加或减少最快的方向。在梯度下降法中,你沿着梯度的反方向(即下降最快的方向)更新参数,以减少损失。
  2. Hessian矩阵

    • 类比:现在,你不仅知道下山的方向,而且通过Hessian矩阵,你还能知道走每一步时坡度的变化率,即这个方向的陡峭程度。
    • 在优化问题中:Hessian矩阵(即二阶导数矩阵)提供了关于目标函数在参数空间每个点的曲率(即弯曲程度)的信息。它告诉你,当你沿着某个方向移动时,梯度(或坡度)是如何变化的。

所以,区别在于:

  • 梯度提供了目标函数在每个点的最陡下降方向的信息。
  • Hessian矩阵提供了更多的信息,不仅是下降方向,还有在这些方向上梯度变化的速度(曲率),这有助于理解优化路径的局部“形状”。

在机器学习的优化问题中,使用梯度可以找到下降最快的方向,但不一定能提供最快到达最低点的路径。

而Hessian矩阵则可以提供更精确的信息,帮助更有效地调整步长和方向,尤其是在复杂的非线性问题中。

然而,计算Hessian矩阵和它的逆通常更为复杂和计算量更大,这是它的一个主要缺点。

 

牛顿法和梯度下降法的区别

牛顿法和梯度下降法都是迭代算法,但它们在更新参数、收敛速度和计算复杂度等方面有区别。

  1. 更新参数的方法

    • 梯度下降法:仅使用目标函数的一阶导数(梯度)。在每次迭代中,它沿着梯度的反方向(即下降最快的方向)更新参数,步长由学习率控制。简单来说,如果你站在山坡上,梯度下降法告诉你下一步往哪个方向走才能更快地下山。
    • 牛顿法:使用目标函数的一阶和二阶导数(Hessian矩阵)。它不仅考虑了方向,还考虑了步长。牛顿法试图通过考虑曲率来更精确地确定下一步的方向和大小。继续上面的比喻,牛顿法不仅告诉你下山的方向,还告诉你每一步应该迈多大,以便更快地到达山脚。
  2. 收敛速度

    • 梯度下降法:通常收敛较慢,尤其是在接近最小值点时。它需要更多的迭代次数来达到最优解。
    • 牛顿法:通常收敛速度更快,特别是当函数接近二次形式时。它能更快地接近最优解,但这取决于初始点的选择。
  3. 计算复杂度

    • 梯度下降法:计算相对简单,因为它只需要计算一阶导数。这使得它在处理大规模数据集时更加高效。
    • 牛顿法:计算更为复杂,需要计算二阶导数和逆Hessian矩阵,这在高维问题中可能非常昂贵。
  4. 对初始点的敏感度

    • 梯度下降法:对初始点比较敏感,不同的初始点可能导致不同的局部最优解。
    • 牛顿法:虽然理论上更快达到最优解,但它对初始点的选择也比较敏感,尤其是在目标函数非凸的情况下。

梯度下降法在处理大规模问题时更加高效和实用,尽管收敛速度较慢。

牛顿法在计算资源充足且问题规模较小的情况下可以更快地收敛,但计算成本和对初始点的敏感度较高。
 


拟牛顿法
  • 为解决什么问题:在无法直接计算或计算成本过高的情况下,近似牛顿法来找到最小值点。
  • 知识点:使用一阶导数信息来近似二阶导数。
  • 应用:适用于中到大规模的优化问题。
  • 特点:不需要计算二阶导数,计算效率高,但需要保证合适的近似。

牛顿法是一种改进的牛顿法,它不需要计算二阶导数(Hessian 矩阵)。

在训练一个神经网络时,拟牛顿法通过仅使用一阶导数信息来估计Hessian矩阵,这样可以减少计算量并加速训练过程,尤其在处理大型数据集时。
 


DFP、BFGS/L-BFGS
  • 为解决什么问题:提供了更高效的拟牛顿法变体。
  • 知识点:利用先前迭代的信息来更新近似的Hessian矩阵或其逆矩阵。
  • 应用:广泛应用于机器学习和大规模数值优化问题。
  • 特点:BFGS适用于中等规模问题,而L-BFGS(有限内存BFGS)适用于大规模问题。

DFP、BFGS 算法属于拟牛顿法的一种,使用一阶导数信息来逼近Hessian矩阵或其逆矩阵,从而避免了直接计算Hessian矩阵的高成本。

DFP和BFGS算法在每次迭代中更新Hessian矩阵的近似值,并使用这个近似值来更新参数。

它们在很多情况下能提供类似牛顿法的快速收敛,同时减少了计算复杂度。

L-BFGS是BFGS算法的一个变种,专为处理大规模优化问题设计。

与BFGS不同的是,L-BFGS不会存储整个近似的Hessian矩阵,而是只保存最近几步的更新信息。

这使得L-BFGS在内存使用上更加高效,特别适用于那些参数数量巨大的问题,例如大规模机器学习应用。
 


数值优化算法

  • 解决什么问题:当无法获得函数的解析解时,数值方法可以近似找到最优解。
  • 知识点:依赖数值方法和计算机迭代计算。
  • 应用:在解析解不可行或者难以求得时使用,如复杂的工程优化问题。
  • 特点:灵活性高,可以适用于各种复杂的优化问题,但可能需要大量的计算资源。

当解析方法不可行时,数值优化算法(如迭代近似求解、分治法)提供了一种替代方案。

这些方法适用于解析解难以求得或问题规模过大的情况,例如高维优化问题。

 


坐标下降法
  • 为解决什么问题:简化多变量优化问题,一次只优化一个变量。
  • 知识点:固定其他变量,逐个变量优化。
  • 应用:适用于变量间相对独立的优化问题。
  • 特点:计算简单,但可能收敛慢,特别是当变量间相互依赖较强时。

在多变量线性回归中,我们试图找到一组参数,使得预测误差最小化。

使用坐标下降法,可以通过交替固定其他变量,一次只优化一个变量来实现。

例如,如果我们有两个参数 w1 和 w2,我们可以先固定 w2,优化 w1,然后固定 w1,优化 w2,如此反复,直到找到最优解。
 


SMO算法
  • 为解决什么问题:特别为支持向量机设计的快速优化算法。
  • 知识点:通过分解大的优化问题为小的子问题,这些子问题可以更快解决。
  • 应用:主要用于支持向量机的训练过程中。
  • 特点:能够高效处理大规模的支持向量机问题,但主要限于这一特定领域。

在训练支持向量机时,我们需要解决一个复杂的优化问题来找到最佳的决策边界。

SMO算法通过将这个大问题分解为一系列小问题来实现优化。

它每次只选择一对参数进行优化,而固定其他所有参数。

这种方法使得问题变得更容易处理,可以有效地加速支持向量机的训练过程。

 


基于导数的函数优化

从解析优化算法的基本理论开始,到无约束问题的求解,再到处理有约束问题的拉格朗日乘数法,最后是适用于更广泛情况的KKT条件。

每一步都在之前的基础上增加了更多的复杂性和适用性。

 


解析优化算法/精确解
  • 为解决什么问题:当可能时,直接求解最优点的解析表达式。
  • 知识点:利用数学公式和理论直接找到最优解。
  • 应用:适用于数学公式简单且可以直接求解的问题。
  • 特点:得到精确解,但仅限于解析解存在的情况。

 


无约束问题-求解驻点方程
  • 为解决什么问题:寻找一个函数在没有任何限制条件下的最优点。
  • 知识点:求解导数等于零的方程组。
  • 应用:在物理学、经济学等领域的最优化问题中常见。
  • 特点:相对简单,但仅限于无约束的情况。

案例:单变量线性回归模型的参数优化。

假设你有一个简单的线性回归模型 y = wx + b,其中 wb 是模型参数。

你的目标是找到这些参数的值,使得模型的预测误差最小。

在这种情况下,你会设置一个损失函数,比如均方误差,并找到这个损失函数的驻点(梯度为零的点)。

通过求解 d(Loss)/dw = 0d(Loss)/db = 0 的方程组,你可以找到损失函数的最小值点,从而得到最优的 wb

 


有等式约束问题-拉格朗日乘数法
  • 为解决什么问题:在优化问题中加入等式约束,寻找满足这些约束的最优解。
  • 知识点:通过引入拉格朗日乘数将约束问题转换为无约束问题。
  • 应用:在有物理、经济等领域约束的工程问题中使用。
  • 特点:能处理等式约束问题,但需要额外的条件来确保找到的是最优解。

案例:带约束的资源分配问题。

假设你需要在不同的项目间分配固定数量的资金,并最大化总收益。

每个项目的收益是资金的非线性函数。

这里,资金总量的限制就是一个等式约束。

使用拉格朗日乘数法,你可以将这个约束条件加入到优化问题中,从而找到在给定资金总量下的最优资金分配方案。

 


有等式和不等式约束问题-KKT条件
  • 为解决什么问题:处理更复杂的约束,包括等式和不等式约束。
  • 知识点:KKT条件是拉格朗日乘数法的一般化,提供了一组必要条件来找到最优解。
  • 应用:在经济学、工程学中的复杂优化问题中使用。
  • 特点:提供了寻找复杂约束问题最优解的理论基础,但求解过程可能复杂。

案例:支持向量机(SVM)的优化。

在训练支持向量机时,目标是最大化分类间隔的同时确保数据点正确分类。

这里,最大化间隔和数据点分类的正确性都是约束条件(包括等式和不等式约束)。

KKT条件在这里提供了一个框架,它结合了拉格朗日乘数法和额外的条件(互补松弛性),来求解这个复杂的优化问题。

通过满足KKT条件,SVM能有效地找到最优的决策边界。

这些方法展示了如何根据问题的不同约束条件选择合适的优化策略。

无约束优化适用于简单问题,拉格朗日乘数法适合处理有等式约束的问题,而KKT条件适用于更复杂的情况,包括等式和不等式约束。
 


基于随机数函数优化

  • 解决什么问题:在解空间广泛或包含许多局部最优解时找到全局最优解。
  • 知识点:利用随机性来探索搜索空间,避免陷入局部最优。
  • 应用:用于复杂的优化问题,如路径规划、调度问题等。
  • 特点:能够处理非常复杂的问题,不容易陷入局部最优解,但可能无法保证找到最优解。
  • 这些方法的灵感来源于自然界和物理世界的过程

当问题具有多个局部最优解时,基于随机数的方法(如遗传算法、模拟退火)可以帮助找到全局最优解。

这些方法通过引入随机性来避免局部最优,但可能需要较长时间来找到满意的解。

 


启发式搜索
  • 问题解决:用于在巨大或复杂的搜索空间中快速找到可接受的解。
  • 知识点:依赖经验或直觉,不保证最优解。
  • 应用:解决复杂问题如路径规划、调度问题。
  • 特点:相对简单,易于实现,但可能不是最优。

 


遗传算法
  • 问题解决:模拟自然选择和遗传学原理解决优化问题。
  • 知识点:使用交叉、变异、选择操作。
  • 应用:解决多种优化问题,如工程设计、人工智能。
  • 特点:强大但计算密集,适用于复杂多变的问题。

 


模拟退火
  • 问题解决:帮助跳出局部最优解,寻找全局最优解。
  • 知识点:模拟金属退火过程,控制温度参数。
  • 应用:解决旅行商问题、排班问题等。
  • 特点:有效但需要仔细选择参数。

 


蚁群优化
  • 问题解决:模拟蚂蚁寻找食物的路径选择行为。
  • 知识点:基于信息素跟踪和集体学习。
  • 应用:路径规划、网络优化。
  • 特点:适应性强,能处理动态变化的问题。

 


多目标函数优化

  • 问题解决:同时优化多个目标函数。
  • 知识点:需要平衡各目标间的冲突。
  • 应用:工业设计、金融建模。
  • 特点:解决方案是一组最优解,而非单一解。

多目标优化涉及同时优化多个目标,这些方法(如函数标量化、e约束法)试图在多个目标间取得平衡。

这些方法通常用于需要在多个目标间权衡取舍的复杂决策问题。

 


函数标量化
  • 问题解决:将多目标优化转换为单目标优化。
  • 知识点:通过加权和或其他方法合并多个目标。
  • 应用:简化复杂优化问题。
  • 特点:易于实现,但可能失去某些目标的信息。

 


ϵ \epsilon ϵ 约束法

 


泛函优化

  • 问题解决:寻找泛函的极值点。
  • 知识点:处理无穷维空间中的优化问题。
  • 应用:物理学、工程学。
  • 特点:理论上深奥,计算上复杂。

 


欧拉-拉格朗日方程
  • 问题解决:求解泛函极值问题。
  • 知识点:类似于费马引理在函数上的推广。
  • 应用:物理学中的动力学系统。
  • 特点:基础但强大的工具,适用于连续系统。

 


拉格朗日乘法
  • 问题解决:处理泛函优化问题中的约束。
  • 知识点:引入拉格朗日乘数处理约束。
  • 应用:经济学、工程优化。
  • 特点:提供了处理约束优化问题的优雅方式。

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

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

相关文章

FCN学习-----第一课

语义分割中的全卷积网络 CVPR IEEE国际计算机视觉与模式识别会议 PAMI IEEE模式分析与机器智能汇刊 需要会的知识点: 神经网络:前向传播和反向传播 卷积神经网络:CNN,卷积,池化,上采样 分类网络&#xff1a…

杨中科 ASP.NETCore Rest

什么是Rest RPC 1、Web API两种风格: 面向过程(RPC) 、面向REST (REST) 2、RPC:“控制器/操作方法“的形式把服务器端的代码当成方法去调用。把HTTP当成传输数据的通道,不关心HTTP谓词。通过QueryString请求报文体给服务器传递数据。状态码。比如/Persons/GetAll…

【LeetCode】608. 树节点

表:Tree ------------------- | Column Name | Type | ------------------- | id | int | | p_id | int | ------------------- id 是该表中具有唯一值的列。 该表的每行包含树中节点的 id 及其父节点的 id 信息。 给定的结构总是一个有效的树。…

stm32学习笔记:TIM-输出比较

四部分讲解内容,本文是第二部分 输出比较主要用于PWM波形的控制电机(驱动电机的必要条件) 1、定时器基本定时,定一个时间,然后让定时器每隔一段时间产生一个中断,来实现每隔一个固定时间执行一段程序的目…

linux磁盘管理实验1

1.在安装好的linux系统中新加一块硬盘,将硬盘分成2个主分区,和2个逻辑分区,将其中一个逻辑分区设置成vfat(FAT32)分区,并实现开机自动挂载所有分区。 答:添加一个硬盘为sdb 分成2个主分区&#…

Flink电商实时数仓项目部署上线

Flink实时数仓部署 将common作为一个自定义的依赖部署到maven中使用maven将各个子模块打包可以使用FLink框架进行jar包的提交运行。 StreamPark 一个易于使用的流处理应用开发框架和一站式流处理操作平台和管理流应用。它提供了Flink和Spark编写流的脚手架。 Core:可以使用…

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…

项目整合积木报表-设计页面

项目整合积木报表-设计页面 <template><div><iframe id"dome" :srcsrc ></iframe></div> </template><script>export default {data(){return{src:configSrc.src"/jmreport/view/836138868821839872"}}} </…

【C语言】函数

函数是什么&#xff1f; “函数”是我们早些年在学习数学的过程中常见的概念&#xff0c;简单回顾一下&#xff1a;比如下图中&#xff0c;你给函数 f(x)2*x3 一个具体的x,这个函数通过一系列的计算来返回给你一个结果(图示如下)。 这就是数学中函数的基本过程和作用。但是你…

LeetCode-杨辉三角公式

杨辉三角公式 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a225ff66061e4076924e3299b81b98d5.png /*** author wx* description 杨辉三角公式-标准* create 2023/12/26**/ public class Triangle {public static void main(String[] args) {List<List<I…

【智慧零售】东胜物联蓝牙网关硬件解决方案,促进零售门店数字化管理

依托物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;等快速发展&#xff0c;数字化和智能化已成为零售企业的核心竞争力。更多的企业通过引入人工智能、大数据等先进技术手段&#xff0c;提高门店运营效率和服务质量。 某连锁咖啡企业牢牢抓住…

C++程序设计兼谈对象模型(侯捷)笔记

C程序设计兼谈对象模型&#xff08;侯捷) 这是C面向对象程序设计的续集笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 主要内容&#xff1a;涉及到模板中的类模板、函数模板、成员模板以及模板模板参数&#xff0c;后面包含对象模型中虚函数调用&…

SSMBUG汇总

20240103 通用&#xff0c;驼峰命名法&#xff0c;mybatis。 mybatis入门程序中&#xff0c; // 获取对象的顺序为&#xff1a;SqlSessionFactoryBuild-》SqlSessionFactory-》SqlSessionSqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();I…

vue3-admin-element框架实现动态路由(根据接口返回)

第一步&#xff1a;在src-utils-handleRoutes&#xff0c;修改代码&#xff1a; export function convertRouter(routers) {let array routersrouters []for (let i in array) {for(let s in asyncRoutes){if (array[i].path asyncRoutes[s].path) {routers.push(asyncRout…

<sa8650>sa8650 qcxser-之-QCX错误报告接口

<sa8650>sa8650 qcxser-之-QCX错误报告接口 1 前言2 错误报告设计3 报告错误的QCarCam APIs3.1 错误ID3.2 错误code3.3 错误源4 错误报告流1 前言 本章主要讲解QCX服务的错误报告接口,如何将qcxserver的错误诊断信息报告给Safety Monitor。 2 错误报告设计 图2-1显示了通…

Spring官方移除Java8

大家好我是苏麟 , 今天聊聊怎么继续使用Java8做项目 . 在做项目的时候突然发现Java8没了 , 我心想 : " 嗯? IDEA出毛病了?" ,经过我仔细检查原来是spring官方不支持Java8了 . IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时&#xff0c;没有 Java 8 的选…

数据结构和算法-希尔排序(增量序列 算法实现 性能分析 稳定性)

文章目录 希尔排序过程小结增量序列不是固定的 算法实现算法性能分析稳定性小结 希尔排序 基本有序&#xff0c;就是存在有序的子序列 通过增量4得到各个子表 对各个子表分别进行插入排序 缩小增量&#xff0c;再除2&#xff0c;此时的子表 对各个子表插入排序 缩小增量&…

六、Spring 声明式事务

本章概要 声明式事务概念 编程式事务声明式事务Spring事务管理器 基于注解的声明式事务 准备工作基本事务控制事务属性&#xff1a;只读事务属性&#xff1a;超时时间事务属性&#xff1a;事务异常事务属性&#xff1a;事务隔离级别事务属性&#xff1a;事务传播行为 6.1 声…

RKE安装k8s及部署高可用rancher之证书在外面的7层LB(nginx中) 7层负载均衡

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种&#xff1a;单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境&#xff0c;而且单节点安装和高可用集群安装之间不能进行数据迁移&#xff0c;所以推荐从一开始就使用高可用集群安装的方式安装 Ran…

正则表达式解析与应用:深度剖析正则表达式的威力

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…