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

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

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

http://www.xdnf.cn/news/3719.html

相关文章:

  • 【WZOI】【题解】【质数密度】质数密度题解报告
  • 旋转矩阵公式理解
  • 【云备份】服务端数据管理模块设计与实现
  • 嵌入式 GCC 编译工具链:32 位与 64 位助力高效开发
  • [UVM]UVM中reg_map的作用及多个rem_map的使用案例
  • 【C++篇】类和对象(上)
  • 饱和蒸汽再生数据采集挥发性有机物(VOCs)吸附脱附实验装置
  • Pillow 玩图术:轻松获取图片尺寸和颜色模式
  • 肥胖风险的多类预测——CatBoost模型的89%
  • 《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-用声音合成玩音乐:MATLAB电子琴制作(超级趣味实践版)
  • 用可视化学习逆置法
  • 【Linux】Linux应用开发小经验
  • 信息安全导论 第七章 网络边界防御技术
  • 前端面经-VUE3篇(二)--vue3组件知识(二)依赖注入、异步组件、生命周期、组合式函数、插件
  • piccolo-large-zh-v2 和 bge-m3哪个效果好?
  • 【Mytais系列】SqlSession
  • 经典算法 求解硬币组成问题
  • 【Mytais系列】Select语句执行流程
  • 学习笔记:Qlib 量化投资平台框架 — FOR DEVELOPERS
  • 使用线性表实现通讯录管理
  • MySQL表的约束
  • Yocto介绍
  • 【C语言练习】018. 定义和初始化结构体
  • 【c++】模板详解
  • [android]MT6835 Android 移植brctl指令
  • PowerShell从5.1升级到7.X
  • 深挖Java之:运算符与输入器
  • #Paper Reading# DeepSeek-R1
  • DeepSeek与MySQL:开启数据智能新时代
  • Java SE(7)——类和对象(二)