2013-02-06 68 views
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 

不過,我想不同的權重應用到我的數據點。我如何使用重量?

回答

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²。

+0

什麼是my_y_value,my_x1_value和my_x2_value? – Abc

+0

它們旨在爲您的矩陣(x1,x2)和左側(y)提供值。這只是最一般的形式,您可以重寫代碼並以最適合您的方式提供值。另外請務必查看cvSolve的OpenCV文檔。 – Hendrik