深度学习-线性回归

已知(其中n表示特征数量,m表示样本数量):

        1、特征样本

                 x = (x_{1}, x_{2},...,x_{n}) = \begin{pmatrix} x_{11} & x_{12} & ... & x_{1n}\\ x_{21} & x_{22} & ... & x_{2n}\\ ... & ... & ... & ... \\ x_{m1}& x_{m2} & ...& x_{mn} \end{pmatrix}_{(m*n)}

        2、标签样本

                y = \begin{pmatrix} y_{1}\\ y_{2}\\ ...\\ y_{m} \end{pmatrix}_{(m*1)}

        3、权重向量

                w = (w_{1},w_{2},...,w_{n})_{(1*n)}

        4、偏置

                b_{(1,)}

        5、关系:

                y = wx^{T} + b = w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} + b

线性回归:

        线性:因变量和自变量之间是线性关系

        回归:因变量是一个连续性变量

        训练:把权重w和偏置b求解出来

        推理:把除训练用到的x代入方程求解要预测的y

线性回归求解wb的方法:

        最小二乘法:

                y = xw^{T} + b\\ y = x_{1}w_{1} + ...+ x_{n}w_{n} + 1 * b\\ y = [ x_{1},..., x_{n},1][w_{1},..., w_{n},b]^{T}\\

                令:x = [ x_{1},..., x_{n},1],w = [ w_{1},..., w_{n},b]

                y = xw^{T} \\ x^{T}y = x^{T}xw^{T} \\ (x^{T}x)^{-1}x^{T}y = (x^{T}x)^{-1}x^{T}xw^{T}\\ w^{T} = (x^{T}x)^{-1}x^{T}y

                最小二乘法使用python实现模型的训练与预测代码如下:

                

import numpy as np

class MyLinearRegression(object):

    def __init__(self):
        #特征数量
        self.n_feature = None
        #w
        self.coef_ = None
        #b
        self.intercept_ = None
        #样本均值
        self.mean_ = None
        #样本方差
        self.std_ = None

    def fit(self,X,y):
        #变量转numpy
        X = np.array(X)
        y = np.array(y)
        #参数校验
        if X.ndim!=2 or y.ndim!=1 or X.shape[0] != y.shape[0]:
            raise ValueError("参数输入错误")
        #获取特征数量
        self.n_feature = X.shape[1]
        #获取样本均值
        self.mean_ = np.mean(X,axis=0)
        #获取样本方差
        self.std_ = np.std(X,axis=0) + 1e-9
        #样本数据标准化
        X = (X - self.mean_) / self.std_
        #调整矩阵形状
        y = y.reshape(-1,1)
        #拼接系数矩阵
        X = np.hstack(tup=(X,np.ones(X.shape[0],1)))
        #计算w = (w1,...,wn,b)
        w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
        #获取w
        self.coef_ = w.reshape(-1)[:-1]
        #获取b
        self.intercept_ = w.reshape(-1)[-1]

    def predict(self,X):
        #变量转numpy
        X = np.array(X)
        #参数校验
        if X.ndim!=2 or X.shape[1]!=self.n_feature:
            raise ValueError("参数错误")
        #数据预处理
        X = (X - self.mean_) / self.std_
        return (X.dot(self.coef_) + self.intercept_).reshape(-1)
        

        梯度下降法:

                1、任取w,b,已知              

                          y = xw^{T} + b\\ y = x_{1}w_{1} + ...+ x_{n}w_{n} + 1 * b\\ y = [ x_{1},..., x_{n},1][w_{1},..., w_{n},b]^{T}\\

                令:x = [ x_{1},..., x_{n},1],w = [ w_{1},..., w_{n},b]

                即:y = xw^{T}

               将已知 (x_{1}, x_{2},...,x_{n})代入  

                得到预测值为:

                        y_{pred }= \begin{pmatrix} y_{pred_{1}}\\ y_{pred_{2}}\\ ...\\ y_{pred_{m}} \end{pmatrix}

                此时样本真实值为:

                        y_{true }= \begin{pmatrix} y_{true_{1}}\\ y_{true_{2}}\\ ...\\ y_{true_{m}} \end{pmatrix}

                2、计算当前预测值与样本真实值误差统称为损失函数,有多种如下:          

损失函数公式特点对异常值敏感性可导性典型用途公式
MSE平方误差二阶可导一般回归任务\frac{1}{n}\sum_{i=1}^{m}(y_{true_{i}}- y_{pred_{i}})^{2}
MAE绝对误差零点不可导鲁棒回归\frac{1}{n}\sum_{i=1}^{m}|y_{true_{i}}- y_{pred_{i}}|
HuberMSE+MAE混合中等分段可导平衡鲁棒性与效率
Quantile非对称惩罚可调分段可导分位数回归
Log-Cosh平滑近似MSE中等二阶可导数值稳定优化
Max Error最大化绝对误差极高不可导极端值控制

                假设选择第一个损失函数MSE,所以可以得到损失函数为:

                loss = \frac{1}{n}\sum_{i=1}^{m}(y_{true_{i}}- y_{pred_{i}})^{2}

                假设损失函数loss与w = [ w_{1},..., w_{n},b]中的w_{1}的函数图像如图所示:

               

                要使的损失函数loss最小,就得通过一轮一轮的训练,每一轮计算函数当前w1

                对应的导数,判断当前点是否是最小值以及下一步w1的增大还是减小,直到训

                练到loss为相对最小值为止,其中w = [ w_{1},..., w_{n},b]中的其他w和b也类似。     

                梯度下降法使用python实现模型的训练与预测代码如下:   

                

import torch
import numpy as np
class MyLinearRegression(object):

    def __init__(self,max_iter=10000,learning_rate=1e-2):
        #初始化最大训练次数
        self.max_iter = max_iter
        #初始化学习率
        self.learning_rate = learning_rate
        #初始化特征个数
        self.n_featrue = None
        初始化w
        self.w = None
        初始化b
        self.b = None
        初始化损失值数组
        self.losses = []

    def fit(self,X,y):
        #赋值特征个数
        self.n_feature = X.size[1]
        #随机生成w,b
        self.w = torch.randn(size(self.n_feature,1),requires_gard=True)
        self.b = torch.zeros(size(1,),requires_gard=True)
        #训练循环
        for idx in range(self.max_iter):
            #正向传播
            y_pred = linear_regression(X)
            #求损失函数
            loss = self._get_loss(y_true=y,y_pred=y_pred)
            #反向传播(计算梯度)
            loss.backward()
            losses.append(loss.data.item())
            #优化一步
            self.w -= self.learning_rate * self.w.gard
            self.b -= self.learning_rate * self.b.gard
            #清空梯度
            self.w.gard.zero_()
            self.b.gard.zero_()
            #判断是否继续迭代   
            if len(losses) > 2:
                if np.abs(losses[-1] - losses[-2]) < 1e-6:
                    break

    def predict(self,X):
        return self._linear_regression(X)

    def _get_loss(self,y_true,y_pred):
        return ((y_true - y_pred) ** 2).mean()

    def _linear_regression(self,X):
        return self.w.dot(X) + self.b

                   使用pytorch深度学习框架对模型的训练基本步骤如下:

                        1、正向传播:由于当前已经随机生成了w,b,所以将训练样本x带入已知

                        线性方程y = wx^{T} + b计算出当前预测值。

                        2、计算损失函数:将预测值和训练样本真实值代入损失函数MSE中,得

                        到损失函数。

                        3、反向传播(计算梯度):pytorch框架计算当前损失函数的梯度值

                        4、优化参数一步(优化参数w,b):将当前w,b值更新到使损失函数更小一点的值,

                        即根据模型初始化时超参数学习率leraning_rate和梯度的乘积得出步伐大小和方向

                        5、清空梯度:重置损失函数对w,b的梯度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值