5.高斯-牛頓法的具體例子

求解滿足如下方程的曲線

y = exp(ax^2+bx + c)+w

其中a,b,c為待求曲線參數(shù),w為引入的高斯分布噪聲,w滿足(0,\sigma ^2),假設(shè)有N對關(guān)于x,y的觀測點卤橄,觀測結(jié)果是x_i,y_i,要通過這些點來推測具體的曲線參數(shù)a,b,c

記第i對觀測點誤差為e_i=y_i- exp(ax_i^2+bx_i + c)
,此處的函數(shù)為確定函數(shù),無需進行泰勒展開
可直接定義函數(shù)f_i(a,b,c)=\Big(y_i- exp(ax_i^2+bx_i + c)\Big)
對該點的誤差函數(shù)進行平方再求和寫成最小二乘的形式

于是minF_i(a,b,c) =\frac{1}{2}||f_i(a,b,c)||^2=\frac{1}{2} e_i^2=\frac{1}{2}\Big(y_i- exp(ax_i^2+bx_i + c)\Big)^2

我們根據(jù)第4節(jié)臂外,對于f(X^{(k+1)})=f(X^{(k)})+J(X^{(k)})^T\Delta X
其高斯牛頓方程增量方程長下面這樣
\Rightarrow \Delta X=-(J(X^{(k)}).J(X^{(k)})^T)^{-1}J(X^{(k)})f(X^{(K)}).
其中
H_0(X^{(k)})=J(X^{(k)}).J(X^{(k)})^T
g(X^{(k)})=-J(X^{(k)})f(X^{(K)}).

于是在這里窟扑,我們令X^{(k)}=\begin{bmatrix}a^k\\b^k\\c^k\end{bmatrix}. 注意,k表示k次迭代漏健,不是說k次方

于是J_i(X^{k})=\begin{bmatrix} \frac{\partial f_i(X^{k})}{\partial a} \\\frac{\partial f_i(X^{k})}{\partial b} \\\frac{\partial f_i(X^{k})}{\partial c} \end{bmatrix} =\begin{bmatrix} \frac{\partial \Big(y_i- exp(ax_i^2+bx_i + c)\Big)}{\partial a} \\\frac{\partial \Big(y_i- exp(ax_i^2+bx_i + c)\Big)}{\partial b} \\\frac{\partial \Big(y_i- exp(ax_i^2+bx_i + c)\Big)}{\partial c} \end{bmatrix} =\begin{bmatrix} \Big(- x_i^2exp(ax_i^2+bx_i + c)\Big) \\\Big(- x_iexp(ax_i^2+bx_i + c)\Big) \\\Big(- exp(ax_i^2+bx_i + c)\Big) \end{bmatrix}

于是我們得到第i個數(shù)據(jù)點的增量方程
(J_i(X^{(k)}).J_i(X^{(k)})^T)\Delta X_i=-J_i(X^{(k)})f_i(X^{(k)}).

因為最終是所有的點進行求和,得到整體所有點的單次迭代增量方程
\Big(\sum_{i=1}^N\big(J_i(X^{(k)})J_i(X^{(k)})^T\big) \Big).\Delta X=-\sum_{i=1}^NJ_i(X^{(k)})f_i(X^{(k)})

另外嚎货,我們注意到因為誤差噪聲數(shù)據(jù)w滿足N ~(0,\sigma ^2)
因此實際計算的時候會對于每一個誤差都除去一個標(biāo)準(zhǔn)差,這樣讓數(shù)據(jù)滿足歸一化漾肮,即滿足N~(0,1)
以防止數(shù)據(jù)越界或者各種奇怪的問題
于是最終得到
\Big(\sum_{i=1}^N\frac{J_i(X^{k)})}{\sigma}\frac{J_i(X^{(k)})^T}{\sigma}\Big).\Delta X=-\sum_{i=1}^N\frac{J_i(X^{(k)}))}{\sigma}\frac{f_i(X^{(k)}}{\sigma}

這里貼一段別人寫的 eigen庫實現(xiàn)的上面的例子的代碼,可同步參考進行理解

#include <iostream>
#include <opencv2/opencv.hpp>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

int main()
{
    /*第一部分厂抖,生成觀測數(shù)據(jù)xi,yi*/
    double ar = 1.0, br = 2.0, cr = 1.0;//真實參數(shù)值
    double ae = 2.0, be = -1.0, ce = 5.0;//估計參數(shù)值
    int N = 100;//數(shù)據(jù)點
    double w_sigma = 1.0;//噪聲的sigma值
    cv::RNG rng;//opencv隨機數(shù)產(chǎn)生器
    vector<double> x_data, y_data;//數(shù)據(jù)
    for (int i = 0; i < N; i++)
    {
        double x = i / 100.0;
        x_data.push_back(x);
        y_data.push_back(exp(ar*x*x + br * x + cr) + rng.gaussian(w_sigma*w_sigma));//加上高斯噪聲
    }

    /*第二部分,開始高斯牛頓迭代*/
    int iterations = 100;
    double cost = 0, lastCost = 0;//本次迭代的cost和上一次迭代的cost
    //開始計時間
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    //迭代iterations次
    for (int iter = 0; iter < iterations; iter++)
    {
        Matrix3d H = Matrix3d::Zero();//H=JxJ^T
        Vector3d b = Vector3d::Zero();//b=-J*f
        cost = 0;
        //求解每個觀測點的損失克懊,即F=1/2*||f||^2方程中的f
        for (int i = 0; i < N; i++)
        {
            double xi = x_data[i], yi = y_data[i];//第i個數(shù)據(jù)點
            double error = yi - exp(ae*xi*xi + be * xi + ce);
            Vector3d J;//雅可比矩陣
            J[0] = -xi * xi*exp(ae*xi*xi + be * xi + ce);  // de/da
            J[1] = -xi * exp(ae*xi*xi + be * xi + ce);     // de/db
            J[2] = -exp(ae*xi*xi + be * xi + ce);          // de/dc

            H +=  J*J.transpose();
            b += -error*J;

            cost += error * error;
        }

        //求解線性方程組Hx=b
        Vector3d dx = H.ldlt().solve(b);
        if (isnan(dx[0]))
        {
            std::cout << "result is nan!" << std::endl;
            break;
        }
        //如果當(dāng)前迭代不能使目標(biāo)函數(shù)減小忱辅,則停止迭代
        if (iter > 0 && cost >= lastCost)
        {
            std::cout << "cost: " << cost << ">= lastCost:" << lastCost << ",break." << std::endl;
            break;
        }
        //更新參數(shù)
        ae += dx[0];
        be += dx[1];
        ce += dx[2];
        //記錄當(dāng)前迭代次數(shù)的代價函數(shù)值
        lastCost = cost;
        //輸出迭代結(jié)果
        std::cout << "iteration:"<<iter+1<<"\ttotal cost:" << cost << "\t\tupdata:" << dx.transpose() << "\t\testimated params:" << ae << "," << be << "," << ce << endl;

    }
    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double>time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
    std::cout << "solve time cost=" << time_used.count() << "seconds." << endl;
    std::cout << "estimated abc=" << ae << "," << be << "," << ce << endl;
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末七蜘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子墙懂,更是在濱河造成了極大的恐慌橡卤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损搬,死亡現(xiàn)場離奇詭異碧库,居然都是意外死亡,警方通過查閱死者的電腦和手機巧勤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門嵌灰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颅悉,你說我怎么就攤上這事沽瞭。” “怎么了剩瓶?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵驹溃,是天一觀的道長。 經(jīng)常有香客問我延曙,道長豌鹤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任枝缔,我火速辦了婚禮布疙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魂仍。我一直安慰自己拐辽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布擦酌。 她就那樣靜靜地躺著俱诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赊舶。 梳的紋絲不亂的頭發(fā)上睁搭,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音笼平,去河邊找鬼园骆。 笑死,一個胖子當(dāng)著我的面吹牛寓调,可吹牛的內(nèi)容都是我干的锌唾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晌涕!你這毒婦竟也來了滋捶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤余黎,失蹤者是張志新(化名)和其女友劉穎重窟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惧财,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡巡扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垮衷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厅翔。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帘靡,靈堂內(nèi)的尸體忽然破棺而出知给,到底是詐尸還是另有隱情,我是刑警寧澤描姚,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站戈次,受9級特大地震影響轩勘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怯邪,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一绊寻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悬秉,春花似錦澄步、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至武氓,卻和暖如春梯皿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背县恕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工东羹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忠烛。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓属提,卻偏偏與公主長得像,于是被迫代替她去往敵國和親美尸。 傳聞我的和親對象是個殘疾皇子冤议,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容