由于近期学业繁重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.TxMat #若为0,那么计算逆矩阵的时候会出错 if linalg.det(xTx)==0.0: print(“this matrix is singular,cannot do inverse”) return #计算ws #.I返回矩阵的逆 ws=xTx.I*(xMat.TyMat) 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=xCopyws 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(diffMatdiffMat.T/(-2.0k**2)) xTx=xMat.T*(weightsxMat) if linalg.det(xTx)==0.0: print(“This matrix is singular,cannot do inverse”) return #得到回归系数 ws=xTx.I(xMat.T*(weightsyMat)) return testPointwsdef 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 yHatdef 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()