機器學習 | 預測數值型數據:迴歸

由於近期學業繁重QAQ,所以我就不說廢話了,直接上代碼~

線性迴歸

圖片描述



局部加權線性迴歸

圖片描述


代碼

from numpy import *
import matplotlib.pyplot as plt

#標準迴歸函數和數據導入函數
#默認文本的最後一行爲目標值
#第一列爲偏移量,假定爲常數1.0
#第二列爲x1,也就是圖中的橫座標
def loadDataSet(fileName):
    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

#計算最佳擬合曲線
#.T標識矩陣的轉置
def standRegres(xArr,yArr):
    xMat=mat(xArr)
    #矩陣轉置,變程行向量
    yMat=mat(yArr).T
    #判斷xTx的轉置與xTx相乘是否爲0
    xTx=xMat.T*xMat
    #若爲0,那麼計算逆矩陣的時候會出錯
    if linalg.det(xTx)==0.0:
        print("this matrix is singular,cannot do inverse")
        return
    #計算ws
    #.I返回矩陣的逆
    ws=xTx.I*(xMat.T*yMat)
    return ws
    

#繪製數據集散點圖和最佳擬合直線圖
def drawFigure():
    xArr,yArr=loadDataSet('ex0.txt')
    ws=standRegres(xArr,yArr)
    xMat=mat(xArr)
    yMat=mat(yArr)
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])
    xCopy=xMat.copy()
    xCopy.sort(0)
    yHat=xCopy*ws
    ax.plot(xCopy[:,1],yHat)
    plt.show()
    
    
#局部加權線性迴歸
#給待預測的點附近的每個點賦予一定的權重
#在這個子集上基於最小均方差來進行普通的迴歸
#使用的核爲高斯核
#最終構建了一個只含對角元素的權重矩陣w,並且x與x(i)越近,
#w(i,i)將會越大
#局部加權線性迴歸函數
def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat=mat(xArr)
    yMat=mat(yArr).T
    m=shape(xMat)[0]
    #創建對角矩陣
    #權重矩陣是一個方陣,階數爲樣本點的個數
    #該矩陣爲每個樣本點初始化了一個權重
    weights=mat(eye((m)))
    #遍歷數據集,計算每個樣本點對應的權重值
    #隨着樣本點與待預測點距離的遞增,權重將以指數級衰減
    #參數k控制衰減的速度
    #權重值大小以指數級衰減
    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)
    #爲數據集中的每個點調用lwlr()
    for i in range(m):
        yHat[i]=lwlr(testArr[i],xArr,yArr,k)
    return yHat

def drawfigure2():
    xArr,yArr=loadDataSet('ex0.txt')
    #print(yArr[0])
    yHat0=lwlr(xArr[0],xArr,yArr,1.0)
    #print(yHat0)
    yHat=lwlrTest(xArr,xArr,yArr,0.01)
    xMat=mat(xArr)
    strInd=xMat[:,1].argsort(0)
    xSort=xMat[strInd][:,0,:]
    
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.plot(xSort[:,1],yHat[strInd])
    ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0],s=2,c='red')
    plt.show()
    
    
def main():
    drawfigure2()
    #drawFigure()
    #xArr,yArr=loadDataSet('ex0.txt')
    #ws=standRegres(xArr,yArr)
    #xMat=mat(xArr)
    #yMat=mat(yArr)
    #計算預測值yHat和真實值y的匹配程度——計算兩個序列的相關程度
    #yHat=xMat*ws
    #arr=corrcoef(yHat.T,yMat)
    #yHat與yMat的相關係數爲0.98
    #[[1.         0.98647356]
    #[0.98647356 1.        ]]
    #print(arr)
    #[[1.0, 0.067732], [1.0, 0.42781],...]
    #print(xArr)
    #[3.176513, 3.816464,...]
    #print(yArr)
    #[[3.00774324]
    #[1.69532264]]
    #Haty=wx[0]*x0+ws[1]*x1
    #print(ws)

if __name__=='__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章