機器學習python實戰----線性迴歸

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

相關文章
相關標籤/搜索