【问题标题】:Weighted linear least squares in OpenCVOpenCV中的加权线性最小二乘
【发布时间】:2013-02-06 15:59:47
【问题描述】:

OpenCV 的cvSolve 可以解决这样的线性最小二乘问题:

// model: y = a1*x1 + a2*x2 + a3
CvMat *y = cvCreateMat(N, 1, CV_64FC1);
CvMat *X = cvCreateMat(N, 3, CV_64FC1);
CvMat *coeff = cvCreateMat(3, 1, CV_64FC1);

// fill vector y and matrix X
for (int i=0; i<N; ++i)
{
    cvmSet(y, i, 0, my_y_value(i) );
    cvmSet(X, i, 0, my_x1_value(i) );
    cvmSet(X, i, 1, my_x2_value(i) );
    cvmSet(X, i, 2, 1 );
} 

cvSolve(X, y, coeff, CV_SVD);
// now coeff contains a1, a2, a3

但是,我想对我的数据点应用不同的权重。如何应用权重?

【问题讨论】:

    标签: c opencv least-squares


    【解决方案1】:

    我发现其实没那么难:

    for (int i=0; i<N; ++i)
    {
        double w = weight(i);
    
        cvmSet(y, i, 0, w * my_y_value(i) );
        cvmSet(X, i, 0, w * my_x1_value(i) );
        cvmSet(X, i, 1, w * my_x2_value(i) );
        cvmSet(X, i, 2, w );
    }
    
    cvSolve(X, y, coeff, CV_SVD);
    

    这个片段只是将线性方程的左侧和右侧与权重 w 相乘。样本i 的误差项有效地乘以 w²。

    【讨论】:

    • 什么是my_y_value、my_x1_value和my_x2_value?
    • 它们旨在为您的矩阵 (x1, x2) 和左侧 (y) 提供值。这只是最一般的形式,您可以重写代码并以最适合您的方式提供值。还请务必查看 cvSolve 的 OpenCV 文档。
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2012-08-29
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多