OpenCV中的加权线性最小二乘法

6

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

但是,我希望对我的数据点应用不同的权重。我该如何应用这些权重?

1个回答

4
我发现其实并不难:

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 是什么? - Abc
它们旨在为您的矩阵(x1,x2)和左侧(y)提供值。这只是最一般的形式,您可以重写代码并以最适合您的方式提供值。还要确保查看OpenCV文档以获取cvSolve的详细信息。 - Hendrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接