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} xmin?F(x)=21?f(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Δxmin?21?f(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Δxmin?M(Δx)=21?f(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.pswp.cn/news/165933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165933.shtml
英文地址,請注明出處:http://en.pswp.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;安全風險如影隨形 能源數字化轉型定義及架構 能源行業數字化轉型體系大體…