【机器学习笔记1】一元线性回归模型及预测

2023-11-13

目录

什么是线性回归模型?

 一元线性回归模型

问题引入:

 问题解析:

 代价函数(损失函数):

 代价函数的图像

为什么不是最小而是极小值?

 梯度下降算法

 梯度下降算法公式(对于一元线性回归模型)

学习率a的选择

  关于梯度下降每一步的变化

补充:

 代码部分 - 案例实现

数据

 导入数据并绘制初始图

 梯度计算函数

  梯度迭代函数

 代价函数

 绘图和预测

结果


前言:本系列为机器学习的学习笔记,参考教程链接:

# (强推|双字)2022吴恩达机器学习Deeplearning.ai课程

观点不一定完全正确,欢迎指出错误的地方。

什么是线性回归模型?

回归分析是研究自变量与因变量之间数量变化关系的一种分析方法,它主要是通过因变量Y与影响它的自变量X_{i}(i=1,2,3…)之间的回归模型,衡量自变量X_{i}对因变量Y的影响能力的,进而可以用来预测因变量Y的发展趋势。线性回归模型指因变量和自变量呈直线型关系的模型,是回归分析中最常用且最简单的方法,线性归回模型又分为一元线性回归模型和多元回归模型。

 一元线性回归模型

一元线性回归模型即自变量只有一个的线性回归模型。

问题引入:

已知上图数据集,其中,X为自变量,Y为因变量,请预测当X为5000时Y的取值。

 问题解析:

因为自变量只有一个,即让你模拟一个f_{w,b}(x)=wx+b,使该函数与上图自变量与应变量的变化趋势尽量满足,f_{w,b}(x)即一元线性回归函数,再用计算出的回归函数去预测值即可。难点在于,这里的w和b都是未知数,我们要做的就是推断出最合适的w和b。

 代价函数(损失函数):

如何判断w和b是否合适,我们引入了代价函数。代价函数用于判断整体来看,每个点的实际Y值与估计Y值的差距大小。

这里先随便画一条线。

令模拟出来的自变量对应应变量的值为\hat{y},即\hat{y} = f_{w,b}(x),则代价函数为:

J(w,b) =\frac{1}{2m}\sum_{i=0}^{m-1}{(\hat{y}_{i}-y_{i})^2} = \frac{1}{2m}\sum_{i=0}^{m-1}{(f_{w,b}(x_{i})-y_{i})^2}

其中,m为训练集样例数,第一个点下标为0。这里除以2是方便后续计算。

 代价函数的图像

我们先将f_{w,b}(x)简化为f_{w}(x) = wx,那么J(w) = \frac{1}{2m}\sum_{i=0}^{m-1}{(wx_{i}-y_{i})^2}

此时J(w)的图像为一个凸函数:

 对应的f_w(x)模拟情况:

 

 当我们将f_{w,b}(x)简化为f_{b}(x) = x+b,此时J(b)的图像也是一个凸函数,我们姑且借用J(w)的图像,不过变量变为了b:

 

 对应的f_{b}(x)模拟情况:

 

现在将J(w)J(b)合在一起,J(w,b)便是一个三维碗装图像:

注:图中的wb并不对应上面的例子,只是大致图像!

 

代价函数值越小,说明模拟值与实际值差距越小,则w,b越合适,回归函数模拟的越好。所以,当代价函数值最小时,w和b最合适。

于是问题转化为了:求wb使得J(w,b)能取到极小值。

为什么不是最小而是极小值?

这与之后要用到的算法(梯度下降法)有关,梯度下降法只能求到极小值。不过梯度下降法常用于求凸函数的极小值,而凸函数只有一个极小值,所以通常求得的是最小值。这里举个非凸函数的例子,此时用梯度下降法不一定能求得最优解。

 梯度下降算法

梯度下降算法并不只用于求解线性回归问题。

梯度算法在课程中被描述为:假设你站在一个山坡上,你想最快下降到你四周最低的山谷。

即选择一个基点,以四周斜率绝对值最大的方向下降,直到下降到极小值点(此时斜率为0)停止。我们认为这个极小值点对应的w和b即为所求,一般我们选择(0,0)作为基点,即w和b开始为(0,0),不过实际上基点怎么选都可以。

 梯度下降算法公式(对于一元线性回归模型)

重复以下行为直到收敛:

w = w - a\frac{\partial J(w,b)}{\partial w}

b = b - a\frac{\partial J(w,b)}{\partial b}

其中,a被称为学习率。之后会讨论学习率a的选择。

注意:wb应该同时更新!(会在代码块说明)

求偏导:

\frac{\partial J(w,b)}{\partial w} = \frac{1}{m}\sum_{i=0}^{m-1}{(f_{w,b}(x_{i})-y_{i})}x_{i}

\frac{\partial J(w,b)}{\partial b} = \frac{1}{m}\sum_{i=0}^{m-1}{(f_{w,b}(x_{i})-y_{i})}

(之前代价函数除个2就是为了这里化简)

学习率a的选择

如果a很小,那么每一步都走的很小,收敛过程就会很慢。

 如果a很大,J(w,b)可能不会每次迭代都下降,可能错过最佳点,甚至导致发散。

 关于学习率a的选择有许多种方法,这里不做专门讨论(其实是还没学到),姑且采用网上查到的一种简单的方法:在运行梯度下降法的时候会尝试一系列学习率的取值:...0.001, 0.003,0.01, 0.03,0.1, 0.3,1....尽量以三倍增长,直到找到一个合适的学习率。

  关于梯度下降每一步的变化

 梯度下降每一步并不是相等的,因为每一次迭代时,偏导数都会不断变化。在学习率选择合适的情况下,大概可以得到类似下图的每一步梯度变化图像。x轴为迭代次数,y轴为梯度。

 可以看到最开始梯度很大,到后来慢慢接近于0。

补充:

这里解释下为什么非凸函数中找到的不一定是最优解:

 我们选择1和2分别作为起点,可能到达两个极小值点,我们无法判断找到的极小值点是否是全局最小值。当然凸函数只有一个极值点,所以对于凸函数,不存在这个问题。

 代码部分 - 案例实现

数据

2104.000000,1600.000000,2400.000000,1416.000000,3000.000000,1985.000000,1534.000000,1427.000000,1380.000000,1494.000000,1940.000000,2000.000000,1890.000000,4478.000000,1268.000000,2300.000000,1320.000000,1236.000000,2609.000000,3031.000000,1767.000000,1888.000000,1604.000000,1962.000000,3890.000000,1100.000000,1458.000000,2526.000000,2200.000000,2637.000000,1839.000000,1000.000000,2040.000000,3137.000000,1811.000000,1437.000000,1239.000000,2132.000000,4215.000000,2162.000000,1664.000000,2238.000000,2567.000000,1200.000000,852.000000,1852.000000,1203.000000
399.899994,329.899994,369.000000,232.000000,539.900024,299.899994,314.899994,198.998993,212.000000,242.500000,239.998993,347.000000,329.998993,699.900024,259.899994,449.899994,299.899994,199.899994,499.997986,599.000000,252.899994,255.000000,242.899994,259.899994,573.900024,249.899994,464.500000,469.000000,475.000000,299.899994,349.899994,169.899994,314.899994,579.900024,285.899994,249.899994,229.899994,345.000000,549.000000,287.000000,368.500000,329.899994,314.000000,299.000000,179.899994,299.899994,239.500000

 导入数据并绘制初始图

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt('test.txt',dtype=np.float32,delimiter=',')
x_train = data[0]
y_train = data[1]
plt.scatter(x_train,y_train,marker='o',c='r') # marker 将样式设置为o,c将颜色设置为红色
plt.ylabel('y')
plt.xlabel('x')
plt.show()

 梯度计算函数

对应公式:

sumdw = \frac{\partial J(w,b)}{\partial w} = \frac{1}{m}\sum_{i=0}^{m-1}{(f_{w,b}(x_{i})-y_{i})}x_i

sumdb = \frac{\partial J(w,b)}{\partial b} = \frac{1}{m}\sum_{i=0}^{m-1}{(f_{w,b}(x_{i})-y_{i})}

# 梯度计算函数
def compute_gradient(x,y,w,b):
    '''
    参数:
        x: x训练集
        y: y训练集
        w,b: 模型参数
    返回值:
        sum_dw: 代价函数对w的偏导数
        sum_db: 代价函数对d的偏导数
    '''

    m = x.shape[0] # 训练样例个数
    sum_dw = 0
    sum_db = 0

    for i in range(m):
        f_wb = w*x[i]+b
        dw_i = (f_wb - y[i])*x[i]
        db_i = f_wb - y[i]
        sum_dw += dw_i
        sum_db += db_i

    sum_dw = sum_dw / m
    sum_db = sum_db / m
    return sum_dw,sum_db

  梯度迭代函数

对应公式:

重复以下行为直到收敛:

w = w - a\frac{\partial J(w,b)}{\partial w}

b = b - a\frac{\partial J(w,b)}{\partial b}

注:代码中是让他迭代一定次数而并非以收敛为结束判断条件。这是因为当迭代次数足够大,也无限接近收敛了。

# 梯度迭代函数(计算w和b)
def gradient_descent(x,y,init_w,init_b,alpha,num_iters):
    '''
    参数说明:
        x: x训练集
        y: y训练集
        init_w: w初始值
        init_b: b初始值
        alpha: 学习率
        num_iters: 迭代次数
    return:
        w,b:最终找到的w和b
    '''
    w = init_w
    b = init_b

    for i in range(num_iters):
        # 产生梯度
        sum_dw,sum_db = compute_gradient(x, y, w, b)
        # 同时更新w和b
        w = w - alpha*sum_dw
        b = b - alpha*sum_db

    return w,b

 代价函数

对应公式:

J(w,b) =\frac{1}{2m}\sum_{i=0}^{m-1}{(\hat{y}*{i}-y*{i})^2} = \frac{1}{2m}\sum_{i=0}^{m-1}{(f_{w,b}(x_{i})-y_{i})^2}

这里只用于检验结果。

 # 代价函数
def compute_cost(x, y, w, b):
    m = x.shape[0]
    cost = 0

    for i in range(m):
        f_wb = w * x[i] + b
        cost = cost + (f_wb - y[i]) ** 2
    total_cost = 1 / (2 * m) * cost

    return total_cost

 绘图和预测

if __name__ == '__main__':

    data = np.loadtxt('test.txt', dtype=np.float32, delimiter=',')
    x_train = data[0]
    y_train = data[1]
    plt.scatter(x_train, y_train, marker='o', c='r')  # marker 将样式设置为o,c将颜色设置为红色
    plt.ylabel('y')
    plt.xlabel('x')
    # plt.show()

    init_m = 0
    init_b = 0
    # 一些梯度下降的设置
    iterations = 100000
    tmp_alpha = 0.000000095
    w,b = gradient_descent(x_train,y_train,init_m,init_b,tmp_alpha,iterations)
    print(f"线性回归函数为:f(x) = {w}x + {b}")
    print(f"此时代价函数为:{compute_cost(x_train,y_train,w,b)}")
    print(f"预测当x = 5000是,y的值为:{w*5000+b}")
    x = np.linspace(0,5000,100)
    y = w*x+b
    plt.plot(x,y)
    plt.show()

 在设置学习率alpha时,如果大了会报错,过小模拟出来的图像差距过大,这里尝试了许多次选了一个自认为比较合适的值。

结果

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习笔记1】一元线性回归模型及预测 的相关文章

随机推荐

  • xshell和xsftp学生版下载链接

    xshell https www netsarang com zh downloading token X3loQWFwNVBtWWRnaFpZazRIQ0RnQUBVWWxIT3c4VHRfTEFOdGs5Z3Y1N093 有效期 Sep
  • 实战教程:如何将自己的Python包发布到PyPI上

    1 PyPi的用途 Python中我们经常会用到第三方的包 默认情况下 用到的第三方工具包基本都是从Pypi org里面下载 我们举个栗子 如果你希望用Python实现一个金融量化分析工具 目前比较好用的金融数据来源是 Yahoo 和 Go
  • 原生js+html+css实现从表单(form)动态加数据到表格(table)

    css部分 html部分
  • TensorFlow制作自己的数据集,并用神经网络来训练自己制作的数据集【上】

    参考文章 将数据导入TensorFlow 使用tensorflow训练自己的数据集 一 制作数据集 用Tensorflow处理自己的数据 制作自己的TFRecords数据集 在用tensorflow来进行网络模型的训练时 我们总是需要先输入
  • 突破github的100M单个大文件上传限制

    偶尔把几本电子书传到github上 其中一本关于c 的有147M 在本地磁盘占用了150M空间 使用普通的方式 最终会被github 服务器拒绝 在github 官网上也有了相关说明 具体请查看 https help github com
  • Python量化分析(1)——Tushare的使用介绍

    1 Tushare简介 Tushare是国内免费库中最好的财经数据获取接口 数据包含股票 基金 期货 债券 外汇 行业大数据 同时包括了数字货币行情等区块链数据的全数据品类的金融大数据 最重要的是 免费 免费 免费 虽然初始注册账户的积分只
  • 虚拟机Linux:ping不通外网,但是宿主机可以ping的通;ip、网关配置都没什么问题

    查看vi etc sysconfig network scripts ifcfg ens33的配置也没有什么问题 但是还是ping不通外网 所以我将拷贝自己没有问题的虚拟机 etc sysconfig network scripts ifc
  • 数据结构-用单链表实现集合的并运算和交运算

    问题描述 有A B两个集合 分别用两个单链表存放 假设集合中无重复的元素 要求编写两个独立的函数分别实现集合的并运算和交运算 运算结果存放在第3个链表中 运算不能改变原来的A B链表 假设单链表中的元素值均为正整数 建立链表时 输入 1时停
  • 解决有时候加载不出img标签图片

    在vue前端浏览器加载图片时 其他任何地方都能加载出 就唯独一个地方显示无法载入此图像 完全无法理解 解决方法是在在图片显示的界面把meta referrer标签改为never 或者在img标签上加上referrerpolicy no re
  • TFIDF算法Hadoop实现

    程序说明 利用MapReduce计算框架 计算一组英文文档中各个单词的TFIDF 某单词在某文档的TFIDF 该单词中该文档的TF 该单词IDF 其中 TF i j 单词i在文档j中出现的频率 Term Frequency TF i j N
  • MySQL之数据备份和恢复

    参考资料 关于备份的一些概念 http www open open com lib view open1382152331946 html 关于备份和数据恢复的简介 http wenku baidu com link url eVm3 9f
  • 初识C语言之数据类型,生命周期&作用域

    首先 C语言大致分为七种基础的数据类型 分别是char 字符数据类型 short 短整形 int 整形 long 长整形 long long 更长的整形 float 单精度浮点数 double 双精度浮点数 其中 char是描述字符的 sh
  • 金融行业的密钥及加密机制

    金融行业的密钥及加密机制 一 秘钥的标准体系 二 秘钥实现 三 常见术语 四 参考文档 一 秘钥的标准体系 目前金融行业的秘钥体系主要有两个 一是 Q CUP 006 4 2015 中国银联股份有限公司企业标准 中国银联银行卡交换系统技术规
  • PaddleOCR手写体训练摸索

    手写OCR识别 一 官方支持的数据格式 1 官方文档 1 1 PaddleOCR 支持两种数据格式 1 2 训练数据的默认存储路径 1 3 自定义数据集的准备 1 3 1 通用数据集 1 3 2 lmdb数据集 1 3 2 1 lmdb基本
  • LED为何通过电流控制?

    前段时间 散热部的同事咨询我关于手机的闪光灯输出电压值 说实话 一时间把我问住了 关于闪光灯 以往我们关注电流值 电压值很少关注 虽说手机的闪光灯驱动IC输出为BOOST电路 但是输出电压到多少 我还真未了解过 因闪光灯本身属于电流控制 所
  • 安装包制作工具 Inno Setup 6.0.2 汉化版-BY 胡萝卜周博客

    nno Setup 是一个免费的安装制作软件 小巧 简便 精美是其最大特点 支持pascal脚本 能快速制作出标准 Windows2000 风格的安装界面 足以完成一般安装任务 该软件用Delphi写成 其官方网站同时也提供源程序免费下载
  • mongdb 建立地图索引,删除,查询

    方式一 创建 db shop ensureIndex loc 2dsphere 2Dsphere索引 用于存储和查找球面上的点 db shop ensureIndex loc 2d 2D索引 用于存储和查找平面上的点 本人项目用的这种 查询
  • 阿里最新秋招面经,腾讯/美团/字节1万道Java中高级面试题

    又是一年过去了 职场的积雪还没有消融 又迎来了一次大考 疫情还没完全过去 大家强打起精神 相互问好致意 眼角却满是疲惫 企业调薪 裁员 组织架构调整等等 坏消息只多不少 最近也有很多来咨询跳槽的朋友 都是因为之前的公司出现了比较大的薪资和组
  • tomcat中间件的默认端口号_tomcat默认端口号(三个tomcat端口号)

    tomcat默认端口号 三个tomcat端口号 2020 05 08 10 43 21 共10个回答 Tomcat的默认端口号是多少 您好 提问者 Tomcat的默认端口号是 8080 weblogic的默认端口号是 7001 tomcat
  • 【机器学习笔记1】一元线性回归模型及预测

    目录 什么是线性回归模型 一元线性回归模型 问题引入 问题解析 代价函数 损失函数 代价函数的图像 为什么不是最小而是极小值 梯度下降算法 梯度下降算法公式 对于一元线性回归模型 学习率a的选择 关于梯度下降每一步的变化 补充 代码部分 案