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