zoukankan      html  css  js  c++  java
  • 大白话解读梯度下降法解决一元线性回归

    1.一元线性回归与损失函数

    在我们解决一元线性回归进行拟合曲线的时候,常常会使用梯度下降法。

    假设我们的数据集为

    # 训练数据
    x_train = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    y_train = np.array([1, 3, 4, 5, 6, 7, 8, 9, 10])
    

    我们想将其拟合成一条曲线,然后进行训练。拟合曲线表示如下

    我们如何去拟合呢?显然两点确定一条直线的。我们就其次,然后求得一个函数,各个点到该函数的方差和最小,于是,我们将其称为损失函数(也叫代价函数、目标函数),该函数如下

    该方程为凸函数,并且有极小值。

    2.梯度下降法求解最小值

    我们解决一个函数的最小值的时候,往往会想到使用导数来求。但是,在多维数据,或者大数据情况下,这种求解方法不适用。

    于是,我们有了一个新的方法。

    例题:求解y = x^2的极小值

    1.我们可以随机取一个点m,假设取到了10, 那么我们显然偏离了,我们进行计算,发现y = 10^2=100,偏右边了怎么办呢?

    2.我们将m减去导数,得到100-2*10,靠近了一点点,我们反复取值,即可靠近最低点。

    3.在机器学习中,往往允许的误差是极小的,所以,我们应该将m乘上一个alpha值,这个值是学习率,学习率越低,往往拟合函数越好,但是也不是无限低的。

    3.梯度下降求解一元线性回归

    我们将梯度下降,用来求解一个线性回归,那么任意取值w0, w1

    w0, w1每次变动的值为对w0, w1的偏导数,即:

    计算可得到:

    4.由3我们可以得到python代码和拟合图像

    import numpy as np
    import matplotlib.pyplot as plt
    
    def h(x):
        return w0 + w1 * x // 函数
    
    if __name__ == '__main__':
        # alpha学习率
        rate = 0.02
    
        # y = w0 * x + w1
        w0 = np.random.normal()
        w1 = np.random.normal()
    
        # 训练数据
        x_train = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
        y_train = np.array([1, 3, 4, 5, 6, 7, 8, 9, 10])
    
        err = 1
        # 计算误差函数
        while (err > 0.1):
            for (x, y) in zip(x_train, y_train):
                w0 -= (rate * (h(x) - y) * 1)
                w1 -= (rate * (h(x) - y) * x)
    
            # 代入找误差
            err = 0.0
            for (x, y) in zip(x_train, y_train):
                err += (y - h(x)) ** 2
            err /= float(x_train.size * 2)
    
        # 打印
        print("w0的值为%f" % w0)
        print("w1的值为%f" % w1)
        print("误差率的值为%f" % err)
    
        # 画图
        x = np.linspace(0, 10, 10)
        y = h(x)
    
        plt.figure()
        plt.plot(x_train, y_train, 'ro')
        plt.plot(x, y)
        plt.title("linear_regression")
        plt.xlabel('x')
        plt.ylabel('h(x)')
        plt.show()
    

    拟合图像如下:

    我们发现在编码的过程中,我们有2个停止迭代的条件:

    1.尝试次数,尝试次数 < 给定次数(因为有时候你的阈值设置不对会造成死循环)
    2.误差值MSE,这个小于误差则拟合成功
    

    5.常见问题

    1.如果我们把alpha学习率设置为大于1,那么我们会error,因为,造成了梯度向上

    2.如果我们采用绝对值代替方差,可行吗?

    不可行,因为平方,会拟合的更完善。而绝对值可能造成过拟合,使我们预测不准确。

  • 相关阅读:
    MySQLCluster架构图文详解
    Request.ServerVariables大全,写到这里方便查找
    如何修改表的标识列
    如何在存储过程中,调用另一存储过程的结果集
    自我简介
    第二个web网页
    第一个网页感想
    C语言I博客作业03
    ES基本搜索(1)
    ES的入门学习
  • 原文地址:https://www.cnblogs.com/littlepage/p/12271720.html
Copyright © 2011-2022 走看看