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
但是,我想对我的数据点应用不同的权重。如何应用权重?
答案 0 :(得分: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²。