回归预测(7)

当我们拥有2021年每月降水量,想要获得2022年每月降水量时,首先想到的就是估计降水量与各月的函数关系,从而预测未知月份的降水量。

而解决上述问题,首先想到的算法就是--最小二乘

构建如y=Bx的函数关系,可以展开成y=b0*cosx+b1*x+b2*tanx+……,x为解决该问题的基函数,B为对应每项基函数的系数阵,而最小二乘求解的方式也很简单:

B=(x^{T}*x)^{-1}*x^{T}*y

在求解得到系数阵后,对于新得到的x就能成功预测新的y值,代码实现如下:

def standRegres(xArr,yArr):
    #输入:xArr--基函数值,yArr--预测对象值
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat
    if linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")    #奇异矩阵
        return
    ws = xTx.I * (xMat.T*yMat)
    return ws

而简单最小二乘没法解决所有问题,例如在影响因子A,B,C,D中,可能待预测目标受A的影响最大,而D对目标的影响很小,采用简单最小二乘对其一概而论就不再适用。这时就需要引入权重因子P,对每个影响因子的干扰定不同的权重P(A)、P(B)、P(C)、P(D),则函数模型变为:

B=(x^{T}*P*x)^{-1}*x^{T}*P*y

 而权重可以通过不同的权函数来进行计算获取,代码实现如下:

def lwlr(xArr,yArr,k=1.0):
    #输入:xArr--影响因素;yArr--预测目标;k--权函数参数
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    weights = mat(eye((m)))
    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 ws

但当影响因素的个数大于样本个数时,即该样本无法完成影响因素的描述,换言之系数阵秩亏。则需要去除几个与样本关系不紧密的影响因素,也就是缩减系数,通常的方法有岭回归。也就是在简单最小二乘中引入岭参数\lambda,计算公式如下:

B=(x^{T}*x+\lambda*E)^{-1}*x^{T}*y

代码实现如下:

def ridgeRegres(xMat,yMat,lam=0.2):
    #输入:xMat、yMat--与之前相似,lam--岭参数
    xTx = xMat.T*xMat
    denom = xTx + eye(shape(xMat)[1])*lam
    if linalg.det(denom) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    ws = denom.I * (xMat.T*yMat)
    return ws

除了岭回归外,还可以采用--前向逐步回归

迭代确定权值,直至误差最小。代码实现如下:

def stageWise(xArr,yArr,eps=0.01,numIt=100):
    #输入:xArr,yArr--自变量与预测目标;eps--容许误差;numIt--迭代次数
    xMat = mat(xArr); yMat=mat(yArr).T
    yMean = mean(yMat,0)
    yMat = yMat - yMean
    xMat = regularize(xMat)    #重心化处理
    m,n=shape(xMat)
    returnMat = zeros((numIt,n))
    ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy()
    for i in range(numIt):
        print(ws.T)
        lowestError = inf
        for j in range(n):
            for sign in [-1,1]:
                wsTest = ws.copy()
                wsTest[j] += eps*sign
                yTest = xMat*wsTest
                rssE = rssError(yMat.A,yTest.A)
                if rssE < lowestError:
                    lowestError = rssE
                    wsMax = wsTest
        ws = wsMax.copy()
        returnMat[i,:]=ws.T
    return returnMat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer回归预测是一种基于Transformer模型的机器学习方法,用于解决回归问题。Transformer模型是一种基于自注意力机制的神经网络模型,最初用于自然语言处理任务,如机器翻译和文本生成。但是,由于其强大的建模能力和并行计算的优势,Transformer模型也被应用于其他领域,包括回归预测。 在Transformer回归预测中,输入数据通常是一个向量或矩阵,表示待预测的特征。这些特征可以是时间序列数据、图像数据或其他类型的数据。Transformer模型通过多层的自注意力机制和前馈神经网络来学习输入数据之间的关系,并输出一个连续值作为预测结果。 与传统的回归方法相比,Transformer回归预测具有以下优势: 1. 并行计算:Transformer模型可以并行计算输入数据中不同位置的特征,从而加快训练和推理的速度。 2. 长程依赖建模:Transformer模型使用自注意力机制来捕捉输入数据中不同位置之间的长程依赖关系,有助于提高预测的准确性。 3. 可扩展性:Transformer模型可以通过增加层数和隐藏单元数来增加模型的容量,从而适应更复杂的回归任务。 然而,Transformer回归预测也存在一些挑战: 1. 数据量要求高:Transformer模型通常需要大量的训练数据来获得良好的性能,特别是在复杂的回归任务中。 2. 超参数选择:Transformer模型有许多超参数需要调整,如层数、隐藏单元数和学习率等,选择合适的超参数对于模型的性能至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值