上節我們討論了標準的求迴歸係數的方法,今天我們來討論使用局部加權的方法求迴歸係數。對於線性迴歸有可能出現欠擬合現象。所以爲了避免這種情況的發生我們爲每個數據點引入一個權重來降低誤差,我們這裏計算權重的方法是使用高斯核公式計算。這裏使用的數據還是上一節的數據,有需要的可以到上一節下載。
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((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:
print "This matrix is singular, cannot do inverse"
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws
def lwlrTest(testArr,xArr,yArr,k=1.0):
m = shape(testArr)[0]
yHat = zeros(m)
for i in range(m):
yHat[i] = lwlr(testArr[i],xArr,yArr,k)
return yHat
第一個函數有四個輸入參數分別爲要測試的數據點,訓練數據集、標籤數據集和一個關鍵數據這是唯一一個需要用戶指定的數據,這個數據決定了對附近的點賦予多大的權重,改變它的值會改變擬合程度,在設計算法時可以改變它的值進行算法優化。下面創建一個對角權重矩陣。接下來的循環就是就是進行權重大小的計算,權重大小在計算過層中會以指數級衰減,求出權重值後面的代碼和標準迴歸算法相似,這裏不再過多解釋。
第二個函數就是對整個數據集進行預測