超定方程(矩陣形式)求最小二乘法過程與推論(包含對矩陣的跡的講解)


原文轉載1: https://blog.csdn.net/i_chaoren/article/details/79822574

 

 

 

C++實現多項式曲線擬合--polyfit

基本原理:冪函數可逼近任意函數。

 

上式中,N表示多項式階數,實際應用中一般取3或5;

假設N=5,則:

 

共有6個未知數,僅需6個點即可求解;

可表示為矩陣方程:

Y的維數為[R*1],U的維數[R * 6],K的維數[6 * 1]。

R> 6時,超定方程求解:

 

下面是使用C++實現的多項式擬合的程序,程序中使用opencv進行矩陣運算和圖像顯示。程序分別運行了N=3,5,7,9時的情況,結果如下:

 

 

#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;

Mat polyfit(vector<Point>& in_point, int n);

int main()
{
//數據輸入
Point in[19] = { Point(50,120),Point(74,110),Point(98,100),Point(122,100),Point(144,80)
,Point(168,80),Point(192,70),Point(214,50),Point(236,40),Point(262,20)
,Point(282,20),Point(306,30),Point(328,40),Point(356,50),Point(376,50)
,Point(400,50),Point(424,50),Point(446,40),Point(468,30) };

vector<Point> in_point(begin(in),end(in));

//n:多項式階次
int n = 9;
Mat mat_k = polyfit(in_point, n);


//計算結果可視化
Mat out(150, 500, CV_8UC3,Scalar::all(0));

//畫出擬合曲線
for (int i = in[0].x; i < in[size(in)-1].x; ++i)
{
Point2d ipt;
ipt.x = i;
ipt.y = 0;
for (int j = 0; j < n + 1; ++j)
{
ipt.y += mat_k.at<double>(j, 0)*pow(i,j);
}
circle(out, ipt, 1, Scalar(255, 255, 255), CV_FILLED, CV_AA);
}

//畫出原始散點
for (int i = 0; i < size(in); ++i)
{
Point ipt = in[i];
circle(out, ipt, 3, Scalar(0, 0, 255), CV_FILLED, CV_AA);
}

imshow("9次擬合", out);
waitKey(0);

return 0;
}

Mat polyfit(vector<Point>& in_point, int n)
{
int size = in_point.size();
//所求未知數個數
int x_num = n + 1;
//構造矩陣U和Y
Mat mat_u(size, x_num, CV_64F);
Mat mat_y(size, 1, CV_64F);

for (int i = 0; i < mat_u.rows; ++i)
for (int j = 0; j < mat_u.cols; ++j)
{
mat_u.at<double>(i, j) = pow(in_point[i].x, j);
}

for (int i = 0; i < mat_y.rows; ++i)
{
mat_y.at<double>(i, 0) = in_point[i].y;
}

//矩陣運算,獲得系數矩陣K
Mat mat_k(x_num, 1, CV_64F);
mat_k = (mat_u.t()*mat_u).inv()*mat_u.t()*mat_y;
cout << mat_k << endl;
return mat_k;
}

————————————————
版權聲明:本文為CSDN博主「i_chaoren」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/i_chaoren/article/details/79822574

 

 

 

原文轉載2:https://blog.csdn.net/weixin_37606743/article/details/79111300

最小二乘法矩陣求導過程的推導

(很實用:通常來說,對於一個超定方程組來說,求最小二乘解只需要兩邊同時乘的轉置,然后得到正規方程組,然后解這個方程就得到了最小二乘解。)

關於最小二乘問題的求解,之前已有梯度下降法,還有比較快速的牛頓迭代。今天來介紹一種方法,是基於矩陣求導來計算的,它的計算方式更加簡潔高效,不需要大量迭代,只需解一個正規方程組。在開始之前,首先來認識一個概念和一些用到的定理。矩陣的跡定義如下 

一個的矩陣的跡是指的主對角線上各元素的總和,記作。即      

 

 

                        

             

 好了,有了上述7個定理,就可以來求最小二乘解了。設

 

  

那么進一步得到 

    

 接下來會涉及到矩陣求導,因為 

    

那么進一步利用矩陣求導並利用上述定理,得到

 

    

 我們知道在極值點處梯度值為零,即 :

    

上述得到的方程組叫做正規方程組,那么最終得到 

    

這樣最小二乘問題只需解一個線性方程組即可,不再需要像梯度下降那樣迭代了。 

既然說到了正規方程組,在介紹一種方程組,叫做超定方程組,它的定義為:把方程個數大於未知量個數的方程組叫做超定方程組。通常來說,對於一個超定方程組來說,求最小二乘解只需要兩邊同時乘的轉置,然后得到正規方程組,然后解這個方程就得到了最小二乘解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM