【问题标题】:Is there an Eigen C++ library equivalent to gsl_multifit_wlinear()?是否有等效于 gsl_multifit_wlinear() 的 Eigen C++ 库?
【发布时间】:2015-04-18 20:13:55
【问题描述】:

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

如果有办法直接转换它,会是什么?

如果没有,我可以使用其他库吗?请记住,它不能有 GPL 或类似的“共享所有代码”许可证。首选 MIT 或 BSD,LGPL 和 Mozilla/Apache 也可以。

谢谢。

【问题讨论】:

    标签: c++ linear-algebra eigen gsl


    【解决方案1】:

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

    因此,您可以在 Eigen 中通过将 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

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

    【讨论】:

    • 非常感谢数学更新。我会试试这个,看看它是否有效并在那时接受。
    • 当然,如果不是,请告诉我
    • 似乎按建议工作,被接受。谢谢肖恩
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多