huangrunqing 2019-07-01
由于近期学业繁重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()