手書き非線形最小二乗

1393 ワード

勾配降下法を用いて非線形最小二乗問題を解く
 
方法1:勾配降下法
#include 
#include 
#include 
#include 
#include 
#include 
#include 
class descent_method
{
private:
    /* data */

    double a_; //    
    double b_;
    double c_;
    double lamda_;
    Eigen::Vector3d Gradient_;
    int max_iter_;
    double min_step_;
    //Eigen::MatrixXd Gradient_; //     

    void cal_Gradient();
    void update_deltT();
    std::vector x_obs_;
    std::vector y_obs_;

public:
    descent_method(double a, double b, double c);
    void add_obs(double x, double y);
    void solve_cost();
    ~descent_method();
};

descent_method::descent_method(double a, double b, double c) : a_(a), b_(b), c_(c)
{
    max_iter_ = 50000;
    min_step_ = 1e-3;
    lamda_ =1e-3;
}

descent_method::~descent_method()
{
}
void descent_method::add_obs(double x, double y) //    
{
    x_obs_.push_back(x);
    y_obs_.push_back(y);
}
void descent_method::solve_cost()
{
    for (int i = 0; i < max_iter_; i++) //       
    {
        cal_Gradient(); //    
        //std::cout<

現在、勾配降下アルゴリズムにはlamdaのパラメータとmin_をどのように調整するかなどの問題がある.Step間の関係
 
参考ブログ:
[1] https://www.jianshu.com/p/bf6ec56e26bd
[2] https://zhuanlan.zhihu.com/p/42383070