(一) 一元线性回归方程 & 梯度下降

学习目标

        I.   理解一元线性回归

                 II.   学会用   “梯度下降法 ”  和 “相关系数法”求解 线性模型  

                              III.    学会用代码来实现该过程

一.一元线性回归

 (1)如何理解“回归分析”?

        回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法是对具有因果关系的影响因素(自变量)和预测对象(因变量)所进行的数理统计分析处理。只有当变量与因变量确实存在某种关系时,建立的回归方程才有意义。因此,作为自变量的因素与作为因变量的预测对象是否有关,相关程度如何,以及判断这种相关程度的把握性多大,就成为进行回归分析必须要解决的问题。进行相关分析,一般要求出相关关系,以相关系数的大小来判断自变量和因变量的相关的程度。 

  (2)分类

标准1:据自变量和因变量之间的关系类型

                   线性回归分析和非线性回归分析

标准2:按照自变量的数量

                      一元回归分析和多元回归分析

 一元线性回归的形式为        y = a + b x

根据样本观察数据估计出a和b的数值之后,样本回归方程可作为预测模型,即一元线性回归预    测模型

(3)求解回归预测模型参数的方法

  方法一:根据相关系数与标准差求解

直线可以用公式表示:y=bx+a。

回归线斜率m的公式为:b = r *  (SD of y / SD of x)。

转换:x和y值之间的相关系数(r),乘以y值的标准差(SD of y)除以x值的标准偏差(SD of x)。

将   样本的均值点    代入回归线求出  a

相关系数求解公式:

II.梯度下降法

梯度下降原理:

      从一条随机线开始,比如说直线a,我们计算这条线的误差平方和,然后调整斜率和y轴截距,重新计算新行的误差平方和。继续调整,直到达到局部最小值,其中平方误差之和最小。

梯度下降法是一种通过多次迭代最小化误差平方和来逼近最小平方回归线的算法  

        

 成本:

 “成本”就是误差(预测值-实际值)的平方和

为了是预测模型更加准确(即成本最低),我们可以通过改变斜率和截距来寻找最佳拟合线

        如何改变参数呢?

对其求偏导   ,  可以得到下降最快的方向

梯度下降算法

我们便引入了梯度下降公式来改变参数值

线性回归和梯度下降的初学者教程

关键是选择一个合适的学习速率(α),如果学习速率过小,则会导致收敛速度很慢;如果学习速率过大,那么就会阻碍收敛,即在极值点附近会震荡。


学习速率调整(又称学习速率调度,Learning rate schedules),在每次更新过程中,改变学习速率,如退火。一般使用某种事先设定的策略或者在每次迭代中衰减一个较小的阈值。无论哪种调整方法,都需要事先进行固定设置,这便无法自适应每次学习的数据集特点。 

        

(4)求解步骤

  • 1、散点图判断变量关系(简单线性);
  • 2、求相关系数及线性验证;
  • 3、求回归系数,建立回归方程;
  • 4、回归方程检验;
  • 5、参数的区间估计;
  • 6、预测;

实例如下:

import numpy as np
import matplotlib.pyplot as plt
 
class SimpleRegress(object):
    def __init__(self, x_data, y_data):
 
        self.x_data = x_data
        self.y_data = y_data
        self.b0 = 0
        self.b1 = 1
 
        return
 
    def calculate_work(self):       # 回归方程中b0、b1的求解
 
        x_mean = np.mean(self.x_data)   # x_mean= 14.0
        y_mean = np.mean(self.y_data)   # y_mean= 130.0
        x1 = self.x_data - x_mean   # x1= [-12.  -8.  -6.  -6.  -2.   2.   6.   6.   8.  12.]
        y1 = self.y_data - y_mean   # y1= [-72. -25. -42. -12. -13.   7.  27.  39.  19.  72.]
        s = x1 * y1     # s= [864. 200. 252.  72.  26.  14. 162. 234. 152. 864.]
        u = x1 * x1     # u= [144.  64.  36.  36.   4.   4.  36.  36.  64. 144.]
        self.b1 = np.sum(s) / np.sum(u)      # b1= 5.0
        self.b0 = y_mean - self.b1 * x_mean       # b0= 60.0
 
        return
 
    def test_data_work(self, text_data):    # 回归方程的建立与数值预测
 
        result = list([])
        for one_test in text_data:
            y = self.b0 + self.b1 * one_test
            result.append(y)
        return result
 
    def root_data_view(self):    # 绘制源数据可视化图
        plt.scatter(x_data, y_data, label='simple regress', color='k', s=5)  # s 点的大小
        plt.xlabel('x')
        plt.ylabel('y')
        plt.legend()
        plt.show()
        return
 
    def test_data_view(self):    # 绘制回归线
        # 绘制回归线两个点的数据
        x_min = np.min(self.x_data)
        x_max = np.max(self.x_data)
        y_min = np.min(self.y_data)
        y_max = np.max(self.y_data)
        x_plot = list([x_min, x_max])
        y_plot = list([y_min, y_max])
        # 绘制
        plt.scatter(x_data, y_data, label='root data', color='k', s=5)  # s 点的大小
        plt.plot(x_plot, y_plot, label='regression line')
        plt.xlabel('x')
        plt.ylabel('y')
        plt.legend()
        plt.title('simple linear regression')
        plt.show()
        return
 
x_data = list([2, 6, 8, 8, 12, 16, 20, 20, 22, 26])
y_data = list([58, 105, 88, 118, 117, 137, 157, 169, 149, 202])
test_data = list([16])
 
sr = SimpleRegress(x_data, y_data)
sr.calculate_work()
result = sr.test_data_work(test_data)       # result= [140.0]
#sr.root_data_view()
sr.test_data_view()

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_53605735

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值