当前位置: 首页 > news >正文

机器学习入门-线性回归模型/损失函数/梯度下降

1. 线性回归模型

位置:第一课/week1/4.Regression Model

使用到了numpy和matplotlib这两个库,numpy用于科学计算,matplotlib用于图像绘制

numpy的使用:

创建一个numpy数组

import numpy as np
x_train = np.array([1.0,2.0])

PS:numpy数组(N维数组对象)不是Python列表,其功能更加强大,支持高效的数值运算

使用print(type(x_train))得出这个numpy数组的类型为<class 'numpy.ndarray'>

使用ndarray.shapeshapendarray的一个属性,用于获取数组的形状(shape),即每个维度的“大小”。

区分行向量一行两列的矩阵

res1 = np.array([1,2,3,4])
print(res1.shape) # 向量(4,)
res2 = np.array([[1,2,3,4]])
print(res2.shape) # 矩阵-一行四列(1,4)

行向量:[1,2,3,4],表示一个行向量,没有行、列的概念,只有长度的概念。

一行两列的矩阵:[[1,2,3,4]],有行、列的概念

matplotlib的使用:

scatter()函数:用于绘制散点图

import matplotlib.pyplot as plt
x=[1,2,3]
y=[4,5,6]
plt.scatter(x,y,marker='s', c='r')
plt.show()

注意引入的是matplotlib.pyplot而不是matplotlib

pyplot是面向用户的接口,封装了底层复杂操作(如创建图形、坐标轴等)

matplotlib是顶级模块,包含全局配置、后端系统等底层工具,不直接提供绘图函数

plt.plot(x,y,c='',label='')用于绘制线

总结:

本节描绘了Linear regression线性回归模型,是监督学习中最基础的回归算法之一,核心是拟合一条直线用来最小化预测值与真实值之间的误差。

线性回归:

单变量线性回归:
y = w 0 + w 1 x y=w_0+w_1x y=w0+w1x

线性回归数学模型:
y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n + ε y=w_0+w_1x_1+w_2x_2+...+w_nx_n+\varepsilon y=w0+w1x1+w2x2+...+wnxn+ε

2. 损失函数

线性回归的损失函数通常选用**最小化均方误差(MSE,Mean Squared Error)**来优化模型参数:
M S E = 1 m ∑ i = 1 m ( y i − y i ^ ) 2 MSE=\frac{1}{m}\sum_{i=1}^m(y_i-\hat{y_i})^2 MSE=m1i=1m(yiyi^)2

  • m:样本数量
  • y i y_i yi:第 i i i个样本的真实值
  • y i ^ \hat{y_i} yi^:第 i i i个样本的预测值

目标是最小化MSE,找到最优的 w w w(权重)和 w 0 w_0 w0(截距)

3. 可视化代价函数

两个例子

例子一:

使用 f w ( x ) = w x f_w(x)=wx fw(x)=wx然后训练集的数据是 ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) (1,1),(2,2),(3,3) (1,1),(2,2),(3,3),目的是通过代价函数找到合适的 w w w

使用的代价函数:
J ( w ) = 1 2 m ∑ i = 1 m ( y − y ^ ) 2 = 1 2 m ∑ i m ( f w ( x ) − y ^ ) 2 = 1 2 m ∑ i m ( w x − y ^ ) 2 J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y-\hat{y})^2=\frac{1}{2m}\sum_{i}^{m}(f_w(x)-\hat{y})^2=\frac{1}{2m}\sum_{i}^{m}(wx-\hat{y})^2 J(w)=2m1i=1m(yy^)2=2m1im(fw(x)y^)2=2m1im(wxy^)2

注意看,代价函数只与w有关,与x无关!

步骤是令w为一个常数, f w ( x ) f_w(x) fw(x)就变成了关于x的函数(w是一个常数)。

然后针对每一个可能的w的值,绘制 f w ( x ) f_w(x) fw(x) J ( w ) J(w) J(w)的函数图像。

J ( w ) J(w) J(w)表示的是预测值与真实值之间的"距离",所以找到 J ( x ) J(x) J(x)中最接近0的点就是最优的m值。

例子二:

将例子一的 f w ( x ) = w x f_w(x)=wx fw(x)=wx换成 f w , b ( x ) = w x + b f_{w,b}(x)=wx+b fw,b(x)=wx+b,这时候 J ( w ) J(w) J(w)就变成了 J ( w , b ) J(w,b) J(w,b),此时代价函数的函数图像是一个三维图像,x轴和y轴表示w和b的值,z轴表示代价函数的值,也就是预测值与真实值之间的"距离"。

此处代价函数的图像像是一个"碗"

找到与0最接近的点,就是最佳的w和b。
在这里插入图片描述
模型调优是根据损失函数来的。想办法在损失函数的函数图像上找到“代价”最小的点,这个点所对应的参数值就是模型最优的参数或拟合度最高的模型。

为了找到这个拟合度最高的参数,需要使用—梯度下降?

4. 梯度下降 gradient descent

  1. 为参数选择合适的起始值,作为函数图像上的起始点。

    1. 不同的初始化参数,可能会以不同的局部最小值结束,

      但是凸函数是个碗型,除了一个全局最小值外没有其他最小值,so…

  2. 开始执行梯度下降算法,梯度算法会实现从起始点,360°找一个“坡度最陡”的“方向”

    1. 为什么选择“坡度最陡”?
      1. 因为坡度最陡,相同条件下,最快到达”低谷“。ps:"低谷"表示代价最低的点,该点所对应的参数值最优
  3. 重复2.,直到函数收敛

梯度下降算法(正确的):
t e m p _ w = w − α ∗ ∂ J ( w , b ) ∂ w t e m p _ b = b − α ∗ ∂ J ( w , b ) ∂ b w = t e m p _ w b = t e m p _ b temp\_w = w - \alpha*\frac{\partial J(w,b)}{\partial w }\\ temp\_b = b - \alpha*\frac{\partial J(w,b)}{\partial b }\\ w = temp\_w\\ b = temp\_b temp_w=wαwJ(w,b)temp_b=bαbJ(w,b)w=temp_wb=temp_b
梯度下降算法强调同时更新(Simultaneous update),即在计算新 w w w和新 b b b时都是基于旧的 w w w b b b

wb 的更新互不干扰,逻辑上等价于“同时”完成。

这就要求使用 t e m p _ w temp\_w temp_w来暂存新的 w w w,如果直接赋值,那么在计算新 b b b时就会导致”新 b b b基于新 w w w,新 w w w基于旧 b b b“的问题。

那是不是可以这样:
t e m p _ w = w − α ∗ ∂ J ( w , b ) ∂ w b = b − α ∗ ∂ J ( w , b ) ∂ b w = t e m p _ w temp\_w = w - \alpha*\frac{\partial J(w,b)}{\partial w }\\ b = b - \alpha*\frac{\partial J(w,b)}{\partial b }\\ w = temp\_w\\ temp_w=wαwJ(w,b)b=bαbJ(w,b)w=temp_w
询问deepseek之后得知是正确的。

再说梯度下降算法中的参数 α \alpha α,名字叫做学习率(Learning rate),在通过梯度下降找最优参数的时候,偏导数确定方向,学习率确定跨幅,学习率是0~1之间的一个数,太小或者太大都会出现问题,所以有相关的自适应学习率算法

Batch Gradient Descent 批量梯度下降:通过每次迭代使用全部训练数据计算梯度来更新模型参数

求偏导:
∂ J ( w , b ) ∂ w = ∂ 1 2 m ∑ i = 1 m ( y i ^ − y i ) 2 ∂ w = ∂ 1 2 m ∑ i = 1 m [ ( w x i + b ) − y i ] 2 ∂ w = 1 2 m ∗ ∑ i = 1 m ∗ 2 ( w x i − y i ) ∗ x i = 1 m ∗ ∑ i = 1 m ( w x i − y i ) ∗ x i \frac{\partial J(w,b)}{\partial w} = \frac{\partial \frac{1}{2m}\sum_{i=1}^m(\hat{y_i}-y_i)^2}{\partial w} \\=\frac{\partial \frac{1}{2m}\sum_{i=1}^m[(wx_i+b)-y_i]^2}{\partial w} \\=\frac{1}{2m}*\sum_{i=1}^m*2(wx_i-y_i)*x_i \\=\frac{1}{m}*\sum_{i=1}^m(wx_i-y_i)*x_i wJ(w,b)=w2m1i=1m(yi^yi)2=w2m1i=1m[(wxi+b)yi]2=2m1i=1m2(wxiyi)xi=m1i=1m(wxiyi)xi

相关文章:

  • Java SE(7)——类和对象(二)
  • 深入解析 SqlSugar 与泛型封装:实现通用数据访问层
  • 4.29-4.30 Maven+单元测试
  • Spring MVC @RequestBody 注解怎么用?接收什么格式的数据?
  • 数据赋能(208)——质量管理——及时性原则
  • 单细胞测序数据分析流程的最佳实践
  • 旋转矩阵公式理解
  • Learning vtkjs之PolyDataNormals
  • Android Compose 中 Side Effects 和 State 相关的 API 使用
  • Python datetime库的用法 Python从入门到入土系列第3篇-洞察标准库DateTime
  • 第九章:反击的序曲(续)
  • 优化01-统计信息
  • Space Engineers 太空工程师 [DLC 解锁] [Steam] [Windows]
  • 生成器模式(Builder Pattern)
  • C++ 单例模式详解
  • 智能决策支持系统的基本概念与理论体系
  • api补充
  • 互联网大厂Java面试:从Spring到微服务的技术探讨
  • 在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)
  • Socket-TCP
  • 吴清:推动公募基金高质量发展的行动方案今天将会发布
  • 奥迪4S店内揭车衣时遭“连环车损”,双方因赔偿分歧陷僵局
  • 缅甸国防军继续延长临时停火期限至5月31日
  • 泰国培训十万网络安全人员加强网络防御打击电诈
  • 蓝佛安主持东盟与中日韩财长和央行行长系列会议并举行多场双边会见
  • 贵州黔西市载人游船倾覆事故已致3人遇难,14人正在搜救中