線性迴歸中的數學知識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()
代碼和數據均已上傳到,有須要的朋友能夠下載..