2013-02-06 9 views
6
cvSolve może rozwiązać liniową metodę najmniejszych kwadratów problemem

OpenCV jest tak:ważona liniowych najmniejszych kwadratów w 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 

Jednak chciałbym zastosować różne wagi do moich punktów danych. Jak zastosować wagi?

Odpowiedz

4

I okazało się, że nie jest rzeczywiście takie trudne:

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

ten fragment po prostu mnoży zarówno lewą i prawą stronę równania liniowego o masie wagowo. Termin błędu dla próbki i jest skutecznie pomnożony przez w².

+0

co to jest moja_ja_wartość, moja_x1_wartość i moja_x2_wartość? – Abc

+0

Są one przeznaczone do podania wartości macierzy (x1, x2) i lewej strony (y). Jest to najbardziej ogólna forma, możesz przepisać kod i podać wartości w jakikolwiek sposób, który najbardziej ci odpowiada. Należy również zapoznać się z dokumentami OpenCV dla cvSolve. – Hendrik

Powiązane problemy