利用迴歸預測數值型數據

  1. 線性迴歸

        線性迴歸中的數學知識python

在線性迴歸中,最重要的莫過於在一大堆的數據中找回歸方程git

比較簡單的方法是,能夠利用最小二乘法尋找偏差最小的那條直線.github

利用最小二乘法計算loss能夠寫爲:spa

        

爲了找到loss最小的那條直線,咱們能夠對w求導,獲得code

        

        

所以求迴歸方程轉變爲求參數w.get

        實現代碼數學

def standRegres(xArr,yArr):
    xMat=np.mat(xArr)
    yMat=np.mat(yArr).T
    xTx=xMat.T*xMat
    if np.linalg.det(xTx)==0.0:
        print('error')
        return
    ws=xTx.I*(xMat.T*yMat)
    return ws

求出參數wit

        將回歸直線去擬合實際數據io

import matplotlib.pyplot as plt
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()

能夠看到雖然直線顯示了大概的趨勢,但並不能很好的去擬合數據,下面介紹一種強大的迴歸--""局部加權線性迴歸"",可解決上面這個擬合度不夠的問題.class

    2. 局部加權線性迴歸

        局部加權線性迴歸中的數學知識

相對於線性迴歸 , 局部加權的意思是對於每個特徵 , 都給添加一個權重 , 而後基於普通的最小均方差來進行迴歸.

這裏使用高斯核進行計算每個點的權重

        

對於w^的計算和上面相似,只是添加了權重w

        

        實現代碼

def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat=np.mat(xArr)
    yMat=np.mat(yArr).T
    m=np.shape(xMat)[0]
    weights=np.mat(np.eye((m)))
    for j in range(m):
        diffMat=testPoint-xMat[j,:]
        weights[j,j]=np.exp(diffMat*diffMat.T/(-2.0*k**2))
    xTx=xMat.T*(weights*xMat)
    if np.linalg.det(xTx)==0.0:
        print("error")
        return
    ws=xTx.I*(xMat.T*(weights*yMat))
    return testPoint*ws
def lwlrTest(testArr,xArr,yArr,k=1.0):
    m=np.shape(testArr)[0]
    yHat=np.zeros(m)
    for i in range(m):
        yHat[i]=lwlr(testArr[i],xArr,yArr,k)
    return yHat

        擬合效果

    

import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(xSort[:,1],yHat[srtInd])
ax.scatter(xMat[:,1].flatten().A[0],np.mat(yArr).T.flatten().A[0],s=2,c='red')
plt.show()

代碼和數據均已上傳到,有須要的朋友能夠下載..

GitHub

碼雲

相關文章
相關標籤/搜索