Weighted Linear Least Squares in OpenCV

OpenCV cvSolve can solve the linear least-squares problem, for example:

 // 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 

However, I would like to apply different weights to my data. How to apply weights?

+6
source share
1 answer

I found out that this is actually not that difficult:

 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); 

This fragment simply multiplies both the left and right sides of the linear equation with weight w. The number of errors for sample i effectively multiplied by w².

+4
source

All Articles