2D数据点集的加权线性最小二乘法

时间:2012-07-19 15:26:06

标签: c++ algorithm matlab statistics mathematical-optimization

我的问题是讨论的延伸How to fit the 2D scatter data with a line with C++。现在我想进一步扩展我的问题:当估计适合2D散射数据的线时,如果我们能够以不同方式处理每个2D散射数据会更好。也就是说,如果散点远离线,我们可以给点低权重,反之亦然。因此,问题就变成:给定一个2D散点点阵列及其加权因子,我们如何估计通过它们的线性线?可以在本文(weighted least regression)中找到此方法的良好实现。但是,该文中算法的实现过于复杂,因为它涉及矩阵计算。因此,我试图找到一种没有矩阵计算的方法。该算法是simple linear regression的扩展,为了说明算法,我编写了以下MATLAB代码:

function line = weighted_least_squre_for_line(x,y,weighting);


part1 = sum(weighting.*x.*y)*sum(weighting(:));

part2 = sum((weighting.*x))*sum((weighting.*y));

part3 = sum( x.^2.*weighting)*sum(weighting(:));

part4 = sum(weighting.*x).^2; 

beta = (part1-part2)/(part3-part4);

alpha = (sum(weighting.*y)-beta*sum(weighting.*x))/sum(weighting);

a = beta;
c = alpha;
b = -1;
line = [a b c];

在上面的代码中,x,y,weighting分别代表x坐标,y坐标和加权因子。我用几个例子测试算法,但仍然不确定它是否正确,因为这个方法得到的结果与Polyfit不同,后者依赖于矩阵计算。我现在在这里发布实施并征求您的意见。你认为这是一个正确的实施吗?谢谢!

3 个答案:

答案 0 :(得分:3)

如果您认为减重远离线的点是个好主意,您可能会被http://en.wikipedia.org/wiki/Least_absolute_deviations吸引,因为计算此值的一种方法是通过http://en.wikipedia.org/wiki/Iteratively_re-weighted_least_squares,这会减少重量到远离线的点。

答案 1 :(得分:1)

如果你认为你的所有积分都是“好数据”,那么根据它们与你最初拟合的距离来对它们进行天真的加权是错误的。然而,抛弃“异常值”是一种相当普遍的做法:如果一些数据点远远不合适,并且您有理由相信存在可能生成一小部分“坏”数据点的错误机制,那么您可以只需从数据集中删除难以置信的点即可获得更好的拟合。

就数学而言,我建议咬一口,试图找出矩阵数学。也许你可以找到一个不同的文章,或一本有更好的演示文稿的书。我不会评论你的Matlab代码,只是说从part4中减去part3时可能会遇到一些精度问题,而part2可能会part1减去{{1}}好。

答案 2 :(得分:0)

不完全是你要求的,但你应该研究robust regression。 MATLAB具有函数robustfit(需要统计工具箱)。

甚至可以使用交互式演示来比较常规线性回归与稳健回归:

>> robustdemo

这表明存在异常值时,稳健回归往往会产生更好的结果。

screenshot