是否有等效于 gsl_multifit_wlinear() 的特征C++库

Is there an Eigen C++ library equivalent to gsl_multifit_wlinear()?

本文关键字:特征 C++ wlinear multifit gsl 是否      更新时间:2023-10-16

我正在尝试将一些较旧的 GSL 代码移植到仅使用标头特征库。 我这样做是一些数据科学家的副业,因此我的数学自大学以来就有点失效了。 我正在尝试查看是否有等效的函数或模块,甚至是 gsl_multifit_wlinear() 函数调用的更通用的线性代数术语。 它看起来像一个最小二乘曲线拟合函数。

如果有一种方法可以直接转换它,那会是什么?

如果没有,是否有其他库可供我使用? 请记住,它不能有GPL或类似的"共享所有代码"许可证。 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相同

假设你已经有 X、y、w> 的 Eigen::Matrix<...,这应该可以工作:

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

有关求解本征最小二乘问题的更多信息,请访问 http://eigen.tuxfamily.org/dox-devel/group__LeastSquares.html