因爲近期學業繁重QAQ,因此我就不說廢話了,直接上代碼~app
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()