【机器学习】我小学二年级妹妹都能理解的线性回归算法

news2024/9/17 7:22:20

什么是线性回归?

我小学二年级的妹妹想用压岁钱买房子,售楼广告上写着100万可以买100m^2的房子,200万可以买200m^2的房子,但是我的妹妹觉得那些房子都太小了,想买300m^2的房子,那她应该要花多少钱呢?

对于这个问题,我们可以根据已知数据画出一条优美的直线,并且可以把直线方程求出来,根据这个直线方程就可以把房价和房子的面积映射起来。

求出该问题的直线方程就是线性回归的一个过程,在数学上通常叫做线性拟合。上述问题似乎很简单,但实际上我们已知的数据量是非常大的,而且涉及到的变量也非常多,通常需要用到最小二乘法或者梯度下降法去求解。

线性回归是一种数据分析技术,它通过使用另一个相关的已知数据值来预测未知数据的值。它以数学方式将未知变量或因变量以及已知变量或自变量建模为线性方程。

线性模型

要想理解这部分内容,需要懂一点我们小学学过的线性代数。

线性方程一般是这样写的:\widehat y= w_ {1} x_ {1} + \cdots + w_ {n} x_ {n} +b
但是变量太多的话,我们也可以用向量的形式去简写:\widehat y= w^ {T} x+b

其中\widehat y表示y的估计值,w是权重,b是偏置,这就是一个线性模型,我们的最终目标就是把线性模型的这些参数求解出来。

在幼儿园的时候,我们经常用y = kx + b来表示二维平面上的直线,其中k就是权重,b就是偏置,有些人觉得用w来表示会比较变扭,所以特此说明一下。

损失函数

损失函数其实就是用来描述我们画出来的直线是否合适,如果我们拟合的这条直线非常不合适,损失函数算出来的值就非常大,反之则值非常小。

回归问题中最常用的损失函数是平方误差函数:l^{(i)}(w,b)= \frac {1}{2} (\widehat {y}^ {(i)}-y^ {(i)})^ {2}

如果估计出来的\widehat y和实际y值相等,也就是一点误差都没有,那损失函数的值就是0,这是最完美的一种情况。

如何解出线性模型?

线性回归是机器学习中的一个算法,通常我们解方程都是自己去解,但是如果该线性模型的参数太多了,我们就无法通过人去解决问题了。

这时候我们就要训练机器,让机器帮我们解决问题。但是机器如何解决这个问题?教机器去做这件事似乎十分的奇妙,接下来让我们深入了解一下吧!

上图是一组关于人口和收益的数据散点图,我们现在需要构建一个线性模型。那我们如何知道这个线性模型是否构建的很好呢?当然是最小化损失函数啦!

我们将损失函数与线性模型方程联系起来:

L(\mathbf{w},b)=\frac1n\sum_{i=1}^nl^{(i)}(\mathbf{w},b)=\frac1n\sum_{i=1}^n\frac12\left(\mathbf{w}^\top\mathbf{x}^{(i)}+b-y^{(i)}\right)^2

我们使得损失函数的值最小,那么得到的线性模型也就是最优的!

\mathbf{w}^*,b^*=\underset{\mathbf{w},b}{\operatorname*{argmin}} L(\mathbf{w},b)

其中w^*b^*表示它们的最优值。

最小二乘法

我们可以通过最小二乘法来对参数wb进行估计。

现在把b吸收到w向量中,\widehat y= w_ {1} x_ {1} + \cdots + w_ {n} x_ {n} +w_0,其中w_0就相当于是b

写成向量的形式就是将 \widehat y= w^ {T} x+b 变为 \widehat y= WX,其中 X=(x,1)


综上可得:

W^*=\underset{\mathbf{w}}{\operatorname*{argmin}}(y-WX)^2=\underset{\mathbf{w}}{\operatorname*{argmin}}(y-WX)^T(y-WX)

要使得w最小化,就是对w求偏导为0,这涉及到矩阵的求导知识。

\mathrm W^*=\mathrm\ w^\mathrm{T}\mathrm X^\mathrm{T}\mathrm X\ w-\mathrm\ w^\mathrm{T}\mathrm X^\mathrm{T}\mathrm y-\mathrm y^\mathrm{T}\mathrm X\ w+\mathrm y^\mathrm{T}\mathrm y

根据矩阵的性质 (y^TXw)^T=w^TX^Ty,可得:

\mathrm W^*=\mathrm\ w^\mathrm{T}\mathrm X^\mathrm{T}\mathrm X\ w-\mathrm\ 2w^\mathrm{T}\mathrm X^\mathrm{T}\mathrm y+\mathrm y^\mathrm{T}\mathrm y

w求偏导可得:

\frac{\partial}{\partial\ w}\mathrm{W^*}=2\mathrm{X}^\mathrm{T}\mathrm{X}\ w-2\mathrm{X}^\mathrm{T}\mathrm{y}

令上式偏导为0,可以解得:

W=(X^TX)^{-1}X^Ty


以上是公式的推导过程,最小二乘法适用于小数据量的线性模型,如果数据量太大,矩阵的逆会很难算出来,因为计算机对矩阵求逆的时间复杂度是O(n^3)。并且最小二乘法只适用于线性模型,不适合逻辑回归模型等其他模型。

最小二乘法算法实现:

def LSM(X, y):
    # 计算矩阵X的转置与X相乘,再求逆矩阵,最后将结果与X的转置相乘,再与向量y相乘,得到权重w
    w = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)
    return w

梯度下降法

梯度下降法是一个迭代算法,就像我们下山一样,我们想要以最快的速度到达山底,那我们就要往最陡峭的方向下山,每走\alpha米后就重新计算一下坡度,然后继续朝着最陡峭的方向下山。

而函数的梯度,在意义上就是变化率最大的方向。

上文最小二乘法的权重用w表示,即:

\widehat y= w_ {1} x_ {1} + \cdots + w_ {n} x_ {n} +w_0

这里的梯度下降法,我们为了和上图匹配,将权重用\theta表示,即:

\widehat y= \theta_ {1} x_ {1} + \cdots + \theta_ {n} x_ {n} +\theta_0

也可写成:

f(x_i)= \theta_ {1} x_ {i1} + \cdots + \theta_ {n} x_ {in} +\theta_0

我们需要注意这里的x_i是一个向量。

我们结合损失函数,即:

J\left(\theta\right)=J\left(\theta_0;\theta_1;\theta_2...;\theta_n\right)=\frac{1}{2m}\sum_{i=1}^m\left(f\left(x_i\right)-y_i\right)^2

其中 \frac{1}{2} 是为了计算方便,求导后可以消除掉二次方的系数,\frac{1}{m} 可以抵消掉数据量造成的影响,在目标函数加入 \frac{1}{2m} 不影响最终结果的求解。

用梯度下降法求解参数\theta,即:

\theta_i:=\theta_i-\alpha\frac{\partial J\left(\theta\right)}{\partial\theta_i}, i=(1,2...n)

\theta_{i}^{^{}}:=\theta_{i}-\frac{\alpha }{m}\sum_{j=1}^{m}(f(x^{\left(j\right)})-y^{\left(j\right)})x_{i}^{\left(j\right)}, i=(1,2...n)

其中 \alpha 称为步长或者学习率,就像爬山走多少米测一次坡度一样,一般设置为0.01。学习率过小容易造成算法时间复杂度过高,学习率过大可能会导致在最优值附近“跳跃”。


通过梯度下降算法不断迭代即可求出全局最优解,我们对上述人口收益问题进行线性回归,可以得到下图:

批量梯度下降算法实现:

def batch_gradientDescent(X, y, w, alpha, count):
    """
    
    
    参数:
    X -- 特征矩阵,形状为 (n_samples, n_features)
    y -- 标签向量,形状为 (n_samples,1)
    w -- 权重向量,形状为 (n_features,1)  
    alpha -- 学习率
    count -- 迭代次数
    
    返回值:
    w -- 更新后的权重向量
    costs -- 每次迭代的代价函数值列表
    """
    # 初始化代价函数值列表
    costs = []

    # 对每个样本进行迭代
    for i in range(count):
        # 根据公式更新权重向量
        w = w - (X.T @ (X @ w - y)) * alpha / len(X)

        # 计算当前代价函数值并添加到列表中
        cost = computeCost(X, y, w)
        costs.append(cost)

        # 每隔100次迭代输出一次当前代价函数值
        if i % 100 == 0:
            print("在第{}次迭代中,cost的值是:{}。".format(i, cost))

    # 返回最终的权重向量和代价函数值列表
    return w, costs

梯度下降算法还有:随机梯度下降算法、小批量梯度下降算法,本质上就是拿部分的数据量去梯度下降,所以适用于数据量非常大的情况下,这里不过多赘述,有兴趣的小伙伴可以自行搜索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DBMS-2.2 数据库设计(2)——数据库规范化设计理论

本文章的素材与知识来自李国良老师和冠宇老师。 依赖理论 对于关系数据库中的依赖,分为函数依赖、多值依赖和连接依赖。 一.函数依赖 1.函数依赖 (1)定义: (2)理解: 通俗地讲,…

【Linux】借命令行参数的引导,探索环境变量的奥秘

目录 1.命令行参数 1.1.概念: 1.2.利用命令行参数打造计算器: 2.环境变量 2.1.环境变量是什么? 2.2.有什么方法可以不用带路径,直接就可以运行自己的程序呢? 法一: 法二: 2.3.通过代码…

PostgreSQL技术内幕9:PostgreSQL事务原理解析

文章目录 0.简介1.PG事务整体介绍1.1 事务类型介绍 1.2 事务模块介绍2. 代码分析 0.简介 有了上一篇数据库事务并发控制协议的介绍,对于数据库事务和并发控制有了基本的认识,本文将介绍PG事务模块,主要介绍PG支持的事务类型(普通…

git为不同的项目设置不同的提交作者

方法1:找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2:直接在.git文件夹设置作者名(不使用–global参数) git config user.name "xxxxx"如果想要修改之前提交的…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

vllm源码解析(五):LLM模型推理

八 模型推理细节探索 8.1 回顾下step的流程 def step(self) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# 多GPU并行推理时走AsyncLLMEngine分支。如果进入当前LLMEngine,性能会下降,这里会抛出异常。if self.parallel_config.pipeline_parallel_s…

基于机器学习的电商优惠券核销预测

1. 项目简介 随着移动互联网的快速发展,O2O(Online to Offline)模式已成为电商领域的一大亮点。优惠券作为一种有效的营销工具,被广泛应用于吸引新客户和激活老用户。然而,传统的随机投放方式往往效率低下,…

JavaWeb【day11】--(SpringBootWeb案例)

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能,还有两个需要实现: 新增员工 修改员工 首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在&quo…

万能视频下载器-下载所有网站上的任何视频

万能视频下载器-下载所有网站上的任何视频 在Edge浏览器中发现了一款令人惊叹的视频下载扩展插件,简直就是视觉盛宴的利器!只需轻点几下,在拓展商店中轻松查找并安装,你便能随时随地随心所欲地把心仪的视频收入囊中。无论是教学资…

matlab仿真 OFDM系统仿真

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第九章内容,有兴趣的读者请阅读原书) clear all N8;%子载波数 f1:N;%各个子载波频率 xrandi([0 3],1,N);%子载波上的数据 x1qammod(x,4);%4-QAM调制 t0:0.001:1-0.…

学习周报-2024.9.3

目录 摘要 Abstract 文献阅读:一种改善河流水质预测的耦合模型以解决非平稳性和数据限制 一、现有问题 二、提出方法 三、相关知识 1、基于小波分析的LSTM(WA-LSTM) 2、迁移学习TL改进WA-LSTM 四、WA-LSTM-TL模型 五、研究实验 1、…

手写NACOS的服务的注册与发现|心跳机制|轮询调用服务功能

背景 手写NACOS的服务的部分核心功能,提高自身的编码能力 本篇文章设计的是单体NACOS后端服务,提供SDK给多个NACOS客户端使用 本文编写了注册与发现|心跳机制|轮询调用服务功能,可当做入门级阅读 nacos-service 项目结构 代码内容 pom配置…

Detect It Easy

Detect It Easy(简称 DIE)项目的网址为 https://github.com/horsicq/Detect-It-Easy 下载完安装包后,直接双击die.exe即可进入到操作界面 工具介绍: 它可以用来检测程序架构和文件类型。如图所示。其中,「模式」说明程…

UE5 贝塞尔曲线导弹

首先创建导弹Actor蓝图 代码逻辑,这其中创建的所有变量都不用添加值,这些逻辑要画图来解释,比较麻烦,大家自行理解一下 接下来进入人物蓝图编写代码逻辑,我这里是在两个不同的位置发射两枚导弹 宏中的代码,…

时序预测|基于粒子群优化支持向量机的时间序列预测Matlab程序PSO-SVM 单变量和多变量 含基础模型

时序预测|基于粒子群优化支持向量机的时间序列预测Matlab程序PSO-SVM 单变量和多变量 含基础模型 文章目录 一、基本原理1. 问题定义2. 数据准备3. SVM 模型构建4. 粒子群优化(PSO)5. 优化与模型训练6. 模型评估与预测7. 流程总结8. MATLAB 实现概述 二、…

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击&#xf…

轻松上手,高效产出:音频剪辑工具年度精选

不知道你有没有拍vlog记录生活的习惯,有时候视频里穿插进自己的声音能让视频更加丰富贴上自己的标签。这次我们一起探讨当下有哪些好用的在线音频剪辑工具。 1.FOXIT音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这个工具是一款专业的音…

GNU的伪操作 (25)

这里主要是 对 GNU的 各个伪操作进行 详细的解释。 先来看着几个 伪操作。 .byte, .short, .long, .quad , .float , 这个是关于 字节的。 .string .ascii 是关于字符串的。 这个字符串编译器是可以自动在末尾补0 的。 举例: val: .word 0x11223344 mov r…

计算机组成原理(SRAM电路图示)

1.该电路由6个MOS管(T1-T6)组成 2.T1-T4是一个由MOS管组成的触发器基本电路; T5,T6像开关,受行地址选择信号控制; T7,T8受列地址选择控制,分别与位线A,和相连 3.假设触发器…

FinOps原则:云计算成本管理的关键

导语: FinOps 原则为我们提供了北极星(North Star),在我们实践云财务管理时指导我们的活动。这些原则由 FinOps 基金会成员制定,并通过经验磨练出来。 北极星(North Star)的含义: …