是否有等效于 gsl_multifit_wlinear() 的 Eigen C++ 库?
Is there an Eigen C++ library equivalent to gsl_multifit_wlinear()?
我正在尝试将一些较旧的 GSL 代码移植到仅使用 header 的 Eigen 库。我正在为一些数据科学家做这方面的副业,因此我的数学自从大学以来就有点落后了。我正在尝试查看 gsl_multifit_wlinear() 函数调用是否有等效的函数或模块,甚至更一般的线性代数术语。它看起来像一个least-squares曲线拟合函数。
如果有直接转换的方法,会是什么?
如果没有,我可以使用另一个库吗?请记住,它不能有 GPL 或类似的 "share all code" 许可证。 MIT或BSD优先,LGPL和Mozilla/Apache也可以。
谢谢。
看起来 gsl_multifit_linear(X,y,c)
解决了问题 min_c ||Xc-y||^2
。我实际上不是 100% 从文档中确定,但看起来 gsl_multifit_wlinear(X,y,w,c)
解决了 min_c ||Xc - y||^2_W
其中 W = diag(w)
和 ||e||^2_W = e'*W^(-1)*e
.
因此,您可以通过将 min_c ||Xc - y||^2_W
重写为 min_c ||W^(-1/2) (Xc - y)||^2
.
在 Eigen 中解决此问题
我们必须:
- 计算 W^(-1/2),它恰好与元素 W(i,i) = 1/sqrt(w(i)) 成对角线。
- 计算 A = W^(-1/2)*X 和 b = W^(-1/2)*y
- 求解
min ||Ac - b||^2
,在最小二乘意义上等同于求解Ac = b
假设您已经拥有 Eigen::Matrix<...> X, y, w:
那么这应该可以工作
Eigen::VectorXd inv_sqrtw = 1.0 / w.array().sqrt();
Eigen::MatrixXd W12 = inv_sqrtw.asDiagonal();
Eigen::MatrixXd A = W12 * X;
Eigen::VectorXd b = W12 * y;
// now solve system
Eigen::VectorXd c = A.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);
你的答案在c
有关在 Eigen 中解决最小二乘问题的更多信息位于 http://eigen.tuxfamily.org/dox-devel/group__LeastSquares.html
我正在尝试将一些较旧的 GSL 代码移植到仅使用 header 的 Eigen 库。我正在为一些数据科学家做这方面的副业,因此我的数学自从大学以来就有点落后了。我正在尝试查看 gsl_multifit_wlinear() 函数调用是否有等效的函数或模块,甚至更一般的线性代数术语。它看起来像一个least-squares曲线拟合函数。
如果有直接转换的方法,会是什么?
如果没有,我可以使用另一个库吗?请记住,它不能有 GPL 或类似的 "share all code" 许可证。 MIT或BSD优先,LGPL和Mozilla/Apache也可以。
谢谢。
看起来 gsl_multifit_linear(X,y,c)
解决了问题 min_c ||Xc-y||^2
。我实际上不是 100% 从文档中确定,但看起来 gsl_multifit_wlinear(X,y,w,c)
解决了 min_c ||Xc - y||^2_W
其中 W = diag(w)
和 ||e||^2_W = e'*W^(-1)*e
.
因此,您可以通过将 min_c ||Xc - y||^2_W
重写为 min_c ||W^(-1/2) (Xc - y)||^2
.
我们必须:
- 计算 W^(-1/2),它恰好与元素 W(i,i) = 1/sqrt(w(i)) 成对角线。
- 计算 A = W^(-1/2)*X 和 b = W^(-1/2)*y
- 求解
min ||Ac - b||^2
,在最小二乘意义上等同于求解Ac = b
假设您已经拥有 Eigen::Matrix<...> X, y, w:
那么这应该可以工作Eigen::VectorXd inv_sqrtw = 1.0 / w.array().sqrt();
Eigen::MatrixXd W12 = inv_sqrtw.asDiagonal();
Eigen::MatrixXd A = W12 * X;
Eigen::VectorXd b = W12 * y;
// now solve system
Eigen::VectorXd c = A.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);
你的答案在c
有关在 Eigen 中解决最小二乘问题的更多信息位于 http://eigen.tuxfamily.org/dox-devel/group__LeastSquares.html