概述
Eigen库最小二乘拟合
- 最小二乘公式
- Eigen实现
- 其他
在研究zernike多项式过程中,需要使用到矩阵的最小二乘拟合。所以在这里记录分享Eigen库的最小二乘拟合使用方法。
by HPC_ZY
最小二乘公式
B
=
(
X
T
X
)
−
1
X
T
Y
B = (X^TX)^{-1}X^TY
B=(XTX)−1XTY
B
:
n
×
1
矩
阵
B:n times 1 矩阵
B:n×1矩阵
X
:
m
×
n
矩
阵
,
输
入
变
量
/
特
征
X:m times n 矩阵,输入变量/特征
X:m×n矩阵,输入变量/特征
Y
:
m
×
1
矩
阵
,
输
出
变
量
/
拟
合
目
标
Y:m times 1 矩阵,输出变量/拟合目标
Y:m×1矩阵,输出变量/拟合目标
m
:
样
本
数
m:样本数
m:样本数
n
:
特
征
个
数
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
其他
- 使用之前当然要先加入头文件 (Eigen下载)
#include <Eigen/Dense>
using namespace Eigen;
- 上文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;
- 欢迎提问评论,谢谢支持
最后
以上就是清脆金毛为你收集整理的Eigen库最小二乘拟合最小二乘公式Eigen实现其他的全部内容,希望文章能够帮你解决Eigen库最小二乘拟合最小二乘公式Eigen实现其他所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复