是否有一个等效于gsl_multifit_wlinear()的Eigen C ++库?

时间:2015-04-18 20:13:56

标签: c++ linear-algebra eigen gsl

我正在尝试将一些旧的GSL代码移植到仅使用标头的Eigen库。我这样做是为了让一些数据科学家担任副业,因此我的数学课程从大学开始就已经失效了。我正在尝试查看gsl_multifit_wlinear()函数调用是否存在等效函数或模块,甚至是更一般的线性代数项。它看起来像一个最小二乘曲线拟合函数。

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

如果没有,我可以使用另一个库吗?请记住,它必须没有GPL或类似的“共享所有代码”许可证。麻省理工学院或BSD是首选,LGPL和Mozilla / Apache也可以。

感谢。

1 个答案:

答案 0 :(得分:3)

看起来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< ...> of of 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