机器学习算法-------线性回归法

算法概述

线性回归其实是一种比较基础的回归算法,他假设特征与最后的结果之间存在某种线性关系,他通过最小化损失函数(平方误差),来获取最优的系数值和截距值,主要通过最小二乘法,对函数求偏导从而获取他的极值点,来最小化损失函数,线性回归有直接的正规方程解,所以可以直接得到系数矩阵,但复杂度相对较高,当然也可以通过梯度下降法解决这个问题,另外,线性回归最小二乘准则的损失函数,是由唯一最优解的。

最小二乘法与梯度下降之间的关系

引自知乎:
链接:https://www.zhihu.com/question/20822481/answer/37362968

通常我们所说的狭义的最小二乘,指的是在线性回归下采用最小二乘准则(或者说叫做最小平方),进行线性拟合参数求解的、矩阵形式的公式方法。所以,这里的「最小二乘法」应叫做「最小二乘算法」或者「最小二乘方法」,百度百科「最小二乘法」词条中对应的英文为「The least squaremethod」。这里,基于线性回归,有两个细节比较重要:
  第一,线性回归的模型假设,这是最小二乘方法的优越性前提,否则不能推出最小二乘是最佳(即方差最小)的无偏估计,具体请参考高斯-马尔科夫定理。特别地,当随机噪声服从正态分布时,最小二乘与最大似然等价。  
  第二,由于是线性回归/拟合,因此可以很容易的求出全局最优的闭式解close form solution,也即我们通常看到的那几个矩阵形式,给了input data可以一步到位算拟合参数,而不是像梯度下降法或者牛顿法那样一点点地迭代优化调参最后到达极值点。  

而广义的最小二乘,指的是上文提到过的最小二乘准则,本质上是一种evaluation rule或者说objective funcion,这里的「最小二乘法」应叫做「最小二乘法则」或者「最小二乘准则」,英文可呼为LSE(least square error)。  举个例子,我要优化一个深度神经网络DNN(Deep neural network)的网络参数(换言之,优化此网络对于已知数据拟合结果的正确性),可不可以用最小二乘准则去衡量某一拟合结果相对于标准答案的偏差程度呢?可以。而同时,由于DNN模型本身的复杂性,我们没有办法像线性拟合时那样,在理论和公式的层面求出一个close form solution,因此需要引入所谓的BP算法(实质上就是梯度下降法)进行参数的迭代求解。  But(^_^),上面虽然给出了最小二乘准则+梯度下降法串联使用的例子,但实际的拟合效果必定会比较一般,原因在于DNN这一体系相当于非线性回归,因此最小二乘不好,反而是logistic回归+最大似然=交叉熵准则Cross Entropy在DNN参数优化算法中的更有效和广泛一些。当然,这就是另一个话题了。

综上:狭义的最小二乘方法,是线性假设下的一种有闭式解的参数求解方法,最终结果为全局最优;  

梯度下降法,是假设条件更为广泛(无约束)的,一种通过迭代更新来逐步进行的参数优化方法,最终结果为局部最优;  

广义的最小二乘准则,是一种对于偏差程度的评估准则,与上两者不同。

手动实现简单的线性回归

一元线性回归代码(py文件)

import numpy as np


class SimpleLinearRegression1:

    def __init__(self):
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        assert x_train.ndim == 1, \
            "Simple Linear Regressor can only solve single feature training data."
        assert len(x_train) == len(y_train), \
            "the size of x_train must be equal to the size of y_train"
        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)
        ''' 
        num = 0.0
        d = 0.0
        for x, y in zip(x_train, y_train):
            num += (x - x_mean) * (y - y_mean)
            d += (x - x_mean) ** 2
        '''
        #下面为向量化,利用向量化进行直接点积相比上面for循环效率快很多
        self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
        self.b_ = y_mean - self.a_ * x_mean

        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值