由於近期學業繁重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()