深度学习——回归算法Regression

同样是监督算法,回归是求解连续值的相关关系,分类是对离散值的划分。
深度学习——回归算法Regression_第1张图片
图1
如图1,我们想要模拟离散点的走势。

一、一元线性回归
一元线性回归就是假设拟合曲线是一条直线,现在求解这条直线方程。
假设
在这里插入图片描述
那么如何使得这条曲线拟合,那么就要提出均方误差

二、均方误差
均方误差就是用二次方来衡量真实值和预测值直接的距离,然后再在所有样本上取平均。
公式如下:
在这里插入图片描述
为什么是均方误差?
基本假设

  • g(x)是f(x)的估计
  • r’ = g(x) + ε
  • 假设 ε 服从均值为0,方差为σ^2的高斯分布
  • 那么显然的g(x) + ε 满足均值为g(x),方差为σ^2的高斯分布

极大似然估计

  • 对于估计值的参数值,即求在r’发生的情况下,x的最大似然估计
  • 计算样本集上的似然函数
    深度学习——回归算法Regression_第2张图片
  • b部分为常数,不影响最大值点
  • 因为p(r|x) ~ N(g(x),σ^2),所以
    深度学习——回归算法Regression_第3张图片
  • 化简出的式子中A为常数,那么最后最大化 L 意味着最大化B部分,也就是最小化 -B,也就是均方误差。
  • 如果分布不再是高斯分布,那么均方误差不再管用

三、多元线性回归
表达式的y仍然是一维,而x变成多维
深度学习——回归算法Regression_第4张图片

  • 矩阵表示
    在这里插入图片描述
  • 然后把x,y都用矩阵表示
    深度学习——回归算法Regression_第5张图片
  • Loss损失值也要矩阵表示
    在这里插入图片描述
  • 求解Loss的方式如下:
    在这里插入图片描述
    由于矩阵表示将w和b放一起,因此只需要写一个十式子。
  • 对w的求解结果即:
    在这里插入图片描述
    可见式子中需要求逆矩阵,但是不是满秩情况下是不存在逆矩阵的。

那么该怎么办呢?
(摘自:原文链接:https://blog.csdn.net/exuejwa/article/details/54982657)为了降低预测的均方误差,可以在估计中引入一些偏差,其中一个方法是局部加权线性回归(Locally Weighted Linear Regression, LWLR)。如果数据的特征比样本点还多,也就是说输入数据的矩阵X不是满秩矩阵,非满秩矩阵在求逆时会出现问题。为了解决这个问题,可以使用岭回归(ridge regression)、lasso法、前向逐步回归。
岭回归:在矩阵 X T X^T XTX上加一个 λ I λI λI从而使得矩阵非奇异,进而能对 X T X^T XTX+ λ I λI λI求逆。其中矩阵 I I I是一个m*m的单位矩阵,对角线上元素全为1,其他元素全为0。而 λ λ λ是一个用户定义的数值。在这种情况下,回归系数的计算公式将变成:
w ^ = ( X T X + λ I ) − 1 X T y \widehat{w}=(X^{T}X+\lambda I)^{-1}X^Ty w =(XTX+λI)1XTy
岭回归最先用来处理特征数多余样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入 λ λ λ来限制了所有w之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减(shrinkage)。
一旦发现模型和测量值之间存在差异,就说出现了误差。当考虑模型中的“噪声”或者说误差时,必须考虑其来源。训练误差和测试误差由三个部分组成:偏差、测量误差和随机噪声。
方差是可以度量的。取出两组随机样本集并拟合,得到两组回归系数。两组回归系数之间的差异大小就是模型方差大小的反映。

基本的回归算法Python代码如下:

import numpy as np
import scipy

def regression(data_matrix,label):
    """
    回归算法
    :param data_matrix:
    :param label:
    :return:
    """
    #数据数量
    data_num=len(data_matrix)
    #生成一个全为1的列
    one_col=np.array([1 for i in range(data_num)])
    one_col.resize(len(one_col),1)
    #把全为1的列加到数据矩阵的最后一列
    data_matrix=np.concatenate((data_matrix,one_col),axis=1)

    #把数据转置
    data_matrix_t=scipy.transpose(data_matrix)

    #把矩阵的转置和数据矩阵乘积
    mul_result=data_matrix_t.dot(data_matrix)

    #乘积的逆
    mul_result=np.linalg.inv(mul_result)

    return mul_result.dot(data_matrix_t).dot(label)

你可能感兴趣的:(深度学习,机器学习,深度学习,人工智能)