1、綱要python
線性迴歸的正規方程解法算法
局部加權線性迴歸app
2、內容詳述函數
一、線性迴歸的正規方程解法 線性迴歸是對連續型的數據進行預測。這裏討論的是線性迴歸的例子,對於非線性迴歸先不作討論。這部份內容咱們用的是正規方程的解法,理論內容在以前已經解釋過了,正規方程爲θ = (XT·X)-1·XT·y。值得注意的是這裏須要對XT·X求逆矩陣,所以這個方程只有在逆矩陣存在的時候才適用,因此須要在代碼中進行判斷。this
from numpy import * import matplotlib.pyplot as plt def loaddataSet(filename): numfeat = len(open(filename).readline().split('\t'))-1 dataMat = [];labelsVec = [] file = open(filename) for line in file.readlines(): lineArr = [] curLine = line.strip().split('\t') for i in range(numfeat): lineArr.append(float(curLine[i])) dataMat.append(lineArr) labelsVec.append(float(curLine[-1])) return dataMat,labelsVec def standRegression(xArr,yArr): xMat = mat(xArr);yMat = mat(yArr) xTx = xMat.T * xMat if linalg.det(xTx)==0.0: print('this matrix is singular,cannot do inverse\n') return sigma = xTx.I * (xMat.T * yMat.T) return sigma
loaddataSet()函數是將文本數據分紅特徵集和標籤。standRegression()是利用正規方程求迴歸係數sigma,固然在使用正規方程前須要判斷其是否有逆矩陣。這種解法很簡單,可是它的缺點我也在以前的理論部分說過了。下面咱們來看擬合的結果,利用PlotLine()函數來畫圖。注意這個函數的傳入參數xMay和yMat須要爲矩陣形式code
def PlotLine(xMat,yMat,sigma): ax = plt.subplot(111) ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0]) xCopy = xMat.copy() xCopy.sort(0) yHat = xCopy*sigma ax.plot(xCopy[:,1],yHat) plt.show()
咱們獲得的擬合直線如圖所示,這看起來有點欠擬合的狀態。若是用另一個數據集,獲得的擬合直線也是這樣的,這也是咱們不但願的結果ip
因此,咱們後面對該方法進行改進,對迴歸係數進行局部加權處理。這裏的方法叫作局部加權線性迴歸(LWLR)get
二、局部加權線性迴歸it
該算法中,咱們給待預測點附近的每一個店賦予必定的權重,而後在其上基於最小均方差進行普通的線性迴歸。其正規方程變爲 θ=(XTX)-1XTWy。這裏的W爲權重。LWLR使用「核」來對附近的點賦予更高的權重,最經常使用的就是高斯核,其權重爲。這樣就構建了只含對角元素的權重矩陣,而且點x與x(i)越近,權重越大。io
def lwlr(testPoint,xArr,yArr,k = 1.0): xMat = mat(xArr);yMat = mat(yArr).T m = shape(xMat)[0] weights = mat(eye(m)) for i in range(m): diffMat = testPoint - xMat[i,:] weights[i,i] = exp(diffMat * diffMat.T/(-2.0*k**2)) xTWx = xMat.T * (weights*xMat) if linalg.det(xTWx)==0.0: print('this matrix is singular,cannot do inverse\n') return sigma = xTWx.I * (xMat.T * (weights * yMat)) return testPoint * sigma 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
lwlr()函數即爲局部加權線性迴歸法的代碼,lwlrTest()函數的做用是使lwlr()函數遍歷整個數據集。咱們一樣須要畫出圖來看擬合結果
def PlotLine1(testArr,xArr,yArr,k = 1.0): xMat = mat(xArr) yMat = mat(yArr) yHat = lwlrTest(testArr,xArr,yArr,k) srtInd = xMat[:,1].argsort(0) xsort = xMat[srtInd][:,0,:] ax = plt.subplot(111) ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0],s = 2,c = 'red') ax.plot(xsort[:,1],yHat[srtInd]) plt.show()
當 k=1.0 k=0.01 k=0.003
k=1.0就是前面的欠擬合狀態,而k=0.003就是過擬合狀態了,因此當k=0.01時纔是比較好的迴歸。
數據集和代碼下載地址:http://pan.baidu.com/s/1i5AayXn