01 LM 算法及 Cpp 实现

文章目录

    • 01 LM 算法及 Cpp 实现
      • 1.1 应用
      • 1.2 阻尼法推导
      • 1.3 Cpp 算法实现

01 LM 算法及 Cpp 实现

1.1 应用

LM 算法用于解决非线性最小二乘问题

min ⁡ x F ( x ) = 1 2 ∥ f ( x ) ∥ 2 2 (1) \min _x F(x)=\frac{1}{2}\|f(\boldsymbol{x})\|_2^2 \tag{1} xminF(x)=21f(x)22(1)

其中, f ( x ) f(\boldsymbol{x}) f(x) 是指各项的残差。

LM 算法有两种推导方式,即 阻尼法置信域 法(见《十四讲》),这里用阻尼法进行推导。

1.2 阻尼法推导

(1)一阶泰勒展开近似

f ( x ) f(\boldsymbol{x}) f(x) x n \boldsymbol{x_n} xn 处一阶泰勒展开(把 Δ x \Delta \boldsymbol{x} Δx 看做未知数),

f ( x n + Δ x ) ≈ f ( x n ) + J ( x n ) Δ x (2) f(\boldsymbol{x_n}+\Delta \boldsymbol{x}) \approx f(\boldsymbol{x_n})+\boldsymbol{J}\left(\boldsymbol{x}_n\right) \Delta \boldsymbol{x} \tag{2} f(xn+Δx)f(xn)+J(xn)Δx(2)

那么问题转化为,对于每次迭代,求解最优的 Δ x \Delta \boldsymbol{x} Δx

Δ x ∗ = arg ⁡ min ⁡ Δ x 1 2 ∥ f ( x n ) + J n ( x n ) Δ x ∥ 2 (3) \Delta \boldsymbol{x}^*=\arg \min _{\Delta \boldsymbol{x}} \frac{1}{2}\left\|f\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\boldsymbol{J}_{\boldsymbol{n}}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \Delta \boldsymbol{x}\right\|^2 \tag{3} Δx=argΔxmin21f(xn)+Jn(xn)Δx2(3)

(2)加入阻尼项

Δ x ∗ = arg ⁡ min ⁡ Δ x M ( Δ x ) = 1 2 ∥ f ( x n ) + J n ( x n ) Δ x ∥ 2 + 1 2 μ Δ x T Δ x (4) \Delta \boldsymbol{x}^*=\arg \min _{\Delta \boldsymbol{x}} M(\Delta \boldsymbol{x})=\frac{1}{2}\left\|f\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\boldsymbol{J}_{\boldsymbol{n}}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \Delta \boldsymbol{x}\right\|^2+\frac{1}{2} \mu \Delta \boldsymbol{x}^T \Delta \boldsymbol{x} \tag{4} Δx=argΔxminM(Δx)=21f(xn)+Jn(xn)Δx2+21μΔxTΔx(4)

其中, μ \mu μ 为阻尼系数,阻尼项 1 2 μ Δ x T Δ x \frac{1}{2} \mu \Delta \boldsymbol{x}^T \Delta \boldsymbol{x} 21μΔxTΔx 可以看做是对于过大的 Δ x \Delta \boldsymbol{x} Δx 的惩罚。

(3)求极值

Δ x \Delta \boldsymbol{x} Δx 求导,并令其等于零,

J ( x n ) T f ( x n ) + J ( x n ) T J ( x n ) Δ x + μ Δ x = 0 (5) \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T f\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \Delta \boldsymbol{x}+\mu \Delta \boldsymbol{x}=\mathbf{0} \tag{5} J(xn)Tf(xn)+J(xn)TJ(xn)Δx+μΔx=0(5)

Δ x ∗ = − ( J ( x n ) T J ( x n ) + μ I ) − 1 J ( x n ) T f ( x n ) (6) \Delta \boldsymbol{x}^*=-\left(\boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\mu \boldsymbol{I}\right)^{-1} \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T f\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \tag{6} Δx=(J(xn)TJ(xn)+μI)1J(xn)Tf(xn)(6)

J ( x n ) T J ( x n ) = H J ( x n ) T f ( x n ) = g \begin{aligned} \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) &=\boldsymbol{H} \\ \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T f\left(\boldsymbol{x}_{\boldsymbol{n}}\right) &=\boldsymbol{g} \end{aligned} J(xn)TJ(xn)J(xn)Tf(xn)=H=g

则式(6)可写为

Δ x ∗ = − ( H + μ I ) − 1 g (7) \Delta \boldsymbol{x}^*=-(\boldsymbol{H}+\mu \boldsymbol{I})^{-1} \boldsymbol{g} \tag{7} Δx=(H+μI)1g(7)

(4)阻尼系数 μ \mu μ 的调节

定义增益系数 ρ \rho ρ

ρ = f ( x + Δ x ) − f ( x ) J ( x ) T Δ x (8) \rho=\frac{f(\boldsymbol{x}+\boldsymbol{\Delta x})-f(\boldsymbol{x})}{\boldsymbol{J}(\boldsymbol{x})^T\Delta \boldsymbol{x}} \tag{8} ρ=J(x)TΔxf(x+Δx)f(x)(8)

其中,分子是实际下降的值,分母是近似下降的值。若 ρ \rho ρ 接近于 1 ,则近似效果好;若 ρ \rho ρ 太小,则说明实际减小的值远小于近似减小的值,即近似效果较差,需缩小近似范围,即增大阻尼系数 μ \mu μ; 若 ρ \rho ρ 太大,则说明实际减小的值大于近似减小的值,则需放大近似范围,即减小 μ \mu μ

两种调节方法:

if  ρ < 0.25 μ : = μ ∗ 2 else if  ρ > 0.75 μ : = μ / 3 \begin{aligned} \text { if } & \rho<0.25 \\ & \mu:=\mu * 2 \\ \text { else if } & \rho>0.75 \\ & \mu:=\mu / 3 \end{aligned}  if  else if ρ<0.25μ:=μ2ρ>0.75μ:=μ/3

也就是, ρ < 0.25 \rho<0.25 ρ<0.25 时增大阻尼系数; ρ > 0.75 \rho>0.75 ρ>0.75 时,减小阻尼系数。

或者:

i f ρ > 0 μ : = μ ∗ max ⁡ { 1 3 , 1 − ( 2 ρ − 1 ) 3 } ; ν : = 2 e l s e μ : = μ ∗ ν ; ν : = 2 ∗ ν \begin{aligned} if \rho>0 \\ &\mu:=\mu * \max \left\{\frac{1}{3}, 1-(2 \rho-1)^3\right\} ; \quad \nu:=2\\ else\\ &\mu:=\mu * \nu ; \quad \nu:=2 * \nu \end{aligned} ifρ>0elseμ:=μmax{31,1(2ρ1)3};ν:=2μ:=μν;ν:=2ν

1.3 Cpp 算法实现

两种方法差别在于 ρ \rho ρ 的分母的计算(我的更快?)。

优化目标是待定系数,把他们看做 未知数,需要计算的 step 就是这些待定系数的 step。

(1)我的方法

/***********************************************************                                          *
* Time: 2022/11/3
* Author: xiaocong
* Function: LM 算法** @ 解决的是最小二乘问题,也就是找到最优的系数使得残差最小* @ obj = A * sin(Bx) + C * cos(D*x) - F*      A * sin(Bx) + C * cos(D*x) 是目标函数*      F 是实际值*      目标是找到使 obj 最小的系数 A B C D
***********************************************************/#include <Eigen/Dense>      // 稠密矩阵
#include <Eigen/Sparse>      // 稀疏矩阵
#include <iostream>
#include <cmath>using namespace std;
using namespace Eigen;const double DERIV_STEP = 1e-5;
const int MAX_INTER = 100;#define max(a, b) (((a)>(b))?(a):(b))// 定义目标函数
double func(const VectorXd input, const VectorXd &output, const VectorXd &params, int objIndex)
{// obj = A * sin(Bx) + C * cos(D*x) - Fdouble x1 = params(0);   // params 中存储的是系数double x2 = params(1);double x3 = params(2);double x4 = params(3);double t = input(objIndex);    // input 中存储的是 xdouble f = output(objIndex);   // output 中存储的是实际值return x1 * sin(x2 * t) + x3 * cos(x4 * t) - f;    // 返回 objIndex 项的残差
}// 计算残差矩阵
VectorXd objF(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{VectorXd obj(input.rows());    // 存储所有残差,也就是残差矩阵for (int i = 0; i < input.rows(); i++)obj(i) = func(input, output, params, i);return obj;   // 返回残差矩阵
}// 残差平方和
double Func(const VectorXd &obj)
{return obj.squaredNorm() / 2.0;
}// 求某个系数在某点的导数
double Deriv(const VectorXd &input, const VectorXd &output, int objIndex, const VectorXd &params, int paraIndex)
{VectorXd para1 = params;VectorXd para2 = params;para1(paraIndex) -= DERIV_STEP;para2(paraIndex) += DERIV_STEP;double obj1 = func(input, output, para1, objIndex);double obj2 = func(input, output, para2, objIndex);return (obj2 - obj1) / (2 * DERIV_STEP);     // 该点处的导数,为求雅克比矩阵做准备
}// 计算雅克比矩阵
/***************************** 我们优化的是系数 params,把他们看做未知数,分别求导,得到雅克比矩阵* 维度:(input.rows() x params.rows())* [[df/dA df/dB df/dC df/dD]    <--- x1*  [df/dA df/dB df/dC df/dD]    <--- x2*  [.......................]*  [df/dA df/dB df/dC df/dD]]    <--- xn****************************/
MatrixXd Jacobian(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{int rowNum = input.rows();int colNum = params.rows();MatrixXd Jac(rowNum, colNum);for (int i = 0; i < rowNum; i++)for (int j = 0; j < colNum; j++)Jac(i, j) = Deriv(input, output, i, params, j);return Jac;
}//求 Hessian 矩阵对角线最大值
// Hessian 矩阵:二阶导数
double maxMatrixDiagonale(const MatrixXd &Hessian)
{int max = 0;for (int i = 0; i < Hessian.rows(); i++){if(Hessian(i, i) > max)max = Hessian(i, i);}return max;
}// 近似下降值
double linerDeltaL(const VectorXd &step, const MatrixXd &Jac)
{VectorXd L = Jac * step;return L.norm();
}void levenMar(const VectorXd &input, const VectorXd &output, VectorXd &params)
{double epsilon = 1e-12;int iterCnt = 0;         // 迭代计数double tao = 1e-3;long long v = 2;// 求初始的 uMatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4double u = tao * maxMatrixDiagonale(H);     // Hessian 矩阵对角线最大值乘 taowhile (iterCnt < MAX_INTER)     // double 类型不能直接作比较{VectorXd obj = objF(input, output, params);    // 误差矩阵MatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4VectorXd g = Jac.transpose() * obj;     // 也就是 g,4x1VectorXd step = (H + u * MatrixXd::Identity(H.rows(), H.cols())).inverse() * g;if(step.norm() < epsilon)break;cout << "H:" << endl << H << endl;cout << "step: " << endl << step << endl;VectorXd paramsNew(params.rows());paramsNew = params - step;            // 更新 params// 计算 params 误差obj = objF(input, output, params);// 计算 paramsNew 误差VectorXd  obj_new = objF(input, output, paramsNew);double deltaF = Func(obj) - Func(obj_new);     // 求差double deltaL = linerDeltaL(step, Jac);// 计算增益系数 rhodouble rho = deltaF / deltaL;          // 实际下降值 / 近似下降值cout << "rho is; " << rho <<endl;if(rho > 0){params = paramsNew;u *= max(1.0 / 3.0, 1 - pow(2 * rho - 1, 3));v = 2;} else{u = u * v;v = v * 2;}cout << "u= " << u << "\tv= " << v << endl;iterCnt ++;cout << "Iteration " << iterCnt << " times, result is :" << endl<< params << endl;}
}int main()
{int params_num = 4;int total_data = 100;VectorXd input(total_data);VectorXd output(total_data);double A = 5, B = 1, C = 10, D = 2;    // 初始化// 生成数据for (int i = 0; i < total_data; i++){double x = 20.0 * ((rand() % 1000) / 1000.0) - 10.0;    // [-10, 10]double deltaY = 2.0 * (rand() % 1000) / 1000.0;         // 随机噪声,[0, 2]double y = A * sin(B*x) + C * cos(D*x) + deltaY;input(i) = x;output(i) = y;}VectorXd params_levenMar(params_num);params_levenMar << 3.6, 1.3, 7.2, 1.7;levenMar(input, output, params_levenMar);cout << "**********************************************" << endl;cout << "Levenberg-Marquardt parameter: " << endl << params_levenMar << endl;}

输出

Levenberg-Marquardt parameter:4.85628
0.99790410.05242.003

(2)网络方法

/***********************************************************                                          *
* Time: 2022/11/2
* Author: xiaocong
* Function: LM 算法** @ 解决的是最小二乘问题,也就是找到最优的系数使得残差最小* @ obj = A * sin(Bx) + C * cos(D*x) - F*      A * sin(Bx) + C * cos(D*x) 是目标函数*      F 是实际值*      目标是找到使 obj 最小的系数 A B C D
***********************************************************/#include <Eigen/Dense>      // 稠密矩阵
#include <Eigen/Sparse>      // 稀疏矩阵
#include <iostream>
#include <iomanip>    // 控制输入输出格式等
#include <cmath>using namespace std;
using namespace Eigen;const double DERIV_STEP = 1e-5;
const int MAX_INTER = 100;#define max(a, b) (((a)>(b))?(a):(b))// 定义目标函数
double func(const VectorXd input, const VectorXd &output, const VectorXd &params, int objIndex)
{// obj = A * sin(Bx) + C * cos(D*x) - Fdouble x1 = params(0);   // params 中存储的是系数double x2 = params(1);double x3 = params(2);double x4 = params(3);double t = input(objIndex);    // input 中存储的是 xdouble f = output(objIndex);   // output 中存储的是实际值return x1 * sin(x2 * t) + x3 * cos(x4 * t) - f;    // 返回 objIndex 项的残差
}// 计算残差矩阵
VectorXd objF(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{VectorXd obj(input.rows());    // 存储所有残差,也就是残差矩阵for (int i = 0; i < input.rows(); i++)obj(i) = func(input, output, params, i);return obj;   // 返回残差矩阵
}// 残差平方和
double Func(const VectorXd &obj)
{return obj.squaredNorm() / 2.0;
}// 求某个系数在某点的导数
double Deriv(const VectorXd &input, const VectorXd &output, int objIndex, const VectorXd &params, int paraIndex)
{VectorXd para1 = params;VectorXd para2 = params;para1(paraIndex) -= DERIV_STEP;para2(paraIndex) += DERIV_STEP;double obj1 = func(input, output, para1, objIndex);double obj2 = func(input, output, para2, objIndex);return (obj2 - obj1) / (2 * DERIV_STEP);     // 该点处的导数,为求雅克比矩阵做准备
}// 计算雅克比矩阵
/***************************** 我们优化的是系数 params,把他们看做未知数,分别求导,得到雅克比矩阵* 维度:(input.rows() x output.rows())* [[df/dA df/dB df/dC df/dD]    <--- x1*  [df/dA df/dB df/dC df/dD]    <--- x2*  [.......................]*  [df/dA df/dB df/dC df/dD]]    <--- xn****************************/
MatrixXd Jacobian(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{int rowNum = input.rows();int colNum = params.rows();MatrixXd Jac(rowNum, colNum);for (int i = 0; i < rowNum; i++)for (int j = 0; j < colNum; j++)Jac(i, j) = Deriv(input, output, i, params, j);return Jac;
}//求 Hessian 矩阵对角线最大值
// Hessian 矩阵:二阶导数
double maxMatrixDiagonale(const MatrixXd &Hessian)
{int max = 0;for (int i = 0; i < Hessian.rows(); i++){if(Hessian(i, i) > max)max = Hessian(i, i);}return max;
}double linerDeltaL(const VectorXd &step, const VectorXd &gradient, const double u)
{double L = step.transpose() * (u * step - gradient);return L;
}void levenMar(const VectorXd &input, const VectorXd &output, VectorXd &params)
{int errNum = input.rows();int paraNum = params.rows();// initial parametersVectorXd obj = objF(input, output, params);    // 得到误差矩阵MatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4VectorXd gradient = Jac.transpose() * obj;     // 也就是 g,4x1double tao = 1e-3;long  long v = 2;double epsilon1 = 1e-12, epsilon2 = 1e-12;double u = tao * maxMatrixDiagonale(H);     // Hessian 矩阵对角线最大值乘 taobool found = gradient.norm() <= epsilon1;if (found) return;        // 直接退出程序,不再执行后面的程序double last_sum = 0;int iterCnt = 0;         // 迭代计数while (iterCnt < MAX_INTER){VectorXd obj = objF(input, output, params);    // 误差矩阵MatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4VectorXd gradient = Jac.transpose() * obj;     // 也就是 g,4x1if(gradient.norm() < epsilon1){cout << "stop g(x) = 0 for a local minimizer optimizer." << endl;break;}cout << "H:" << endl << H << endl;VectorXd step = (H + u * MatrixXd::Identity(paraNum, paraNum)).inverse() * gradient;// 求 Delta x = (H + uI)^{-1}g      注意:step 维度(4x1)cout << "step: " << endl << step << endl;if(step.norm() <= epsilon2 * (params.norm()) + epsilon2){cout << "stop because change in x is small" << endl;break;}VectorXd paramsNew(params.rows());paramsNew = params - step;            // 更新 params// 计算 params 误差obj = objF(input, output, params);// 计算 paramsNew 误差VectorXd  obj_new = objF(input, output, paramsNew);double deltaF = Func(obj) - Func(obj_new);     // 求差double deltaL = linerDeltaL(-1 * step, gradient, u);// 计算增益系数 rhodouble rho = deltaF / deltaL;          // 实际下降值 / 近似下降值cout << "rho is; " << rho <<endl;if(rho > 0){params = paramsNew;u *= max(1.0 / 3.0, 1 - pow(2 * rho - 1, 3));v = 2;} else{u = u * v;v = v * 2;}cout << "u= " << u << "\tv= " << v << endl;iterCnt ++;cout << "Iteration " << iterCnt << " times, result is :" << endl<< params << endl;}
}int main()
{int params_num = 4;int total_data = 100;VectorXd input(total_data);VectorXd output(total_data);double A = 5, B = 1, C = 10, D = 2;    // 初始化// 生成数据for (int i = 0; i < total_data; i++){double x = 20.0 * ((rand() % 1000) / 1000.0) - 10.0;    // [-10, 10]double deltaY = 2.0 * (rand() % 1000) / 1000.0;         // 随机噪声,[0, 2]double y = A * sin(B*x) + C * cos(D*x) + deltaY;input(i) = x;output(i) = y;}VectorXd params_levenMar(params_num);params_levenMar << 3.6, 1.3, 7.2, 1.7;levenMar(input, output, params_levenMar);cout << "Levenberg-Marquardt parameter: " << endl << params_levenMar << endl << endl << endl;cout << "**********************************************" << endl;}

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

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

相关文章

代理模式 rust和java的实现

文章目录 代理模式介绍实现javarust rust仓库 代理模式 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对…

jquery中ajax总结

在ajax请求接口的时候&#xff0c;常用到以下参数&#xff0c;在这里记录下 contentType用于告诉服务器请求的数据类型&#xff0c;常见的有 text/html&#xff1a;HTML网页 text/plain&#xff1a;纯文本 application/json&#xff1a;JSON格式 application/xml&#xff1a;XM…

“KeyarchOS:国产Linux新星的崛起与创新之路“

简介 KeyarchOS是一款由浪潮信息自主研发的服务器操作系统。它因为几个特点而受到我的青睐和一些用户的关注。 首先&#xff0c;KeyarchOS注重安全性和稳定性。它有一些防护和隔离功能&#xff0c;来帮助系统稳定运行&#xff0c;而且是中文语言更接地气。 其次&#xff0c;Ke…

OSG编程指南<十>:OSG几何体的绘制

1、场景基本绘图类 在 OSG 中创建几何体的方法比较简单&#xff0c;通常有 3 种处理几何体的手段&#xff1a; 使用松散封装的OpenGL 绘图基元&#xff1b;使用 OSG 中的基本几何体&#xff1b;从文件中导入场景模型。 使用松散封装的OpenGL 绘图基元绘制几何体具有很强的灵活…

牛气霸屏-快抖云推独立版V1.6.7

介绍 快抖云推全插件独立版是最近很火的牛气霸屏系统独立版&#xff0c;牛气霸屏系统就是商家通过系统在线创建抖音或快手霸屏活动&#xff0c;并生成该活动的爆客二维码&#xff0c;用户通过扫二维码即可参加活动&#xff08;活动可以是领取卡劵&#xff0c;抽奖等&#xff0…

DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(下)

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reports — 跨平台报表组件&#x…

linux(1)之build构建系统基础(一)

Linux(1)之buildroot构建系统(一) Author&#xff1a;Onceday Date&#xff1a;2023年11月12日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; The Yocto ProjectBuildroot - Making Embedded Linux Easy 文章目录 Linux(1)之buildroot构建系统(一)1. 概述1.1 如…

企业数字化转型转什么?怎么转?这份攻略请收好

目录 -01-数字化转型“是什么” -02-数据驱动推动企业数字化转型 -03-企业数字化转型的行动路线图 数字化转型&#xff0c;转什么&#xff1f;怎么转&#xff1f;这些问题仍在困扰不少企业&#xff0c;也是每个企业转型升级不得不思考的重要问题。对此&#xff0c;中关村数字…

Python潮流周刊#1:如何系统地自学Python?

这里记录每周值得分享的 Python 及通用技术内容&#xff0c;部分内容为英文&#xff0c;已在小标题注明。&#xff08;本期标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。&#xff09; 文章&教程 1、编程语言的错误处理模式 文章讨论…

requests请求django接口跨域问题处理

参考&#xff1a; https://zhuanlan.zhihu.com/p/416978320 https://blog.csdn.net/SweetHeartHuaZai/article/details/130983179 使用httpx代替requests import httpxheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…

销售为什么会选择使用电销这种方式 ?

在网络经济时代的大环境下&#xff0c;网络营销作为一种新型营销模式和营销理念&#xff0c;已经抢占了大部分市场。 网络营销&#xff0c;是指利用互联网技术和现代信息技术&#xff0c;以及社交媒体平台&#xff0c;进行产品宣传、销售、服务、品牌传播等活动的一种营销模式。…

MySQL-进阶

存储引擎 MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和连接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a; 第二层架构主要完成大多数的核心服务功能&…

财报解读:三季度的美国零售,“沃尔玛效应”仍在持续

经济学中常用“沃尔玛效应”来指代“消费者减少消费时&#xff0c;会选择每种类别中价格最低的商品”这一现象。作为全球最大的零售商&#xff0c;沃尔玛一定程度上成为了消费市场的风向标。 近日&#xff0c;沃尔玛发布的2024财年第三季度财报显示&#xff0c;其相较去年同期…

虚拟机(Linux)系统知识普及:什么是Linux发行版 以及各发行版的区别

什么是Linux发行版 以及各发行版的区别 一. 什么是linux发行版简单来说正式定义区别资料1区别资料2区别资料3区别资料4注意事项二. Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGoLinux 发行版:RedhatDebianUbuntuGentooFreeBSD

22款奔驰S400L升级主动式氛围灯 光影彰显奔驰的完美

新款奔驰S级原车自带64色氛围灯&#xff0c;还可以升级原厂的主动式氛围灯&#xff0c;增加车内的氛围效果。主动式环境氛围灯包含263个LED光源&#xff0c;每隔1.6厘米就有一个LED光源&#xff0c;照明效果较过去明亮10倍&#xff0c;视觉效果更加绚丽&#xff0c;它还可结合智…

Python中的下划线使用教程:单下划线、双下划线和头尾双下划线详解

概要 Python是一种简单、易学、功能强大的编程语言&#xff0c;被广泛应用于各种领域。在Python中&#xff0c;下划线的使用有其特殊的含义和用途。本文将详细介绍Python中的单下划线、双下划线和头尾双下划线的使用教程&#xff0c;帮助读者更好地理解和应用这些特性。 一、单…

干货!ERP软件如何帮助企业实现信息化管理?

ERP即企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统&#xff0c;其核心是物料的追踪流转。而在物料追踪流转的基础上&#xff0c;又衍生出一系列各类资源计划的管理和追踪。因此ERP发展成为一款集成各类资源计划&#xff0c;也就是集成企业核心业务流…

化学气相沉积(CVD)中的TEOS

在半导体制程中&#xff0c;薄膜的沉积是核心的步骤之一&#xff0c;有接触过CVD的小伙伴应该或多或少听过TEOS这种物质&#xff0c;TEOS作为一种重要的沉积源&#xff0c;尤其在低温氧化硅的生成过程中&#xff0c;发挥了无可替代的角色。今天我们就来聊聊这种物质。 什么是TE…

ES开启安全认证

elasticsearch开启安全认证步骤 1.创建证书 进入到es主目录下执行 ./bin/elasticsearch-certutil ca Elasticsearch开启安全认证详细步骤 第一个证书名称默认&#xff0c;直接回车 第二个输入密码&#xff0c;直接回车 完成后会生成一个文件&#xff1a;elastic-stack-ca.p12…

创新研报|顺应全球数字化,能源企业以“双碳”为目标的转型迫在眉睫

能源行业现状及痛点分析 挑战一&#xff1a;数字感知能力较弱 挑战二&#xff1a;与业务的融合度低 挑战三&#xff1a;决策响应速度滞后 挑战四&#xff1a;价值创造有待提升 挑战五&#xff1a;安全风险如影随形 能源数字化转型定义及架构 能源行业数字化转型体系大体…