殘差函式f(x)為非線性函式,對其一階泰勒近似有:
這裡的j是殘差函式f的雅可比矩陣,帶入損失函式的:
令其一階導等於0,得:
這就是**裡常看到的normal equation。
lm是對高斯牛頓法進行了改進,在求解過程中引入了阻尼因子:
2.1 阻尼因子的作用:
2.2 阻尼因子的初始值選取:
乙個簡單的策略就是:
2.3 阻尼因子的更新策略
3.1 構建h矩陣
void problem::makehessian()
}b.segment(index_i, dim_i).noalias() -= jtw * edge.second->residual();}}
hessian_ = h;
b_ = b;
t_hessian_cost_ += t_h.toc();
delta_x_ = vecx::zero(size); // initial delta_x = 0_n;
}
3.2 將構建好的h矩陣加上阻尼因子void problem::addlambdatohessianlm()
}
3.3 進行求解後,驗證該步的解是否合適,**對應阻尼因子的更新策略bool problem::isgoodstepinlm()
double rho = (currentchi_ - tempchi) / scale;
if (rho > 0 && isfinite(tempchi)) // last step was good, 誤差在下降
else
}
LM演算法初識
由於工作內容接觸到點雲標定,需要用到最小二乘法,所以特意花了點時間研究lm演算法,但是由於大學的高等數學忘得差不多了,所以本文從最基本的一些數學概念開始 在最優化演算法中,都是要求乙個函式的極小值,每一步迭代中,都要求目標函式值是下降的,而信賴域法,顧名思義,就是從初始點開始,先假設乙個可以信賴的最...
LM螞蟻聚類演算法
實驗表明 工蟻能在幾小時內將分散在蟻穴各處的大小不同的螞蟻屍體聚成幾類,小的蟻堆通過吸引螞蟻積攢更多的屍體來逐漸變大,這種正反饋會導致蟻堆逐漸越積越大,以達到聚類資料的目的。deneubourg 等人提出了一種基本模型 basic model 簡稱bm 用來解釋螞蟻屍體堆積成螞蟻墓的行為,並模擬實現...
LM演算法的C 實現
這是乙個資料擬合的例子,並沒有採用物件導向的設計方法是使能更好的理解lm演算法的流程,簡約而不簡單。演算法詳細過程不多介紹。程式中用到opencv庫中的矩陣類mat。例 pragma once include include opencv2 core core.hpp pragma comment ...