[学习笔记] [机器学习] 4. [上]线性回归(正规方程、梯度下降、岭回归)

news2024/10/5 12:56:17
  1. 视频链接
  2. 数据集下载地址:无需下载

本文学习目标:

  • 掌握线性回归的实现过程
  • 应用LinearRegressionSGDRegressor实现回归预测
  • 知道回归算法的评估标准及其公式
  • 知道过拟合与欠拟合的原因以及解决方法
  • 知道岭回归的原理及与线性回归的不同之处
  • 应用Ridge实现回归预测
  • 应用joblib实现模型的保存与加载

1. 线性回归简介

学习目标:

  1. 了解线性回归的应用场景
  2. 知道线性回归的定义

1.1 线性回归应用场景

  • 房价预测
  • 销售额度预测
  • 贷款额度预测

举例:

在这里插入图片描述

华氏度与摄氏度直接的转换可以通过线性回归计算得得到。

1.2 什么是线性回归

1.2.1 定义与公式

一、定义

线性回归模型是机器学习中最简单、最基础的一类有监督学习模型。它要处理的一类问题是:给定一组输入样本,和每个样本对应的目标值,需要在某一损失准则下,找到(学习到)目标值和输入值的函数关系。这样,当有一个新的样本到达时,就可以根据这个函数关系预测出它的目标值。

简言之,线性回归(Linear Regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归

线性回归的特点:

  1. 线性回归模型有很好的可解释性,可以从权重w直接看出每个特征对结果的影响程度。
  2. 它适用于X和y之间存在线性关系的数据集,可以使用计算机辅助画出散点图来观察是否存在线性关系。

二、公式

线性回归的公式表达形式为

h ( w ) = w 1 x 1 + w 2 x 2 + . . . + b = w T + b \begin{aligned} h(w) & = w_1x_1 + w_2x_2 + ... + b\\ &=w^T + b \end{aligned} h(w)=w1x1+w2x2+...+b=wT+b

其中, w w w x x x可以理解为矩阵,即 w = [ b w 1 w 2 ] w=\begin{bmatrix}b \\ w_1 \\ w_2\end{bmatrix} w= bw1w2 x = [ 1 x 1 x 2 ] x=\begin{bmatrix} 1 \\ x_1 \\ x_2 \end{bmatrix} x= 1x1x2

举例:线性回归用矩阵表示

{ 1 × x 1 + x 2 = 2 0 × x 1 + x 2 = 2 2 × x 1 + x 2 = 3 \begin{cases} 1 \times x_1 + x_2 = 2 \\ 0 \times x_1 + x2 = 2 \\ 2 \times x_1 + x2 = 3 \end{cases} 1×x1+x2=20×x1+x2=22×x1+x2=3

写成矩阵的形式:

[ 1 1 0 1 2 1 ] A × [ x 1 x 2 ] x = [ 2 2 3 ] b \underset{A}{\begin{bmatrix} 1 & 1 \\ 0 & 1 \\ 2 & 1 \\ \end{bmatrix}} \times \underset{x}{\begin{bmatrix} x_1 \\ \\ x_2 \end{bmatrix}} = \underset{b}{\begin{bmatrix} 2 \\ 2 \\ 3 \end{bmatrix}} A 102111 ×x x1x2 =b 223

从列的角度看:

[ 1 0 2 ] a 1 × x 1 + [ 1 1 1 ] a 2 × x 2 = [ 2 2 3 ] b \underset{a_1}{\begin{bmatrix} 1 \\ 0 \\ 2 \\ \end{bmatrix}} \times x_1 + \underset{a_2}{\begin{bmatrix} 1 \\ 1 \\ 1 \\ \end{bmatrix}} \times x_2 = \underset{b}{\begin{bmatrix} 2 \\ 2 \\ 3 \\ \end{bmatrix}} a1 102 ×x1+a2 111 ×x2=b 223

那么怎么理解呢?我们来看几个例子:

  • 期末成绩 = 0.7 × 考试成绩 + 0.3 × 平时成绩
  • 房子价格 = 0.02 × 中心区域的距离 + 0.04 × 城市一氧化氮浓度 + (-0.12 × 自住房平均房价) + 0.254 × 城镇犯罪率

上面两个例子,我们看到特征值与目标值之间建立了一种关系,这种关系可以理解为线性模型。

1.2.2 线性回归的特征与目标的关系分析

线性回归当中主要有两种模型,一种是线性关系,另一种是非线性关系。在这里我们只画一个平面以更好地理解,所以都用单个特征或两个特征举例子。

1.1 线性关系:单变量线性关系

在这里插入图片描述

1.2 线性关系:多变量线性关系

在这里插入图片描述

总结:单特征与目标值的关系呈直线关系,或者两个特征与目标值呈现平面关系。对于更高维度的我们不用自己去想,记住这种关系即可。

2.1 非线性关系

在这里插入图片描述

Q:上图中为什么是非线性关系呢?
A:如果是非线性关系,那么回归方程可以理解为:

w 1 x 1 + w 2 x 2 2 + w 3 2 w_1 x_1 + w_2 x_2^2 + w_3^2 w1x1+w2x22+w32

因为涉及到平方,所以就是不再是线性关系了!


小结

  • 线性回归的定义【了解】
    • 利再回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。
  • 线性回归的分类【知道】
    • 线性关系
    • 非线性关系

2. 线性回归API的初步使用

学习目标:

  • 知道线性回归api的简单使用

2.1 线性回归API

  • sklearn.linear_model.LinearRegression(fit_intercept=True, copy_X=True, n_jobs=None, positive=False)
    • LinearRegression.coef_:回归系数。LinearRegression.coef_LinearRegression 类的一个属性,它返回线性模型的系数。在拟合线性模型后,可以通过访问 coef_ 属性来获取模型的系数。
      • 例如,如果您拟合了一个一元线性回归模型,那么 coef_ 属性将返回一个一维数组,其中包含模型的斜率。如果您拟合了一个多元线性回归模型,那么 coef_ 属性将返回一个一维数组,其中包含每个自变量的系数。

coef是 coefficient 的缩写

coefficient:英[ˌkəʊɪˈfɪʃnt] 美[ˌkoʊɪˈfɪʃnt]
n. (测定物质某种特性的)系数; adj. 共同作用的;

sklearn.linear_model.LinearRegression() 是 scikit-learn 库中的一个线性回归模型。它可以用来拟合一个线性模型,以最小化数据点和拟合直线之间的残差平方和。

LinearRegression 类的主要参数包括:

  • fit_intercept:布尔值,默认为 True。指定是否计算截距项。
  • normalize:布尔值,默认为 False。指定是否对数据进行标准化处理。
  • copy_X:布尔值,默认为 True。指定是否复制输入数据。
  • n_jobs:整数或 None,默认为 None。指定用于计算的 CPU 核心数。

sklearn.linear_model.LinearRegression 类的主要方法包括:

  • fit(X, y[, sample_weight]):用于拟合线性模型。
  • get_params([deep]):获取模型的参数。
  • predict(X):用于预测目标变量。
  • score(X, y[, sample_weight]):返回模型的预测性能得分。
  • set_params(**params):设置模型的参数。

2.2 举例

在这里插入图片描述

上图中,给了特征值和目标值,我们可以利用线性回归来求出两者的关系,进而知道“平时成绩”和“期末成绩”的比重。

2.2.1 步骤分析

  1. 获取数据集
  2. 数据基本处理(该案例中省略)
  3. 特征工程(该案例中省略)
  4. 机器学习
  5. 模型评估(该案例中省略)

2.2.2 代码实现

Step 1. 导入模块

from sklearn.linear_model import LinearRegression

Step 2. 构造数据集

x = [
    [80, 86], 
    [82, 80], 
    [85, 78], 
    [90, 90], 
    [86, 82], 
    [82, 90], 
    [78, 80], 
    [92, 94]
]

y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]

Step 3. 机器学习 —— 模型训练

# 实例化API
estimator = LinearRegression()

# 使用fit方法进行训练
estimator.fit(X=x, y=y)

res = estimator.predict([[100, 80]])
print("模型(线性回归)的系数为:", estimator.coef_)
print("预测[100, 80]的结果为:", res)

运行结果

模型(线性回归)的系数为: [0.3 0.7]
预测[100, 80]的结果为: [86.]

小结

  • sklearn.linear_model.LinearRegression()
    • LinearRegression.coef_:线性回归的系数

3. 数学:求导

学习目标:

  • 知道常见的求导方法
  • 知道导数的四则运算

3.1 常见函数的导数

公式例子说明
( 常数 ) ′ = 0 (常数)'=0 (常数)=0 ( 5 ) ′ = 0 (5)'=0 (5)=0常数的导数为零
( x a ) ′ = a x a − 1 (x^a)'=ax^{a-1} (xa)=axa1 ( x 3 ) ′ = 3 x 2 (x^3)'=3x^2 (x3)=3x2幂函数的导数
( a x ) ′ = a x ln ⁡ a (a^x)'=a^x\ln{a} (ax)=axlna ( 2 x ) ′ = 2 x ln ⁡ 2 (2^x)'=2^x \ln{2} (2x)=2xln2指数函数的导数
( e x ) ′ = e x (e^x)'=e^x (ex)=ex ( e x ) ′ = e x (e^x)'=e^x (ex)=ex e e e为底的指数函数的导数
( log ⁡ a x ) ′ = 1 x ln ⁡ a (\log_a{x})'=\frac{1}{x\ln{a}} (logax)=xlna1 ( log ⁡ 10 x ) ′ = 1 x ln ⁡ 10 (\log_{10}{x})'=\frac{1}{x\ln{10}} (log10x)=xln101对数函数的导数
( ln ⁡ x ) ′ = 1 x (\ln{x})'=\frac{1}{x} (lnx)=x1 ( ln ⁡ x ) ′ = 1 x (\ln{x})'=\frac{1}{x} (lnx)=x1 e e e为底的对数函数的导数
( sin ⁡ x ) ′ = cos ⁡ x (\sin{x})'=\cos{x} (sinx)=cosx ( sin ⁡ x ) ′ = cos ⁡ x (\sin{x})'=\cos{x} (sinx)=cosx正弦函数的导数
( cos ⁡ x ) ′ = − sin ⁡ x (\cos{x})'=-\sin{x} (cosx)=sinx ( cos ⁡ x ) ′ = − sin ⁡ x (\cos{x})'=-\sin{x} (cosx)=sinx余弦函数的导数

3.2 导数的四则运算

公式说明
[ u ( x ) ± v ( x ) ] ′ = u ′ ( x ) ± v ′ ( x ) [\mathrm{u}(x) \pm \mathrm{v}(x)]' = \mathrm{u}'(x) \pm \mathrm{v}'(x) [u(x)±v(x)]=u(x)±v(x)和/差的导数
[ u ( x ) ⋅ v ( x ) ] ′ = u ′ ( x ) ⋅ v ( x ) + u ( x ) ⋅ v ′ ( x ) [\mathrm{u}(x) \cdot \mathrm{v}(x)]' = \mathrm{u}'(x) \cdot \mathrm{v}(x) + \mathrm{u}(x) \cdot \mathrm{v}'(x) [u(x)v(x)]=u(x)v(x)+u(x)v(x)积的导数
[ u ( x ) v ( x ) ] ′ = u ′ ( x ) ⋅ v ( x ) − u ( x ) ⋅ v ′ ( x ) v 2 ( x ) \left[\frac{\mathrm{u}(x)}{\mathrm{v}(x)}\right]' = \frac{\mathrm{u}'(x) \cdot \mathrm{v}(x) - \mathrm{u}(x)\cdot \mathrm{v}'(x)}{\mathrm{v}^2(x)} [v(x)u(x)]=v2(x)u(x)v(x)u(x)v(x)商的导数
{ g [ h ( x ) ] } ′ = g ′ ( h ) ⋅ h ′ ( x ) \{\mathrm{g}[\mathrm{h}(x)]\}'=\mathrm{g}'(\mathrm{h}) \cdot \mathrm{h}'(x) {g[h(x)]}=g(h)h(x)复合函数的导数

3.3 矩阵(向量)求导【了解】

下面这个表格是关于偏导数的。它列出了一些常见的偏导数表达式及其分子布局。每一行都给出了一个特定的条件和表达式,以及两种不同的分子布局。

序号条件表达式分子布局:按 y y y x T x^\mathrm{T} xT 排列分子布局:按 y T y^\mathrm{T} yT x x x 排列说明
1 a a a 不是 x x x 的函数 ∂ a ∂ x = \frac{\partial{a}}{\partial{x}}= xa=00 a a a 不是 x x x 的函数时, ∂ a ∂ x = 0 \frac{\partial{a}}{\partial{x}}=0 xa=0
2 ∂ x ∂ x = \frac{\partial{x}}{\partial{x}}= xx= I \mathrm{I} I I \mathrm{I} I ∂ x ∂ x = I \frac{\partial{x}}{\partial{x}}=\mathrm{I} xx=I,其中 I \mathrm{I} I 是单位矩阵
3 a a a 不是 x x x 的函数 ∂ A x ∂ x = \frac{\partial{\mathrm{A}x}}{\partial{x}}= xAx= A \mathrm{A} A A T \mathrm{A}^\mathrm{T} AT a a a 不是 x x x 的函数时, ∂ A x ∂ x = A \frac{\partial{\mathrm{A}x}}{\partial{x}}=\mathrm{A} xAx=A
4 a a a 不是 x x x 的函数 ∂ x T A ∂ x = \frac{\partial{x^\mathrm{T}\mathrm{A}}}{\partial{x}}= xxTA= A T \mathrm{A}^\mathrm{T} AT A \mathrm{A} A a a a 不是 x x x 的函数时, ∂ x T A ∂ x = A T \frac{\partial{x^\mathrm{T}\mathrm{A}}}{\partial{x}}=\mathrm{A}^\mathrm{T} xxTA=AT
5 a a a 不是 x x x 的函数, u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) ∂ a u ∂ x = \frac{\partial{a\mathrm{u}}}{\partial{x}}= xau= a ∂ u ∂ x a\frac{\partial{\mathrm{u}}}{\partial{x}} axu a ∂ u ∂ x a\frac{\partial{\mathrm{u}}}{\partial{x}} axu a a a 不是 x x x 的函数且 u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) 时, ∂ a u ∂ x = a ∂ u ∂ x \frac{\partial{a\mathrm{u}}}{\partial{x}}=a\frac{\partial{\mathrm{u}}}{\partial{x}} xau=axu
6 v = v ( x ) \mathrm{v} = \mathrm{v}(x) v=v(x), u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) ∂ v u ∂ x = \frac{\partial{\mathrm{v}\mathrm{u}}}{\partial{x}}= xvu= v ∂ u ∂ x + u ∂ v ∂ x \mathrm{v}\frac{\partial{\mathrm{u}}}{\partial{x}} + \mathrm{u}\frac{\partial{\mathrm{v}}}{\partial{x}} vxu+uxv v ∂ u ∂ x + ∂ v ∂ x u T \mathrm{v}\frac{\partial{\mathrm{u}}}{\partial{x}} + \frac{\partial{\mathrm{v}}}{\partial{x}} \mathrm{u}^\mathrm{T} vxu+xvuT v = v ( x ) \mathrm{v} = \mathrm{v}(x) v=v(x) u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) 时, ∂ v u ∂ x = v ∂ u ∂ x + u ∂ v ∂ x \frac{\partial{\mathrm{v}\mathrm{u}}}{\partial{x}}=\mathrm{v}\frac{\partial{\mathrm{u}}}{\partial{x}} + \mathrm{u}\frac{\partial{\mathrm{v}}}{\partial{x}} xvu=vxu+uxv
7 a a a 不是 x x x 的函数, u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) ∂ A u ∂ x = \frac{\partial{\mathrm{A}\mathrm{u}}}{\partial{x}}= xAu= A ∂ u ∂ x \mathrm{A}\frac{\partial{\mathrm{u}}}{\partial{x}} Axu ∂ u ∂ x A T \frac{\partial{\mathrm{u}}}{\partial{x}}\mathrm{A}^\mathrm{T} xuAT a a a 不是 x x x 的函数且 u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) 时, ∂ A u ∂ x = A ∂ u ∂ x \frac{\partial{\mathrm{A}\mathrm{u}}}{\partial{x}}=\mathrm{A}\frac{\partial{\mathrm{u}}}{\partial{x}} xAu=Axu
8 u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x), v = v ( x ) \mathrm{v} = \mathrm{v}(x) v=v(x) ∂ ( u + v ) ∂ x = \frac{\partial{(\mathrm{u}+\mathrm{v})}}{\partial{x}}= x(u+v)= ∂ u ∂ x + ∂ v ∂ x \frac{\partial{\mathrm{u}}}{\partial{x}} + \frac{\partial{\mathrm{v}}}{\partial{x}} xu+xv ∂ u ∂ x + ∂ v ∂ x \frac{\partial{\mathrm{u}}}{\partial{x}} + \frac{\partial{\mathrm{v}}}{\partial{x}} xu+xv u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) v = v ( x ) \mathrm{v} = \mathrm{v}(x) v=v(x) 时, ∂ ( u + v ) ∂ x = ∂ u ∂ x + ∂ v ∂ x \frac{\partial{(\mathrm{u}+\mathrm{v})}}{\partial{x}}=\frac{\partial{\mathrm{u}}}{\partial{x}} + \frac{\partial{\mathrm{v}}}{\partial{x}} x(u+v)=xu+xv
9 u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) ∂ g ( u ) ∂ x = \frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{x}}= xg(u)= ∂ g ( u ) ∂ u ∂ u ∂ x \frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{\mathrm{u}}}\frac{\partial{\mathrm{u}}}{\partial{x}} ug(u)xu ∂ u ∂ x ∂ g ( u ) ∂ u \frac{\partial{\mathrm{u}}}{\partial{x}}\frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{\mathrm{u}}} xuug(u) u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) 时, ∂ g ( u ) ∂ x = ∂ g ( u ) ∂ u ∂ u ∂ x \frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{x}}=\frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{\mathrm{u}}}\frac{\partial{\mathrm{u}}}{\partial{x}} xg(u)=ug(u)xu
10 u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) ∂ f ( g ( u ) ) ∂ x = \frac{\partial{f(\mathrm{g}(\mathrm{u}))}}{\partial{x}}= xf(g(u))= ∂ f ( g ) ∂ g ∂ g ( u ) ∂ u ∂ u ∂ x \frac{\partial{f(\mathrm{g})}}{\partial{\mathrm{g}}}\frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{\mathrm{u}}}\frac{\partial{\mathrm{u}}}{\partial{x}} gf(g)ug(u)xu ∂ u ∂ x ∂ g ( u ) ∂ u ∂ f ( g ) ∂ g \frac{\partial{\mathrm{u}}}{\partial{x}}\frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{\mathrm{u}}}\frac{\partial{f(\mathrm{g})}}{\partial{\mathrm{g}}} xuug(u)gf(g) u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) 时, ∂ f ( g ( u ) ) ∂ x = ∂ f ( g ) ∂ g ∂ g ( u ) ∂ u ∂ u ∂ x \frac{\partial{f(\mathrm{g}(\mathrm{u}))}}{\partial{x}}=\frac{\partial{f(\mathrm{g})}}{\partial{\mathrm{g}}}\frac{\partial{\mathrm{g}(\mathrm{u})}}{\partial{\mathrm{u}}}\frac{\partial{\mathrm{u}}}{\partial{x}} xf(g(u))=gf(g)ug(u)xu

其中:

  • I \mathrm{I} I:单位矩阵
  • A \mathrm{A} A:矩阵 A \mathrm{A} A
  • A T \mathrm{A}^\mathrm{T} AT:矩阵 A \mathrm{A} A 的转置
  • u = u ( x ) \mathrm{u}=\mathrm{u}(x) u=u(x) u \mathrm{u} u x x x 的函数
  • v = v ( x ) \mathrm{v} = \mathrm{v}(x) v=v(x) v \mathrm{v} v x x x 的函数

“分子布局:按 y y y x T x^\mathrm{T} xT 排列”和“分子布局:按 y T y^\mathrm{T} yT x x x 排列”是指偏导数表达式的分子中矩阵的排列顺序。这两个术语描述的是偏导数表达式分子中矩阵的排列顺序。可以把它们想象成两种不同的方式来组合矩阵。

  • 在“分子布局:按 y y y x T x^\mathrm{T} xT 排列”中,矩阵是按照 y y y x T x^\mathrm{T} xT 的顺序排列的。例如,在第6行中, ∂ v u ∂ x = v ∂ u ∂ x + u ∂ v ∂ x \frac{\partial{\mathrm{v}\mathrm{u}}}{\partial{x}}=\mathrm{v}\frac{\partial{\mathrm{u}}}{\partial{x}} + \mathrm{u}\frac{\partial{\mathrm{v}}}{\partial{x}} xvu=vxu+uxv,其中 v \mathrm{v} v ∂ u ∂ x \frac{\partial{\mathrm{u}}}{\partial{x}} xu 前面, u \mathrm{u} u ∂ v ∂ x \frac{\partial{\mathrm{v}}}{\partial{x}} xv 前面。

  • 在“分子布局:按 y T y^\mathrm{T} yT x x x 排列”中,矩阵是按照 y T y^\mathrm{T} yT x x x 的顺序排列的。例如,在第6行中, ∂ v u ∂ x = v ∂ u ∂ x + ∂ v ∂ x u T \frac{\partial{\mathrm{v}\mathrm{u}}}{\partial{x}}=\mathrm{v}\frac{\partial{\mathrm{u}}}{\partial{x}} + \frac{\partial{\mathrm{v}}}{\partial{x}} \mathrm{u}^\mathrm{T} xvu=vxu+xvuT,其中 ∂ v ∂ x \frac{\partial{\mathrm{v}}}{\partial{x}} xv u T \mathrm{u}^\mathrm{T} uT 前面。

形象地说明:

  • 在第6行中, ∂ v u ∂ x = v ∂ u ∂ x + u ∂ v ∂ x \frac{\partial{\mathrm{v}\mathrm{u}}}{\partial{x}}=\mathrm{v}\frac{\partial{\mathrm{u}}}{\partial{x}} + \mathrm{u}\frac{\partial{\mathrm{v}}}{\partial{x}} xvu=vxu+uxv。在“分子布局:按 y y y x T x^\mathrm{T} xT 排列”中, v \mathrm{v} v u \mathrm{u} u 都在它们对应的偏导数前面,就像两个人站在一起,先是 v \mathrm{v} v,然后是 ∂ u ∂ x \frac{\partial{\mathrm{u}}}{\partial{x}} xu,再是 u \mathrm{u} u,最后是 ∂ v ∂ x \frac{\partial{\mathrm{v}}}{\partial{x}} xv
  • 而在“分子布局:按 y T y^\mathrm{T} yT x x x 排列”中, ∂ v ∂ x \frac{\partial{\mathrm{v}}}{\partial{x}} xv u T \mathrm{u}^\mathrm{T} uT 前面,就像两个人站在一起,先是 v \mathrm{v} v,然后是 ∂ u ∂ x \frac{\partial{\mathrm{u}}}{\partial{x}} xu,再是 ∂ v ∂ x \frac{\partial{\mathrm{v}}}{\partial{x}} xv,最后是 u T \mathrm{u}^\mathrm{T} uT

来源:https://en.wikipedia.org/wiki/Matrix_calculus#lScalar-by-vector_identities

4. 损失函数

学习目标:

  • 知道线性回归中损失函数

假设刚才的房子例子,真实的数据之间存在这样的关系:

真实关系: 

真实房子价格 = 0.02 × 中心区域的距离 + 0.04 × 城市一氧化氮浓度 
            + (-0.12 × 自住房平均房价) + 0.254 × 城镇犯罪率

那么现在我们随意指定一个关系(猜测):

猜测关系: 

预测房子价格 = 0.25 × 中心区域的距离 + 0.14 × 城市一氧化氮浓度 
            + 0.42 × 自住房平均房价 + 0.34 × 城镇犯罪率

请问这样的话,会发生什么?真实结果与我们预测的结果之间是不是存在一定的误差呢?类似下图这样:

在这里插入图片描述

很明显,红色的线预测得更加准确,而绿色的线不准确。

Q:仅凭肉眼区别是否准确是不科学的,那么我们应该如何量化呢?
A:这就是我们要学习的内容 —— 损失函数。


损失函数(Loss Function)是机器学习中关键的一个组成部分,用来衡量模型的输出与真实值之间的差距,给模型的优化指明方向

  • 损失函数的输入】损失函数将以两项作为输入:①模型的输出值和②标准答案的期望值。
  • 损失函数的输出】损失函数的输出称为损失,它是衡量我们的模型在预测结果方面做得有多好。
    • 损失的高值意味着我们的模型性能很差。
    • 较低的损耗值意味着我们的模型表现非常好。

损失函数的通用公式表达为:

L ( w 1 , w 2 , . . . ) = 1 n [ f ( y 1 , y ^ 1 ) + f ( y 2 , y ^ 2 ) + . . . + f ( y n , y ^ n ) ] = 1 n ∑ i = 1 n ( f ( y i , y ^ i ) ) \begin{aligned} \mathcal{L}(w_1, w_2, ...) & = \frac{1}{n}[f(y_1, \hat{y}_1) + f(y_2, \hat{y}_2) + ... + f(y_n, \hat{y}_n)] \\ & = \frac{1}{n}\sum_{i = 1}^{n}(f(y_i, \hat{y}_i)) \end{aligned} L(w1,w2,...)=n1[f(y1,y^1)+f(y2,y^2)+...+f(yn,y^n)]=n1i=1n(f(yi,y^i))

其中:

  • w 1 , w 2 , . . . w_1, w_2, ... w1,w2,... 表示模型的权重,参数的数量取决于模型的复杂度和数据的特征数量。
    • 它们的数量与数据的特征数量有关。
    • 需要注意的是,参数的数量与样本数量 n n n 无关。
  • n n n 是样本数量
  • y i y_i yi 是第 i i i 个样本的真实值
  • y i ^ \hat{y_i} yi^ 是第 i i i 个样本的预测值
  • f ( a , b ) f(a, b) f(a,b) 表明如何处理输入值的公式,常见的有:
    • 均方误差(Mean Squared Error,MSE):用于回归问题,计算预测值与真实值之间距离的平方和。
    • 平均绝对误差(Mean Absolute Error,MAE):用于回归问题,计算预测值与真实值之间距离的绝对值之和。
    • 交叉熵损失(Cross-Entropy Loss):用于分类问题,计算真实类别的概率分布与预测概率分布之间的差异。
    • Hinge Loss:用于支持向量机(SVM)分类问题。
    • L1损失函数:用于回归问题,计算预测值与真实值之间的绝对值之和。
    • L2损失函数:用于回归问题,计算预测值与真实值之间距离的平方和。

Q:如何去减少这个损失,使我们预测的更加准确些?
A:既然存在了这个损失,我们一直说机器学习有自动学习的功能,在线性回归里更能够体现。这里可以通过一些优化方法去优化(其实是数学当中的求导功能)回归的总损失。

5. 优化算法

学习目标:

  • 知道使用正规方程对损失函数优化的过程
  • 知道使用梯度下降法对损失函数优化的过程

如何去求模型当中的 w w w,使得损失最小?(目的是找到最小损失对应的 w w w 值)

线性回归经常使用的两种优化算法:

  • 正规方程
  • 梯度下降法

5.1 正规方程(Normal Equation)

5.1.1 什么是正规方程

正规方程(Normal Equation)是一种用于求解线性回归问题的解析方法。它通过求解线性方程组来直接计算模型的最优权重(一步完事儿😂),而不需要使用迭代优化算法(如梯度下降法)。正规方程的公式表达为:

W = ( X T X ) − 1 X T y W = (X^TX)^{-1}X^Ty W=(XTX)1XTy

其中 X X X 是数据矩阵, y y y 是真实值向量, W = w 1 , w 2 , . . . W = w_1, w_2, ... W=w1,w2,... 是模型的最优权重向量。

正规方程的优点是计算简单,不需要选择学习率等超参数。但是,当数据特征数量较大时,计算 ( X T X ) − 1 (X^TX)^{-1} (XTX)1 的时间复杂度较高,因此不适用于大规模数据集

理解: X X X 为特征值矩阵, y y y 为目标值矩阵。直接一步求出最好的结果

缺点:当特征过多过复杂时,求解速度太慢并且得不到结果。

在这里插入图片描述

5.1.2 正规方程求解举例


x 0 x_0 x0
面积(平方英尺)
x 1 x_1 x1
卧室数量
x 2 x_2 x2
楼层数量
x 3 x_3 x3
房龄(年)
x 4 x_4 x4
价格(千美元)
y y y
121045145460
114163240232
115343230315
18522136178

我们可以将表格中的数据转换为矩阵的形式。

X = [ 1 2104 5 1 45 1 1416 3 2 40 1 1534 3 2 30 1 852 2 1 36 ] , y = [ 460 232 315 178 ] X = \begin{bmatrix} 1 & 2104 & 5 & 1 & 45 \\ 1 & 1416 & 3 & 2 & 40 \\ 1 & 1534 & 3 & 2 & 30 \\ 1 & 852 & 2 & 1 & 36 \end{bmatrix}, y = \begin{bmatrix} 460 \\ 232 \\ 315 \\ 178 \end{bmatrix} X= 11112104141615348525332122145403036 ,y= 460232315178

其中, X X X 是自变量矩阵,每一行表示一个样本,每一列表示一个特征; y y y 是因变量向量,每一行表示一个样本的真实值。

即:

X ( 0 ) X(0) X(0) X ( 1 ) X(1) X(1) X ( 2 ) X(2) X(2) X ( 3 ) X(3) X(3) X ( 4 ) X(4) X(4) y y y
121045145460
114163240232
115343230315
18522136178

正规方程(Normal Equation)是一种用于求解线性回归问题的解析方法。它通过求解线性方程组来直接计算模型的最优权重,而不需要使用迭代优化算法(如梯度下降法)。正规方程的公式表达为:

W = ( X T X ) − 1 X T y = ( [ 1 1 1 1 2104 1416 1534 852 5 3 3 2 1 2 2 1 45 40 30 36 ] [ 1 2104 5 1 45 1 1416 3 2 40 1 1534 3 2 30 1 852 2 1 36 ] ) − 1 × [ 1 1 1 1 2104 1416 1534 852 5 3 3 2 1 2 2 1 45 40 30 36 ] [ 460 232 315 178 ] W = (X^TX)^{-1}X^Ty = \\ \left(\begin{bmatrix} 1 & 1 & 1 & 1 \\ 2104 & 1416 & 1534 & 852 \\ 5 & 3 & 3 & 2 \\ 1 & 2 & 2 & 1 \\ 45 & 40 & 30 & 36 \end{bmatrix} \begin{bmatrix} 1 & 2104 & 5 & 1 & 45 \\ 1 & 1416 & 3 & 2 & 40 \\ 1 & 1534 & 3 & 2 & 30 \\ 1 & 852 & 2 & 1 & 36 \end{bmatrix}\right)^{-1} \times \begin{bmatrix} 1 & 1 & 1 & 1 \\ 2104 & 1416 & 1534 & 852 \\ 5 & 3 & 3 & 2 \\ 1 & 2 & 2 & 1 \\ 45 & 40 & 30 & 36 \end{bmatrix} \begin{bmatrix} 460 \\ 232 \\ 315 \\ 178 \end{bmatrix} W=(XTX)1XTy= 12104514511416324011534323018522136 11112104141615348525332122145403036 1× 12104514511416324011534323018522136 460232315178

上面的方程是非常难求的,因为涉及到了矩阵的逆。

5.1.3 正规方程的推导

我们以最小二乘法为例。

L ( w 1 , w 2 , . . . ) = ( y 1 − y ^ 1 ) 2 + ( y 2 − y ^ 2 ) 2 + ( y n − y ^ n ) 2 = ∑ i = 1 n ( y i − y ^ i ) 2 \begin{aligned} \mathcal{L}(w_1, w_2, ...) & = (y_1 - \hat{y}_1)^2 + (y_2 - \hat{y}_2)^2 + (y_n - \hat{y}_n)^2 \\ & = \sum_{i=1}^n(y_i - \hat{y}_i)^2 \end{aligned} L(w1,w2,...)=(y1y^1)2+(y2y^2)2+(yny^n)2=i=1n(yiy^i)2

推导方式一

把该损失函数转换成矩阵写法:

L ( w 1 , w 2 , . . . ) = ∑ i = 1 n ( y i − y ^ i ) 2 = ( X W − y ^ ) 2 \begin{aligned} \mathcal{L}(w_1, w_2, ...) & = \sum_{i=1}^n(y_i - \hat{y}_i)^2 \\ & = (XW - \hat{y})^2 \end{aligned} L(w1,w2,...)=i=1n(yiy^i)2=(XWy^)2

其中, L \mathcal{L} L 表示损失函数, w 1 , w 2 , . . . w_1, w_2, ... w1,w2,... 是模型的参数, n n n 是样本数量, y i y_i yi 是第 i i i 个样本的真实值, y ^ i \hat{y}_i y^i 是第 i i i 个样本的预测值。损失函数计算了所有样本真实值与预测值之差的平方和。

在矩阵形式中, X X X 是一个 n × m n \times m n×m 的矩阵,其中 n n n 是样本数量, m m m 是特征数量。每一行表示一个样本的特征值。 W W W 是一个 m × 1 m \times 1 m×1 的列向量,表示模型的参数。 y ^ \hat{y} y^ 是一个 n × 1 n \times 1 n×1 的列向量,表示所有样本的预测值。 ( X W − y ^ ) 2 (XW - \hat{y})^2 (XWy^)2 表示所有样本真实值与预测值之差的平方和。

最小二乘法损失函数是一个关于 W W W 的二次函数,可以通过对其求导并令导数为零来求解最小值。在这个过程中, X X X$ 和 \hat{y}$ 都是已知的。

求导:

2 ( X W − y ^ ) × X = 0 (1) \rm 2(XW - \hat{y}) \times X = 0 \tag{1} 2(XWy^)×X=0(1)

2 ( X W − y ^ ) × X = 0 X T (2) \rm 2(XW - \hat{y}) \times X = 0X^T \tag{2} 2(XWy^)×X=0XT(2)

2 ( X W − y ^ ) × ( X X T ) = 0 X T (3) \rm 2(XW - \hat{y}) \times (XX^T) = 0X^T \tag{3} 2(XWy^)×(XXT)=0XT(3)

2 ( X W − y ^ ) × ( X X T ) ( X X T ) − 1 = 0 X T ( X X T ) − 1 (4) \rm 2(XW - \hat{y}) \times (XX^T)(XX^T)^{-1} = 0X^T(XX^T)^{-1} \tag{4} 2(XWy^)×(XXT)(XXT)1=0XT(XXT)1(4)

2 ( X W − y ^ ) = 0 (5) \rm 2(XW - \hat{y}) = 0 \tag{5} 2(XWy^)=0(5)

X W = y (6) \rm XW = y \tag{6} XW=y(6)

X T X W = X T y ^ (7) \rm X^TXW = X^T\hat{y} \tag{7} XTXW=XTy^(7)

( X T X ) − 1 ( X T X ) × W = ( X T X ) − 1 × X T y ^ (8) \rm (X^TX)^{-1}(X^TX) \times W = (X^TX)^{-1} \times X^T\hat{y} \tag{8} (XTX)1(XTX)×W=(XTX)1×XTy^(8)

W = ( X T X ) − 1 × X T y ^ (9) \rm W = (X^TX)^{-1} \times X^T\hat{y} \tag{9} W=(XTX)1×XTy^(9)

这些公式是线性回归的推导过程。它们描述了如何通过最小化误差平方和来找到最佳拟合直线。这些公式中的变量有:

  • X \rm X X 是一个矩阵,其中每一行代表一个数据点,每一列代表一个特征。
  • W \rm W W 是一个列向量,表示线性回归模型的权重。
  • y ^ \rm \hat{y} y^ 是一个列向量,表示每个数据点的真实值。
  • X W \rm XW XW 是一个列向量,表示每个数据点的预测值。

注意

  • 这里的 0 0 0 是一个零矩阵。它的维度与 X T X^T XT 相同,因此它是一个 n × m n \times m n×m 的矩阵,其中 n n n X X X 的列数, m m m X T X^T XT 的列数。
  • X X T \rm XX^T XXT 一个方阵,可以保证它有逆( X \rm X X 不一定有逆!)

下面是对公式的解释说明

  1. 这是一个线性回归的损失函数对系数矩阵 W \rm W W的梯度为0的方程,其中 X \rm X X是输入特征矩阵, y ^ \hat{y} y^是预测值向量, X \rm X X表示矩阵乘法。

  2. 在式(1)两侧同时乘以矩阵 X T X^T XT得到的结果,因为 0 X T = 0 \rm 0X^T=0 0XT=0,所以这与式(1)等价。

  3. 将式(2)中的 X T \rm X^T XT左乘到式(1)中的 X \rm X X上,得到的结果是将梯度方程左乘以 X X T \rm XX^T XXT,然后右乘以 X T \rm X^T XT的结果。

  4. 将式(3)中的 ( X X T ) − 1 \rm (XX^T)^{-1} (XXT)1左右乘到式(3)中,则得到将梯度方程左乘以 X X T \rm XX^T XXT的逆矩阵,然后右乘以 X T \rm X^T XT的结果。这个式子可以用来计算最小二乘法的系数矩阵 W \rm W W

  5. 梯度为0时的方程简化为 X W = y ^ \rm XW=\hat{y} XW=y^,即模型预测值等于真实标签。

  6. 这是简单的线性回归方程,其中 W \rm W W是要学习的系数矩阵, X \rm X X是输入特征矩阵, y \rm y y是真实标签。

  7. 将上式左乘以 X T \rm X^T XT,得到 X T X W = X T y ^ \rm X^TXW=X^T\hat{y} XTXW=XTy^的形式。这个式子可以用来计算最小二乘法的系数矩阵 W \rm W W

  8. 将上式左右乘以 ( X T X ) − 1 \rm (X^TX)^{-1} (XTX)1,得到 W = ( X T X ) − 1 X T y ^ \rm W=(X^TX)^{-1}X^T\hat{y} W=(XTX)1XTy^的形式,这是最小二乘法的系数矩阵公式。

  9. 这是最小二乘法的系数矩阵公式, W \rm W W是要学习的系数矩阵, ( X T X ) − 1 \rm (X^TX)^{-1} (XTX)1是输入特征矩阵 X \rm X X经过转置和自己相乘的结果的逆矩阵, X T y ^ \rm X^T\hat{y} XTy^是输入特征矩阵 X \rm X X与真实标签 y \rm y y的乘积。

Q X X T \rm XX^T XXT X T X \rm X^TX XTX 都是方阵吗?
A X X T \rm XX^T XXT X T X \rm X^TX XTX 都是方阵。如果 X \rm X X 是一个 m × n m \times n m×n 的矩阵,那么 X X T \rm XX^T XXT 是一个 m × m m \times m m×m 的方阵,而 X T X \rm X^TX XTX 是一个 n × n n \times n n×n 的方阵。它们都有逆(这里的前提是它们的行列式不为零)

Q:方阵都有逆矩阵吗?
A:不是所有的方阵都有逆矩阵。只有当一个方阵的行列式不为零时,它才有逆矩阵。如果一个方阵的行列式为零,那么它是奇异矩阵,没有逆矩阵。

Q:行列式怎么求?
A:行列式是一个标量,它可以用来衡量一个方阵的可逆性。对于一个 n × n n \times n n×n 的方阵 A,它的行列式记为 det(A) 或 |A|。

对于一个 2 × 2 2 \times 2 2×2 的方阵,它的行列式可以直接计算:
∣ a b c d ∣ = a d − b c \begin{vmatrix} a & b \\ c & d \end{vmatrix} = ad - bc acbd =adbc

对于一个 n × n n \times n n×n 的方阵 ( n > 2 n > 2 n>2),它的行列式可以通过递归地计算子矩阵的行列式来求得。这种方法称为拉普拉斯展开。例如,对于一个 3 × 3 3 \times 3 3×3 的方阵,它的行列式可以通过以下公式计算:
∣ a b c d e f g h i ∣ = a ∣ e f h i ∣ − b ∣ d f g i ∣ + c ∣ d e g h ∣ \begin{vmatrix} a & b & c \\ d & e & f \\ g & h & i \end{vmatrix} = a \begin{vmatrix} e & f \\ h & i \end{vmatrix} - b \begin{vmatrix} d & f \\ g & i \end{vmatrix} + c \begin{vmatrix} d & e \\ g & h \end{vmatrix} adgbehcfi =a ehfi b dgfi +c dgeh

除了拉普拉斯展开,还有一些其他的方法可以用来计算行列式,例如高斯消元法和三角分解法。


推导方式二

把该损失函数转换成矩阵写法:

L ( w 1 , w 2 , . . . ) = ∑ i = 1 n ( y i − y ^ i ) 2 = ( X W − y ^ ) 2 \begin{aligned} \mathcal{L}(w_1, w_2, ...) & = \sum_{i=1}^n(y_i - \hat{y}_i)^2 \\ & = (XW - \hat{y})^2 \end{aligned} L(w1,w2,...)=i=1n(yiy^i)2=(XWy^)2

其中, L \mathcal{L} L 表示损失函数, w 1 , w 2 , . . . w_1, w_2, ... w1,w2,... 是模型的参数, n n n 是样本数量, y i y_i yi 是第 i i i 个样本的真实值, y ^ i \hat{y}_i y^i 是第 i i i 个样本的预测值。损失函数计算了所有样本真实值与预测值之差的平方和。

在矩阵形式中, X X X 是一个 n × m n \times m n×m 的矩阵,其中 n n n 是样本数量, m m m 是特征数量。每一行表示一个样本的特征值。 W W W 是一个 m × 1 m \times 1 m×1 的列向量,表示模型的参数。 y ^ \hat{y} y^ 是一个 n × 1 n \times 1 n×1 的列向量,表示所有样本的预测值。 ( X W − y ^ ) 2 (XW - \hat{y})^2 (XWy^)2 表示所有样本真实值与预测值之差的平方和。

最小二乘法损失函数是一个关于 W W W 的二次函数,可以通过对其求导并令导数为零来求解最小值。在这个过程中, X X X$ 和 \hat{y}$ 都是已知的。

把损失函数分开书写:

( X W − y ^ ) 2 = ( X W − y ^ ) T ( X W − y ^ ) \rm (XW - \hat{y})^2 = (XW - \hat{y})^T(XW-\hat{y}) (XWy^)2=(XWy^)T(XWy^)

对上式进行求导。

∂ ∂ W [ ( X W − y ^ ) T ( X W − y ^ ) ] = ∂ ∂ W [ ( W T X T − y ^ T ) ( X W − y ^ ) ] = ∂ ∂ W ( W T X T X W − W T X T y ^ − y ^ T X W + y ^ T y ^ ) = X T X W + X T X W − X T y ^ − X T y ^ \begin{aligned} \rm \frac{\partial}{\partial{W}}[(XW-\hat{y})^T(XW-\hat{y})] & = \rm \frac{\partial}{\partial{W}}[(W^TX^T - \hat{y}^T)(XW - \hat{y})] \\ & = \rm \frac{\partial}{\partial{W}}(W^TX^TXW - W^TX^T\hat{y} - \hat{y}^TXW + \hat{y}^T\hat{y}) \\ & = \rm X^TXW + X^TXW - X^T\hat{y} - X^T\hat{y} \end{aligned} W[(XWy^)T(XWy^)]=W[(WTXTy^T)(XWy^)]=W(WTXTXWWTXTy^y^TXW+y^Ty^)=XTXW+XTXWXTy^XTy^

因为要求导函数的极小值,所以把上式求导结果设为0,经过化解,得结果为:

X T X W = X T y ^ \rm X^TXW = X^T\hat{y} XTXW=XTy^

经化解为:

W = ( X T X ) − 1 X T y ^ \rm W = (X^TX)^{-1}X^T\hat{y} W=(XTX)1XTy^

补充:需要用到的矩阵求导公式如下。

∂ ∂ X X T A = A \frac{\partial}{\partial{X}}X^TA = A XXTA=A

∂ ∂ X A X = A T \frac{\partial}{\partial{X}}AX = A^T XAX=AT

总之,需要记住正规方程的公式表达为:

W = ( X T X ) − 1 X T y W = (X^TX)^{-1}X^Ty W=(XTX)1XTy

5.2 梯度下降(Gradient Descent)

5.2.1 什么是梯度下降

梯度下降法的基本思想可以类比为一个下山的过程。

假设这样一个场景:一个人被困在山上,需要从山上下来(即找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。

具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走(同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走)。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

在这里插入图片描述

梯度下降的基本过程就和下山的场景很类似。

首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。

根据之前的场景假设,最快的下山的方式就找到当前位置最陡峭的方向,然后沿着此方向向下走。对应到函数中,就是找到给定点的梯度,然后朝着梯度相反的方向,就能让函数值下降的最快。因为梯度的方向就是函数值变化最快的方向。所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

Q1:为什么是梯度相反的方向?
A1:梯度是一个向量,指向函数值增长最快的方向。因此,如果我们想要让函数值下降最快,就应该朝着梯度相反的方向移动。梯度的方向指向函数值增加最快的方向,而梯度的反方向则指向函数值减小最快的方向。所以,当我们沿着梯度的反方向走时,函数值在减小,也就是我们在下山。

举个例子,假设你站在一座山上,你想要尽快下山。你可以感受到你周围哪个方向最陡峭,然后朝着那个方向走。这个方向就是梯度的方向。但是,如果你想要尽快下山,那么你应该朝着梯度相反的方向走,也就是山的高度下降的方向。

Q2:对于一个U形曲线,它右侧的点的梯度是上山最快的,所以我们取梯度的反方向以尽快地下山。那么对于它左侧的点,梯度是负的吧,再取反岂不是上山?
A2:首先需要澄清一些误解:在机器学习中,梯度指向的方向并不一定总是上山或下山的方向,而是函数值变化最快的方向。对于一个U形曲线(即凸函数),它的左侧和右侧的点的梯度都指向函数值变化最快的方向,但是左侧的梯度是负的右侧的梯度是正的。

在梯度下降算法中,我们希望找到函数的极小值点,因此需要朝着梯度的反方向走,这样才能越过山峰、降低函数值。对于U形曲线的右侧点,其梯度是正的,所以取反方向就是负梯度方向,可以朝着函数极小值点的方向下降;而对于左侧点,虽然梯度是负的,但是它也是函数值变化最快的方向,也就是说,朝着梯度的反方向就是下山的方向,因此需要取相反方向的梯度来下降。

简要来说,针对一个U形曲线,对于任意一点,朝着梯度的反方向都是下降的方向,因为这样才能够逐渐接近函数的极小值点。

Q3:这个结论对于任意的损失函数都适用吗?
A3:这个结论并不适用于任意的函数。它只适用于那些具有单峰或单谷的函数,也就是说,函数只有一个局部最大值或局部最小值。对于那些具有多个峰和谷的函数,沿着梯度的反方向走可能会使我们陷入局部最优解,而无法到达全局最优解

Q4:在机器学习和深度学习中,这里的函数是损失函数吗?
A4:在机器学习和深度学习中,我们通常使用梯度下降法来最小化损失函数。损失函数衡量模型预测值与真实值之间的差异,我们希望通过最小化损失函数来训练模型。所以,在这种情况下,这里的函数是损失函数。

5.2.2 梯度的概念

梯度是微积分中一个很重要的概念。

  • 单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率。

  • 多变量函数中,梯度是一个向量,向量有方向,梯度的方向指出了函数在给定点的上升最快的方向,同时代表了函数在该点的局部变化率及其方向的信息。具体来说,梯度是由各个偏导数组成的向量,每个偏导数代表了函数沿着相应坐标轴方向的变化率,梯度的方向是函数在该点变化率增加最快的方向,其大小即为变化率的值。

Q1:什么是单变量函数,什么是多变量函数?
A1

  • 单变量的函数 L ( w ) \mathcal{L}(w) L(w),其中 w w w 是一个单变量,它是一个实数。它表示模型只有一个参数。
  • 多变量的函数 L ( W ) \mathcal{L}(W) L(W),其中 W W W 是一个向量或矩阵,表示模型有多个参数。

Q2:梯度的方向是函数在给定点上升最快的方向。这句话有错误吗?
A2:这句话的表述几乎正确,但是需要进行一些澄清和修正。

首先,对于一个标量函数 f ( x ) f(x) f(x),它在某个点 x x x的梯度 ∇ f ( x ) \nabla f(x) f(x)是一个向量,指出了函数值增加最快的方向。因此,可以说梯度的方向是函数在给定点上升最快的方向。

然而,在更一般的情况下,梯度的方向并不一定是函数值增加最快的方向。特别地,当函数的取值不是标量而是向量时,例如 f ( x ) = y f(\mathbf{x})=\mathbf{y} f(x)=y,则梯度 ∇ f ( x ) \nabla f(\mathbf{x}) f(x)的方向是函数变化最快的方向,但这个方向并不一定与函数值增加最快的方向相同

此外,只有在凸函数的情况下,梯度的方向才确保提供了函数值上升最快的方向。在非凸函数的情况下,存在许多可能的方向,其中一些可能会导致更快的函数值上升。

总之,可以说梯度的方向是在标量函数的情况下函数值上升最快的方向,或者在更一般的情况下,是函数变化最快的方向

Q3:梯度方向是函数变化最快的方向,那么在进行梯度下降下山时,需要判断梯度的正负吗?
A3:在进行梯度下降时,需要判断梯度的正负。

具体来说,对于一个可微函数 f ( x ) f(x) f(x),在某一点 x 0 x_0 x0处计算出它的梯度 ∇ f ( x 0 ) \nabla f(x_0) f(x0)。根据梯度的定义, ∇ f ( x 0 ) \nabla f(x_0) f(x0)是一个向量,它的方向指向函数在 x 0 x_0 x0处变化最快的方向,大小表示函数变化的速率。因此,为了让函数最快地下降,我们需要朝着梯度的反方向移动,即 − ∇ f ( x 0 ) - \nabla f(x_0) f(x0)的方向。

然而,仅仅知道梯度的方向还不够,我们还需要确定前进的步长,即学习率 η \eta η。在每一次迭代中,我们将当前位置沿着梯度的反方向移动一个步长 η \eta η,得到新的位置 x 1 = x 0 − η ∇ f ( x 0 ) x_1 = x_0 - \eta \nabla f(x_0) x1=x0ηf(x0)。这一步中,如果我们选择了错误的符号来改变梯度的方向,即误将梯度方向的正负弄反了,那么我们可能会朝着函数增加的方向移动,导致无法收敛甚至发散。

因此,在进行梯度下降时,需要利用梯度的正负信息来决定前进的方向。通常我们会在梯度向量中取反,得到 − ∇ f ( x 0 ) - \nabla f(x_0) f(x0)的方向作为下降的方向。

Q4:那么在进行梯度下降下山时,梯度一直是负的吗?也就是负数?
A4:在梯度下降算法中,梯度方向是函数在当前点的变化率最大的方向,因此梯度方向通常指向函数值下降的方向。

在目标函数存在全局最优解的情况下,梯度下降算法可以通过不断朝着梯度方向移动来逐步接近最优解。在每一次迭代中,梯度下降算法会计算当前位置的梯度,并将参数朝着负梯度的方向更新,以使得函数值不断减小。

因此,在进行梯度下降时:

  • 如果目标函数是凸函数且学习率合适,则梯度方向一直是负的(即负数),因为这意味着函数值会不断减小,从而逐步接近最优解。
  • 但是,如果目标函数存在多个局部最优解或者非凸性,可能会出现梯度方向不一定一直是负的情况。

总之,在梯度下降算法中,梯度方向指向函数值下降的方向,并且通常是负数,但也可能存在例外情况

这也就说明了为什么我们需要千方百计的求取梯度。我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向(函数变化最快的方向),那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的反方向一直走,就能走到局部的最低点。

5.2.3 梯度下降举例

5.2.3.1 单变量函数 L ( w ) \mathcal{L}(w) L(w) 的梯度下降

我们假设有一个单变量的函数:

L ( w ) = w 2 \mathcal{L}(w) = w^2 L(w)=w2

函数的微分:

L ′ ( w ) = 2 w \mathcal{L}'(w) = 2w L(w)=2w

  • 初始化模型参数,起点为: w 0 = 1 w^0 = 1 w0=1。表示在梯度下降算法的迭代过程中, w w w 的初始值被设定为 1 1 1。这意味着,在第一次迭代之前, w w w 的值为 1 1 1。在梯度下降算法中,选择一个合适的初始值是很重要的,因为它会影响到算法收敛的速度和最终结果。
  • 学习率: α = 0.4 \alpha = 0.4 α=0.4

学习率 α \alpha α 是梯度下降算法中的一个重要参数,它控制着每一步迭代时 w w w 值的更新幅度。在您给出的例子中,学习率被设定为 0.4 0.4 0.4

在梯度下降算法中,每一步迭代时,模型参数 w w w 的值会根据如下公式进行更新:

w t + 1 = w t − α × L ′ ( w t ) w^{t+1} = w^t - \alpha \times \mathcal{L}'(w^t) wt+1=wtα×L(wt)

其中, L ′ ( w t ) \mathcal{L}'(w^t) L(wt) 是损失函数对 w w w 的导数,表示当 w w w 改变时,损失函数值的变化率。

学习率过大会导致算法不稳定,可能会使损失函数的值在迭代过程中出现震荡甚至发散。而学习率过小会导致算法收敛速度过慢,需要更多的迭代次数才能达到最优解。


我们开始进行梯度下降的迭代计算过程:

w 0 = 1 (1) w^0 = 1 \tag{1} w0=1(1)

w 1 = w 0 − α × L ′ ( w 0 ) = 1 − 0.4 × 2 = 0.2 (2) \begin{aligned} w^1 & = w^0 - \alpha \times \mathcal{L}'(w^0) \\ & = 1 - 0.4 \times 2 \\ & = 0.2 \tag{2} \end{aligned} w1=w0α×L(w0)=10.4×2=0.2(2)

w 2 = w 1 − α × L ′ ( w 1 ) = 0.2 − 0.4 × 2 × 0.2 = 0.04 (3) \begin{aligned} w^2 & = w^1 - \alpha \times \mathcal{L}'(w^1) \\ & = 0.2 - 0.4 \times 2 \times 0.2 \\ & = 0.04 \tag{3} \end{aligned} w2=w1α×L(w1)=0.20.4×2×0.2=0.04(3)

w 3 = w 2 − α × L ′ ( w 2 ) = 0.04 − 0.4 × 2 × 0.04 = 0.008 (4) \begin{aligned} w^3 & = w^2 - \alpha \times \mathcal{L}'(w^2) \\ & = 0.04 - 0.4 \times 2 \times 0.04 \\ & = 0.008 \tag{4} \end{aligned} w3=w2α×L(w2)=0.040.4×2×0.04=0.008(4)

w 4 = w 3 − α × L ′ ( w 3 ) = 0.008 − 0.4 × 2 × 0.008 = 0.0016 (5) \begin{aligned} w^4 & = w^3 - \alpha \times \mathcal{L}'(w^3) \\ & = 0.008 - 0.4 \times 2 \times 0.008 \\ & = 0.0016 \tag{5} \end{aligned} w4=w3α×L(w3)=0.0080.4×2×0.008=0.0016(5)

其中:

  • w w w 是一个单变量,它是一个实数。它表示模型只有一个参数。

  • L ( w ) \mathcal{L}(w) L(w):这是一个损失函数,用来衡量模型的预测值与真实值之间的差距。在梯度下降算法中,我们希望通过调整 w w w 的值来最小化损失函数的值。

  • L ′ ( w ) \mathcal{L}'(w) L(w):这是损失函数 L ( w ) \mathcal{L}(w) L(w) w w w 的导数。它表示当 w w w 改变时,损失函数值的变化率。

  • α \alpha α:这是学习率,它控制着梯度下降算法每一步迭代时 w w w 值的更新幅度。学习率过大会导致算法不稳定,而学习率过小会导致算法收敛速度过慢。

  • w t w^t wt:这表示在第 t t t 次迭代后, w w w 的值。

如下图所示,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底。

在这里插入图片描述

5.2.3.2 多变量函数 L ( W ) \mathcal{L}(W) L(W) 的梯度下降

我们假设有一个目标函数:

L ( W ) = w 1 2 + w 2 2 \mathcal{L}(W) = w_1^2 + w_2^2 L(W)=w12+w22

现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 ( 0 , 0 ) (0, 0) (0,0) 点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值。

  • 假设初始的起点为: W 0 = ( 1 , 3 ) W^0 = (1, 3) W0=(1,3)
  • 初始的学习率为: α = 0.1 \alpha = 0.1 α=0.1

函数的梯度为:

∇ L ( W ) = < 2 w 1 , 2 w 2 > \nabla{\mathcal{L}(W)} = <2w_1, 2w_2> L(W)=<2w1,2w2>

注意:梯度是一个向量,它的每个分量表示目标函数在该维度上的偏导数。这样写是正确的,表明是一个向量。

符号说明

  • L ( W ) \mathcal{L}(W) L(W):这是目标函数,它表示我们想要最小化的函数。在这个例子中,它是一个二次函数,表示为 w 1 2 + w 2 2 w_1^2 + w_2^2 w12+w22
  • W W W:这是一个向量,表示目标函数的自变量。在这个例子中,它有两个分量 w 1 w_1 w1 w 2 w_2 w2
  • ∇ L ( W ) \nabla{\mathcal{L}(W)} L(W):这是目标函数的梯度,它是一个向量,它的每个分量表示目标函数在该维度上的偏导数。在这个例子中,梯度为 < 2 w 1 , 2 w 2 > <2w_1, 2w_2> <2w1,2w2>
  • α \alpha α:这是学习率,它控制梯度下降算法每一步更新参数的幅度。在这个例子中,学习率为 0.1 0.1 0.1
  • W t W^t Wt:这表示梯度下降算法在第 t t t 次迭代时 W W W 的值。

Q:为什么 L ( W ) = w 1 2 + w 2 2 \mathcal{L}(W) = w_1^2 + w_2^2 L(W)=w12+w22求导得到的是 ∇ L ( W ) = < 2 w 1 , 2 w 2 > \nabla{\mathcal{L}(W)} = <2w_1, 2w_2> L(W)=<2w1,2w2>,而不是 ∇ L ( W ) = 2 w 1 + 2 w 2 \nabla{\mathcal{L}(W)} = 2w_1+2w_2 L(W)=2w1+2w2
A:因为 ∇ L ( W ) \nabla{\mathcal{L}(W)} L(W) 表示目标函数 L ( W ) \mathcal{L}(W) L(W) 的梯度,它是一个向量,它的每个分量表示目标函数在该维度上的偏导数。对于目标函数 L ( W ) = w 1 2 + w 2 2 \mathcal{L}(W) = w_1^2 + w_2^2 L(W)=w12+w22,我们可以分别对 w 1 w_1 w1 w 2 w_2 w2 求偏导数:

∂ L ∂ w 1 = 2 w 1 \frac{\partial \mathcal{L}}{\partial w_1} = 2w_1 w1L=2w1

∂ L ∂ w 2 = 2 w 2 \frac{\partial \mathcal{L}}{\partial w_2} = 2w_2 w2L=2w2

因此,目标函数的梯度为:

∇ L ( W ) = < ∂ L ∂ w 1 , ∂ L ∂ w 2 > = < 2 w 1 , 2 w 2 > \nabla{\mathcal{L}(W)} = <\frac{\partial \mathcal{L}}{\partial w_1}, \frac{\partial \mathcal{L}}{\partial{w_2}}> = <2w_1, 2w_2> L(W)=<w1L,w2L>=<2w1,2w2>

梯度是一个向量,它的每个分量表示目标函数在该维度上的偏导数。所以写成 ∇ L ( W ) = 2 w 1 + 2 w 2 \nabla{\mathcal{L}(W)} = 2w_1 + 2w_2 L(W)=2w1+2w2 是不正确的。


进行多次迭代:

W 0 = ( 1 , 3 ) (1) W^0 = (1, 3) \tag{1} W0=(1,3)(1)

W 1 = W 0 − α × ∇ L ( W 0 ) = ( 1 , 3 ) − 0.1 × ( 2 , 6 ) = ( 0.8 , 2.4 ) (2) \begin{aligned} W^1 & = W^0 - \alpha \times \nabla{\mathcal{L}(W^0)} \\ & = (1, 3) - 0.1 \times (2, 6) \\ & = (0.8, 2.4) \end{aligned} \tag{2} W1=W0α×L(W0)=(1,3)0.1×(2,6)=(0.8,2.4)(2)

W 2 = W 1 − α × ∇ L ( W 1 ) = ( 0.8 , 2.4 ) − 0.1 × ( 1.6 , 4.8 ) = ( 0.64 , 1.92 ) (3) \begin{aligned} W^2 & = W^1 - \alpha \times \nabla{\mathcal{L}(W^1)} \\ & = (0.8, 2.4) - 0.1 \times (1.6, 4.8) \\ & = (0.64, 1.92) \end{aligned} \tag{3} W2=W1α×L(W1)=(0.8,2.4)0.1×(1.6,4.8)=(0.64,1.92)(3)

W 3 = ( 0.512 , 1.536 ) (4) W^3 = (0.512, 1.536) \tag{4} W3=(0.512,1.536)(4)

W 4 = ( 0.4096 , 1.2288000000000001 ) (5) W^4 = (0.4096, 1.2288000000000001) \tag{5} W4=(0.4096,1.2288000000000001)(5)

. . . .\\ . \\ . ...

W 1 0 = ( 0.10737418240000003 , 0.32212254720000005 ) (6) W^10 = (0.10737418240000003, 0.32212254720000005) \tag{6} W10=(0.10737418240000003,0.32212254720000005)(6)

. . . .\\ . \\ . ...

W 5 0 = ( 1.1417981541647683 × 1 0 − 5 , 3.425394462494306 × 1 0 − 5 ) (7) W^50 = (1.1417981541647683 \times 10^{-5},3.425394462494306 \times 10^{-5}) \tag{7} W50=(1.1417981541647683×105,3.425394462494306×105)(7)

. . . .\\ . \\ . ...

W 1 00 = ( 1.6296287810675902 × 1 0 − 10 , 4.888886343202771 × 1 0 − 10 ) (8) W^100 = (1.6296287810675902 \times 10^{-10},4.888886343202771 \times 10^{-10}) \tag{8} W100=(1.6296287810675902×1010,4.888886343202771×1010)(8)

我们发现,已经基本靠近函数的最小值点。

在这里插入图片描述

5.2.4 梯度下降(Gradient Descent)公式

W i + 1 = W i − α ∂ L ( W ) ∂ w i W_{i + 1} = W_i - \alpha \frac{\partial{\mathcal{L}(W)}}{\partial{w_i}} Wi+1=WiαwiL(W)

5.2.4.1 学习率 α \alpha α

α \alpha α 在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过 α \alpha α 来控制每一步走的距离,以保证不要步子跨的太大(其实就是不要走太快,错过了最低点)。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。

所以 α \alpha α 的选择在梯度下降法中往往是很重要的, α \alpha α 不能太大也不能太小:

  • 学习率 α \alpha α 太小的话,可能导致迟迟走不到最低点(模型训练时间太长)
  • 学习率 α \alpha α 太大的话,会导致错过最低点(模型拟合效果不佳)

学习率是一个超参数,需要根据模型效果手工调整。

在这里插入图片描述

5.2.4.2 为什么要在梯度前面加一个负号(-)?

梯度前加一个负号,就意味着朝着梯度相反的方向前进。我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向。而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。

我们通过两个图更好理解梯度下降的过程。

在这里插入图片描述


Q:梯度下降法一定能找到最小值吗?
A:没办法保证可以找到全局的最小值,但可以找到局部的最小值(也就是极小值)。我们可以看下面这张图加以理解。

在这里插入图片描述


总之,梯度下降法并不能保证找到全局最小值,但它可以找到局部最小值(也就是极小值)。这是因为梯度下降法每一步都朝着函数下降最快的方向移动,所以它最终会收敛到一个局部最小值。如果目标函数是凸函数,那么梯度下降法可以保证找到全局最小值。但如果目标函数不是凸函数,那么梯度下降法可能会收敛到一个局部最小值,而不是全局最小值。

Q:什么是凸函数?
A:凸函数是一类特殊的函数,它满足一些性质,使得它在优化问题中具有重要的应用。一个实值函数 f ( x ) f(x) f(x) 是凸函数,当且仅当它的定义域是一个凸集,并且对于定义域中的任意两点 x 1 x_1 x1 x 2 x_2 x2 以及任意实数 θ ∈ [ 0 , 1 ] \theta \in [0, 1] θ[0,1],都有:

f ( θ x 1 + ( 1 − θ ) x 2 ) ≤ θ f ( x 1 ) + ( 1 − θ ) f ( x 2 ) f(\theta x_1 + (1-\theta) x_2) \leq \theta f(x_1) + (1-\theta) f(x_2) f(θx1+(1θ)x2)θf(x1)+(1θ)f(x2)

直观地说,这个性质表示凸函数的图像在任意两点之间的弦总是位于这两点之间的函数值之上。也就是说,凸函数的图像总是“向上凸”的。

凸函数具有一些重要的性质,例如它们的局部最小值也是全局最小值。这使得凸函数在优化问题中具有重要的应用。

Q:那对于有很多参数的机器学习或深度学习模型而言,凸函数还存在吗?
A:在机器学习和深度学习中,我们通常需要优化一个损失函数来训练模型。这个损失函数通常是关于模型参数的非凸函数。也就是说,在机器学习和深度学习中,损失函数通常不是凸函数

由于损失函数通常不是凸函数,所以我们不能保证梯度下降法能够找到全局最小值。但在实践中,梯度下降法仍然是一种有效的优化算法,它能够找到一个较好的局部最小值。

所以有了梯度下降这样一个优化算法,回归就有了“自动学习”的能力。

优化的动态图演示:

在这里插入图片描述

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

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

相关文章

这次彻底不需要账号了,无需魔法永久白嫖GPT

免费GPT 自GPT风靡以来&#xff0c;大家用的是不亦乐乎&#xff0c;你用他去解决过实际问题&#xff0c;你用他去写过代码&#xff0c;你用他去修改过bug&#xff0c;你用他去写过sql&#xff0c;你用他去画过图&#xff0c;你问过他你能想到的任何“刁钻”问题。 你&#xff…

如何在没有密码的情况下解锁华为手机

华为手机用户通常会使用密码保护他们的设备免受未经授权的访问。但是当用户忘记密码时就会出现问题。如果您无法回忆起密码&#xff0c;可以选择重置手机。但是有更多更好的方法可以帮助您解锁华为手机。在本文中&#xff0c;我们将向您展示如何免密码解锁华为手机。按照本文&a…

“五位一体”打造数字业务安全体系

顶象联合中国信通院发布的《业务安全白皮书—数字业务风险与安全》显示&#xff0c;随着数字化的发展&#xff0c;企业的关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中&#xff0c;涉及利益流和高附加值的业务面临多样的安全隐患&#xff1b;同时…

Linux下最强安卓模拟器,流畅又丝滑(附详细安装教程)此瓜保熟|Linux游戏党

我打算完全从头开始&#xff0c;写一个专门用于桌面办公的纯国产操作系统 &#xff0c;规避主流操作系统上影响用户体验的问题&#xff0c;系统力求简洁。有兴趣加QQ群&#xff1a;709652950 好东西让更多人发现&#xff01;我找了整整两年&#xff0c;什么Anbox&#xff0c;什…

【必知必懂论文】之多模态实体识别

引言 命名实体识别&#xff08;NER&#xff09;是自然语言处理(NLP)领域中的最基础、最核心的任务之一&#xff0c;该任务旨在识别出文本中的命名实体&#xff08;通常指特定类型事物的名称或符号&#xff0c;一般是一个名词或者短语&#xff09;&#xff0c;并将识别出的实体…

【这七款网工在线画拓扑工具,你会用几个呢?】

其实绘制拓扑图的工具有很多&#xff0c;今天主要推荐给大家7款在线的绘图软件&#xff0c;不仅好用&#xff0c;不占内存&#xff0c;而且功能强大。 看看有没有你种草的那一款哈&#xff0c;当然&#xff0c;如果有其他更好用的工具&#xff0c;也欢迎留言区告诉其他网工朋友…

apifm-wxapi

文章目录 apifm-wxapi介绍为什么要用 apifm-wxapi使用1. 项目导入 apifm-wxapi2. 平台注册3. 平台配置4. 用户注册5. 用户登录6. 使用其他API 【参考】 apifm-wxapi 介绍 “微信小程序接口工具包&#xff0c;无需服务器&#xff0c;无需开发后台&#xff0c;开箱即用&#xf…

(四)运行微信小程序:在主页加入表单组件实现提交功能

我们在上个小练习的基础上&#xff0c;继续在主页添加功能——使用表单组件form。 根据微信官方文档&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/component/form.html 当需要获取用户提交的信息时&#xff0c;可以使用表单组件form。当用户点击表单中fo…

从 0~1 创建 Vue3项目(Vue3 + JS)

前言 我目前还是在用 JavaScripr开发项目&#xff0c;后面会学习 TypeScript &#xff0c;也会专门写一篇《从 0~1 创建Vue3 TS 项目》。求关注&#x1f62d; 一、创建项目前的准备工作 1.1 安装Node 创建项目需要使用 npm 或 yarn 可以去看我的另一篇文章&#xff1a;《…

免费开源的Umi-OCR 文字识别工具

大家好&#xff0c;我是小寻&#xff0c;欢迎关注公众号:工具优选&#xff0c;免费领取优质项目源码和常用工具&#xff0c;还可以加入我的交流群! 如今&#xff0c;在日常生活和工作中&#xff0c;我们经常需要捕捉屏幕截图并识别其中的文本信息。比如别人给你发资料时直接发…

Git详细用法:Git概述 安装 常用命令 分支操作 团队协作 、GitHub、idea集成Git、idea集成GitHub、码云、GitLab

课程介绍 学习目标 第1章 Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性…

跟着LearnOpenGL学习3--四边形绘制

文章目录 一、前言二、元素缓冲对象三、完整代码四、绘制模式 一、前言 通过跟着LearnOpenGL学习2–三角形绘制一文&#xff0c;我们已经知道了怎么配置渲染管线&#xff0c;来绘制三角形&#xff1b; OpenGL主要处理三角形&#xff0c;当我们需要绘制别的图形时&#xff0c;…

切记:缺少进项利用这个方法!增值税高也不怕!

切记&#xff1a;缺少进项利用这个方法&#xff01;增值税高也不怕&#xff01; 业务是流程&#xff0c;财税是结果&#xff0c;税收问题千千万&#xff0c;《税算盘》来帮你找答案。 企业缺少进项&#xff0c;这个问题是所有企业和财务都无法回避的问题&#xff0c;让企业非…

实用篇 | huggingface的简单应用

本文主要介绍hugging Face(拥抱脸)的简单介绍以及常见用法&#xff0c;用来模型测试是个好的工具~ 如下图所示左边框是各项任务&#xff0c;包含多模态&#xff08;Multimodal&#xff09;&#xff0c;计算机视觉(Computer Vision)&#xff0c;自然语言处理(NLP)等&#xff0c;…

强人工智能时代,区块链还有戏吗?

最近很多人都在问我&#xff0c;ChatGPT 把 AI 又带火了&#xff0c;区块链和 Web3 被抢了风头&#xff0c;以后还有戏吗&#xff1f;还有比较了解我的朋友问&#xff0c;当年你放弃 AI 而选择区块链&#xff0c;有没有后悔&#xff1f; 这里有一个小背景。2017 年初我离开 IBM…

uni-app两个入口模块(客户端和用户端)

思路&#xff1a;使用vuex对小程序进行登录状态管理&#xff0c;采用集中式存储管理应用的登录状态 Vuex 是什么&#xff1f; | Vuex 效果&#xff1a; 新建store文件夹&#xff0c;在文件夹中新建一个index.js文件和一个modules文件夹&#xff0c;modules文件夹中新建一个st…

【历史上的今天】5 月 11 日:Dijkstra 算法开发者诞生;电子表格软件的开山鼻祖;机器狗 AIBO 问世

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 11 日&#xff0c;在 1995 年的今天&#xff0c;我国成为第六个研制成功磁悬浮列车的国家。磁悬浮列车利用“同性相斥&#xff0c;异性相吸”的原理&…

Linux基础学习---2、系统管理、帮助命令、文件目录类命令

1、系统管理 1.1 Linux中的进程和服务 计算机中&#xff0c;一个正在执行的程序或命令。被叫做“进程”&#xff08;Process&#xff09;。 启动之后一直存在、常驻内存的进程&#xff0c;一般称做“服务”&#xff08;Service&#xff09;。1.2 systemctl&#xff08;CentOS…

以playwright脚本为例,详解Python with as处理异常的原理

大家在做playwright自动化测试时&#xff0c;一定会遇到下面的写法 with sync_playwright() as p:自动化代码 很多同学可能只是按照这种写法来编写项目的自动化测试代码&#xff0c;对于具体细节可能并不了解&#xff0c;今天我来结合playwright讲解一下 Python中的 with ...…

大咖齐聚CCIG论坛——文档图像智能分析的产业前沿

目录 1 文档图像智能分析技术2 大咖齐聚CCIG20233 议题介绍3.1 从模式识别到类脑研究3.2 视觉-语言预训练模型演进及应用3.3 篡改文本图像的生成和检测3.4 智能文档处理在工业界的应用与挑战 4 观看入口&议程 1 文档图像智能分析技术 文档图像智能分析是指使用计算机视觉和…