Eigen库最小二乘拟合

Eigen库最小二乘拟合

在研究zernike多项式过程中,需要使用到矩阵的最小二乘拟合。所以在这里记录分享Eigen库的最小二乘拟合使用方法。

by HPC_ZY

最小二乘公式

B = ( X T X ) 1 X T Y B = (X^TX)^{-1}X^TY
B : n × 1 B:n \times 1 矩阵
X : m × n / X:m \times n 矩阵,输入变量/特征
Y : m × 1 / Y:m \times 1 矩阵,输出变量/拟合目标
m : m:样本数
n : n:特征个数

Eigen实现

如一组样本数为3、特征数为3的矩阵,进行最小二乘拟合如下,

// 初始化
MatrixXf X(3, 3);
MatrixXf Y(3, 1);
X <<
	3, 1, 2,
	3, 2, 4,
	5, 5, 2;
Y <<
	2,
	2,
	3;
// 最小二乘拟合
MatrixXf Xt = X.transpose();
MatrixXf B = (Xt*X).inverse()*Xt*Y;
// 检验
MatrixXf Yfit = X*B;
// 显示
cout << "X = " << endl << X << endl << endl;
cout << "Y = " << endl << Y << endl << endl;
cout << "B = " << endl << B << endl << endl;
cout << "Yfit  = " << endl << Yfit  << endl << endl;

对应的MATLAB计算方法如下

X = [3,1,2; 3,2,4; 5,5,2]
Y = [2; 2; 3]

B = inv(X'*X)*X'*Y  % 也可以写作 B = (X'*X)\X'*Y

Yfit = X*B

结果对比如下,结果一致,ok
在这里插入图片描述

其他

  1. 使用之前当然要先加入头文件
#include <Eigen/Dense>
using namespace Eigen;
  1. 上文C代码中我使用手动赋值的方式,其实对于大矩阵还可以使用循环赋值,如下
float a[9] = {3, 1, 2, 3, 2, 4, 5, 5, 2};
MatrixXf X(3 ,3);
for (int i = 0; i < 3; i++)
	for (int j = 0; j < 3; j++)
		X(i, j) = a[i * 3 + j];
		
cout << "X = " << endl << X << endl << endl;
  1. 欢迎提问评论,谢谢支持

猜你喜欢

转载自blog.csdn.net/xsz591541060/article/details/107532611