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

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()

相关推荐