2013-02-06 38 views
6

của OpenCV cvSolve có thể giải quyết một tuyến tính bình phương nhỏ nhất vấn đề như thế này:trọng tuyến tính bình phương nhỏ nhất trong 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 

Tuy nhiên, tôi muốn áp dụng trọng lượng khác nhau đến các điểm dữ liệu của tôi. Làm cách nào để áp dụng trọng số?

Trả lời

4

tôi phát hiện ra nó thực sự không phải là khó khăn:

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

đoạn này chỉ đơn giản là sẽ nhân cả hai bên trái và bên phải của phương trình tuyến tính với trọng lượng w. Thuật ngữ lỗi cho mẫu i được nhân với hiệu quả bởi w².

+0

my_y_value, my_x1_value và my_x2_value là gì? – Abc

+0

Chúng có nghĩa là cung cấp các giá trị cho ma trận của bạn (x1, x2) và bên trái (y). Đây chỉ là hình thức chung nhất, bạn có thể viết lại mã và cung cấp các giá trị theo cách nào phù hợp nhất với bạn. Ngoài ra, hãy chắc chắn xem các tài liệu OpenCV cho cvSolve. – Hendrik

Các vấn đề liên quan