2012-07-19 101 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