2013-02-06 12 views
6

cvSolve der OpenCV kann eine lineare Least-Squares-Problem wie dieses lösen:gewichteten linearen kleinsten Quadrate in OpenCV

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

Allerdings würde Ich mag verschiedene Gewichte an meine Datenpunkte anzuwenden. Wie wende ich die Gewichte an?

Antwort

4

fand ich eigentlich gar nicht so schwierig ist es heraus:

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

Dieses Fragment multipliziert einfach sowohl auf die linke Seite und die rechte Seite der linearen Gleichung mit Gewicht w. Der Fehlerausdruck für die Stichprobe i wird effektiv mit w² multipliziert.

+0

Was ist my_y_value, my_x1_value und my_x2_value? – Abc

+0

Sie sollen die Werte für Ihre Matrix (x1, x2) und die linke Seite (y) angeben. Dies ist nur die allgemeinste Form, Sie können den Code neu schreiben und die Werte auf die für Sie am besten geeignete Weise bereitstellen. Sehen Sie sich auch die OpenCV-Dokumente für cvSolve an. – Hendrik

Verwandte Themen