1. 程式人生 > >模型樹——就是回歸樹的分段常數預測修改為線性回歸 對於非線性回歸有較好的預測效果

模型樹——就是回歸樹的分段常數預測修改為線性回歸 對於非線性回歸有較好的預測效果

too 實現 ops ann targe class ast asi 最小

說完了樹回歸,再簡單的提下模型樹,因為樹回歸每個節點是一些特征和特征值,選取的原則是根據特征方差最小。如果把葉子節點換成分段線性函數,那麽就變成了模型樹,如(圖六)所示:

技術分享

(圖六)

(圖六)中明顯是兩個直線組成,以X坐標(0.0-0.3)和(0.3-1.0)分成的兩個線段。如果我們用兩個葉子節點保存兩個線性回歸模型,就完成了這部分數據的擬合。實現也比較簡單,代碼如下:

[python] view plain copy
  1. def linearSolve(dataSet): #helper function used in two places
  2. m,n = shape(dataSet)
  3. X = mat(ones((m,n))); Y = mat(ones((m,1)))#create a copy of data with 1 in 0th postion
  4. X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]#and strip out Y
  5. xTx = X.T*X
  6. if linalg.det(xTx) == 0.0:
  7. raise NameError(‘This matrix is singular, cannot do inverse,\n\
  8. try increasing the second value of ops‘)
  9. ws = xTx.I * (X.T * Y)
  10. return ws,X,Y
  11. def modelLeaf(dataSet):#create linear model and return coeficients
  12. ws,X,Y = linearSolve(dataSet)
  13. return ws
  14. def modelErr(dataSet):
  15. ws,X,Y = linearSolve(dataSet)
  16. yHat = X * ws
  17. return sum(power(Y - yHat,2))

代碼和樹回歸相似,只不過modelLeaf在返回葉子節點時,要完成一個線性回歸,由linearSolve來完成。最後一個函數modelErr則和回歸樹的regErr函數起著同樣的作用。

謝天謝地,這篇文章一個公式都沒有出現,但同時也希望沒有數學的語言,表述會清楚。

數據ex00.txt:

0.036098 0.155096

xxx

轉載請註明來源:http://blog.csdn.net/cuoqu/article/details/9502711

參考文獻:

[1] machine learning in action.Peter Harrington

模型樹——就是回歸樹的分段常數預測修改為線性回歸 對於非線性回歸有較好的預測效果