2012-07-19 146 views
3

我的问题是讨论How to fit the 2D scatter data with a line with C++的延伸。现在我想进一步扩展我的问题:在估计符合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不同的结果,其依赖于矩阵计算。我现在在此发布实施并征求您的建议。你认为这是一个正确的实施?谢谢!

回答

1

如果你认为所有的点是“好数据”,那么这将是一个错误,根据您最初的适合他们的距离天真地进行加权。但是,抛弃“异常值”是一种相当普遍的做法:如果少数数据点难以置信地合理,并且您有理由相信存在可能会产生一小部分“不良”数据点的错误机制,那么您可以只需从数据集中移除难以置信的点即可更好地拟合。

至于数学而言,我会建议咬咬牙,试图找出矩阵数学。也许你可以找到一篇不同的文章,或者一本更好的介绍书。我不会在你的Matlab代码发表评论,只是说,它看起来像从part3减去part4当你将有一定的精度问题,而且很可能part2part1为好。

+0

这是一个很好的评论。我明白在矩阵数学上工作很重要。但是,这里的问题相当简单,并且可以在不依赖矩阵数学的情况下解决这个问题。 – feelfree 2012-07-20 07:32:15

0

不正是你所要求的,但你应该看看robust regression。 MATLAB具有功能robustfit(需要统计工具箱)。

甚至还有一个互动的演示中,你可以玩到比较常规的线性回归与稳健回归:

>> robustdemo 

这表明,在异常的情况下,稳健回归趋向于提供更好的结果。

screenshot