前言
回顧一下 回歸(一)中的 標准線性回歸:
數學表達

其中x是查詢點,xi是第i個訓練數據,k是一個需要調節的參數,它控制了訓練點距離查詢點衰減速率,越小,衰減速率越快。
代碼實現
# -*- coding: utf-8 -*-
"""
author: Alan
date:2016/4/3
局部加權線性回歸,參考《機器學習實戰》
"""
from numpy import *
def loadDataSet():
fileName = 'D:\Files\python\Ch08\ex0.txt'
numFeat = len(open(fileName).readline().split('\t'))-1
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr = []
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat, labelMat
def lwlr(testPoint, xArr, yArr, k = 1.0):
'''
the algorithm of lwlr
'''
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):
num = shape(testArr)[0]
yHat = zeros(num)#存儲預測的label
for i in range(num):
yHat[i] = lwlr(testArr[i], xArr, yArr, k)
return yHat
#繪制估計的點和原始點的對比圖
#k控制訓練點距離查詢點的衰減速率,越小,衰減越快
def plotData(k):
xArr, yArr = loadDataSet()
#用lwlr對整個數據集進行估計
yHat = lwlrTest(xArr, xArr, yArr, k )
import matplotlib.pyplot as plt
xMat = mat(xArr)
srtInd = xMat[:, 1].argsort(0)#從小到大排序
xSort = xMat[srtInd][:, 0, :]
#繪制估計出的點構成的曲線
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xSort[:, 1], yHat[srtInd])
#繪制原始點的散點圖
ax.scatter(xMat[:, 1], mat(yArr), s = 2, c = 'red')
plt.show()
總結
最小,其中W(i)為權重值
step3:預測輸出:wx
step4:對於新的輸入,重復1-3
從步驟中可以看出,這個算法是一個非參數學習算法( non-parametric learning algorithm),非參數學習算法每次預測值的時候都要重新訓練數據得到新的參數值才能計算預測輸出。算法所需要的計算量根據需要查詢的輸入的數量呈線性增加。
與之對應地,標准線性回歸是一種參數學習算法(parametric learning algorithm), 有固定的(指的是:值的大小是固定)、有限的參數,通過訓練樣本,找到合適的參數后,對於之后未知的輸入,我們可以直接利用這組參數得出其相應的預測輸出。
上面的推導和代碼實現中的LWLR還存在一個很明顯的問題,每次對數據集重新訓練都要使用整個數據集。而事實上,隨着K的變小,遠離查詢點的數據的權重趨近於0。如果可以避免這些重復且對結果沒有影響的計算將會大大減少計算量。所以這里可以像KNN一樣只考慮領域中有限的N個訓練點,實現真正的“局部”,那么誤差准則可以變為:
參考文獻
http://blog.csdn.net/allenalex/article/details/16370245
http://www.cnblogs.com/JiePro/p/MachineLearning_2.html
《機器學習實戰》
《機器學習》Tom M. Mitchell



