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

1 に答える 1

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² で乗算されます。

于 2013-02-07T09:14:01.147 に答える