線性迴歸
簡介:之前的文章中介紹過一種迴歸算法,梯度下降算法,這裏再看看另外一個迴歸算法,線性迴歸,主要的內容包括簡單的線性迴歸和局部加權迴歸算法。
在迴歸裏面需要考慮的問題就是,我如何通過一堆訓練數據求出迴歸方程?例如通過房間的面積,體積,地理位置等信息預測房間的售價。在訓練數據中 面積、體積、地理位置我們統稱爲特徵值使用
簡單的線性迴歸
通過上面的推導得到的公式
具體算法:
from numpy import *
#xArr 爲 m x n 的一個數組
#yArr 爲 1 x m 的一個數組
def standRegres(xArr, yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T * xMat
if linalg.det(xTx) == 0.0 : ##說明xTx不可逆
return
ws = xTx.I * (xMat.T * yMat)
return ws
局部加權線性迴歸
上述的線性迴歸方法的一個問題是可能會出現欠擬合現象,它求的是最小誤差的估計,針對的是全局最小誤差,如果說模型本身就是一個欠擬合模型則不能通過上述方法取得最好的預測效果。爲了解決這個問題引出了局部加權線性迴歸,在這個算法中我們給待預測點附近的每個點賦予一定的權重值,然後再選出的附近子集的基礎上採用最小方差進行迴歸
算法實現
def lwlr(testPoint, xArr, yArr, k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
##構造一個對角矩陣
weights = mat(eys((m)))
for j in range(m):
diffMat = testPoint - xMat[j:]
weights[j,j] = exp(diffMat * diffMat.T/(-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) ==0.0:
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws
局部加權需要通過不斷調整k值,是預測結果儘量準確,不同的k值對預測結果影響很大,另外通過上面的算法實現可以看出局部加權線性迴歸存在一個問題即,在每次預測目標值時都需要回歸整個訓練數據集,所以計算量很大。