乐趣区

机器学习 | 预测数值型数据:回归

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

退出移动版