深度学习中的常用线性代数知识汇总——第三篇:协方差矩阵、主成分分析、正交性与正定性

文章目录

      • [0. 前言](#0. 前言)
      • [1. 协方差矩阵](#1. 协方差矩阵)
        • [1.1 协方差(没有矩阵)的定义及计算方法](#1.1 协方差(没有矩阵)的定义及计算方法)
        • [1.2 协方差矩阵的定义及计算方法](#1.2 协方差矩阵的定义及计算方法)
        • [1.3 PyTorch编码计算](#1.3 PyTorch编码计算)
        • [1.4 协方差矩阵的意义](#1.4 协方差矩阵的意义)
        • [1.5 协方差矩阵在深度学习中的应用](#1.5 协方差矩阵在深度学习中的应用)
      • [2. 主成分分析(PCA)](#2. 主成分分析(PCA))
        • [2.1 PCA 的基本原理](#2.1 PCA 的基本原理)
        • [2.2 步骤概述](#2.2 步骤概述)
        • [2.3 具体步骤详解](#2.3 具体步骤详解)
        • [2.4 PCA在深度学习中的应用](#2.4 PCA在深度学习中的应用)
      • [3. 正交性和正定性](#3. 正交性和正定性)
        • [3.1 正交性定义](#3.1 正交性定义)
        • [3.2 正交矩阵](#3.2 正交矩阵)
        • [3.3 正定性的定义](#3.3 正定性的定义)
        • [3.4 正交性和正定性在深度学习中的应用](#3.4 正交性和正定性在深度学习中的应用)

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本系列文章用于介绍深度学习中必须要掌握的线性代数基础知识,并结合了PyTorch代码实例。这是本系列文章的第三篇,相关文章链接如下:

1. 协方差矩阵

1.1 协方差(没有矩阵)的定义及计算方法

协方差是一个统计量,用于衡量两个随机变量 X X X和 Y Y Y之间的线性相关程度。如果两个变量的变化趋势相同(即一起上升或下降),那么它们的协方差为正;如果变化趋势相反,则协方差为负;如果两者之间没有线性关系,则协方差接近于零。

协方差的公式如下:
Cov ( X , Y ) = 1 N − 1 ∑ i = 1 N ( x i − x ˉ ) ( y i − y ˉ ) \text{Cov}(X, Y) = \frac{1}{N-1} \sum_{i=1}^{N} (x_i - \bar{x})(y_i - \bar{y}) Cov(X,Y)=N−11i=1∑N(xi−xˉ)(yi−yˉ)

其中:

  • x i x_i xi 和 y i y_i yi 是变量 X X X 和 Y Y Y 的第 i i i 个观测值(可以理解为"元素")。
  • x ˉ \bar{x} xˉ和 y ˉ \bar{y} yˉ 分别是变量 X X X 和 Y Y Y 的均值。
  • N N N 是观测值的数量。

可以按照以下步骤计算协方差:

  1. 计算均值 :首先计算变量 X X X和 Y Y Y 的均值。
  2. 计算偏差:对于每个观测值,计算它与均值的偏差。
  3. 乘积求和 :将 X X X的偏差与 Y Y Y的偏差相乘,并对所有观测值求和。
  4. 取平均 :将上述结果除以 N − 1 N-1 N−1(这是无偏估计的公式)。

示例计算:

假设我们有两个变量 X X X 和 Y Y Y,并且我们有四个观测值。以下是具体数值:

观测 (X) (Y)
1 1 2
2 2 3
3 3 4
4 4 5

首先,计算均值:

x ˉ = 1 + 2 + 3 + 4 4 = 10 4 = 2.5 \bar{x} = \frac{1 + 2 + 3 + 4}{4} = \frac{10}{4} = 2.5 xˉ=41+2+3+4=410=2.5
y ˉ = 2 + 3 + 4 + 5 4 = 14 4 = 3.5 \bar{y} = \frac{2 + 3 + 4 + 5}{4} = \frac{14}{4} = 3.5 yˉ=42+3+4+5=414=3.5

接着,计算偏差并求和:

( x 1 − x ˉ ) ( y 1 − y ˉ ) = ( 1 − 2.5 ) ( 2 − 3.5 ) = ( − 1.5 ) ( − 1.5 ) = 2.25 ( x 2 − x ˉ ) ( y 2 − y ˉ ) = ( 2 − 2.5 ) ( 3 − 3.5 ) = ( − 0.5 ) ( − 0.5 ) = 0.25 ( x 3 − x ˉ ) ( y 3 − y ˉ ) = ( 3 − 2.5 ) ( 4 − 3.5 ) = ( 0.5 ) ( 0.5 ) = 0.25 ( x 4 − x ˉ ) ( y 4 − y ˉ ) = ( 4 − 2.5 ) ( 5 − 3.5 ) = ( 1.5 ) ( 1.5 ) = 2.25 \begin{align*} (x_1 - \bar{x})(y_1 - \bar{y}) &= (1 - 2.5)(2 - 3.5) = (-1.5)(-1.5) = 2.25 \\ (x_2 - \bar{x})(y_2 - \bar{y}) &= (2 - 2.5)(3 - 3.5) = (-0.5)(-0.5) = 0.25 \\ (x_3 - \bar{x})(y_3 - \bar{y}) &= (3 - 2.5)(4 - 3.5) = (0.5)(0.5) = 0.25 \\ (x_4 - \bar{x})(y_4 - \bar{y}) &= (4 - 2.5)(5 - 3.5) = (1.5)(1.5) = 2.25 \\ \end{align*} (x1−xˉ)(y1−yˉ)(x2−xˉ)(y2−yˉ)(x3−xˉ)(y3−yˉ)(x4−xˉ)(y4−yˉ)=(1−2.5)(2−3.5)=(−1.5)(−1.5)=2.25=(2−2.5)(3−3.5)=(−0.5)(−0.5)=0.25=(3−2.5)(4−3.5)=(0.5)(0.5)=0.25=(4−2.5)(5−3.5)=(1.5)(1.5)=2.25

将这些乘积求和:

∑ i = 1 4 ( x i − x ˉ ) ( y i − y ˉ ) = 2.25 + 0.25 + 0.25 + 2.25 = 5 \sum_{i=1}^{4} (x_i - \bar{x})(y_i - \bar{y}) = 2.25 + 0.25 + 0.25 + 2.25 = 5 i=1∑4(xi−xˉ)(yi−yˉ)=2.25+0.25+0.25+2.25=5

最后,计算协方差:

Cov ( X , Y ) = 5 4 − 1 = 5 3 ≈ 1.67 \text{Cov}(X, Y) = \frac{5}{4-1} = \frac{5}{3} \approx 1.67 Cov(X,Y)=4−15=35≈1.67

所以,变量 X X X 和 Y Y Y之间的协方差约为 1.67,这表明它们之间存在正相关性。

1.2 协方差矩阵的定义及计算方法

协方差矩阵是一个描述多维随机变量之间线性相关程度的统计量。对于一个具有 n n n个特征(或变量)的数据集,协方差矩阵是一个 n × n n×n n×n 的对称矩阵,其中对角线元素是每个变量的方差,而非对角线元素表示不同变量之间的协方差。

通过上面的计算过程,我们了解了两个变量 X X X 和 Y Y Y的协方差计算方法。如果有多个变量 X 1 X_1 X1, X 2 X_2 X2...... X n X_n Xn,协方差矩阵就可以表示为:

X 11 X 12 ⋯ X 1 n X 21 X 22 ⋯ X 2 n ⋮ ⋮ ⋱ ⋮ X n 1 X n 2 ⋯ X n n \] \\begin{bmatrix} X_{11} \& X_{12} \& \\cdots \&X_{1n} \\\\ X_{21} \& X_{22} \& \\cdots \&X_{2n} \\\\ \\vdots \& \\vdots \& \\ddots \& \\vdots \\\\ X_{n1} \&X_{n2} \& \\cdots \& X_{nn} \\end{bmatrix} X11X21⋮Xn1X12X22⋮Xn2⋯⋯⋱⋯X1nX2n⋮Xnn 这里 X i j = Cov ( X i , X j ) X_{ij}= \\text{Cov}(X_i, X_j) Xij=Cov(Xi,Xj),显然 X i j = X j i X_{ij}=X_{ji} Xij=Xji,所以协方差矩阵是对称矩阵。 ##### 1.3 PyTorch编码计算 PyTorch 目前没有内置的协方差函数,但是可以通过一些基本的操作来计算协方差矩阵。下面是一个使用 PyTorch 计算协方差矩阵的例子: ```python import torch def calculate_covariance_matrix(X): """ 计算协方差矩阵。 参数: X : torch.Tensor 形状为 (N, d),其中 N 是观测值数量,d 是特征数量。 返回: cov_matrix : torch.Tensor 形状为 (d, d) 的协方差矩阵。 """ # 获取数据的形状 N, d = X.shape # 计算均值 mean_X = torch.mean(X, dim=0) # 中心化数据 centered_X = X - mean_X # 计算协方差矩阵 cov_matrix = torch.matmul(centered_X.T, centered_X) / (N-1) return cov_matrix # 创建一个示例数据集 data = torch.tensor([ [1, 2], [2, 3], [3, 4], [4, 5] ], dtype=torch.float32) # 计算协方差矩阵 cov_matrix = calculate_covariance_matrix(data) print("协方差矩阵:") print(cov_matrix) ``` 输出为: ```python 协方差矩阵: tensor([[1.6667, 1.6667], [1.6667, 1.6667]]) ``` ##### 1.4 协方差矩阵的意义 协方差矩阵可以提供关于数据集中多个变量之间关系的深入洞察: * **对角线元素**:表示每个变量自身的方差。方差描述了变量值相对于其均值的离散程度。 * **非对角线元素**:表示变量之间的协方差。协方差的值可以是正也可以是负,正协方差意味着两个变量的趋势相同(即同时增大或减小),而负协方差意味着一个变量增大时另一个变量减小。 ##### 1.5 协方差矩阵在深度学习中的应用 协方差矩阵在深度学习中的应用非常广泛,涉及数据预处理、模型训练、正则化等多个方面。下面详细介绍协方差矩阵在深度学习中的几种常见应用: **1. 数据预处理** 在训练深度学习模型之前,数据预处理是一个至关重要的步骤。协方差矩阵可以帮助我们理解数据中的特征之间的相关性,并据此进行有效的预处理。 * **特征缩放**:通过计算协方差矩阵,我们可以发现哪些特征具有较大的方差。特征缩放(如标准化或归一化)可以确保每个特征在相同的尺度上,从而避免某些特征因为尺度较大而主导模型的学习过程。 * **白化(Whitening)**:白化是一种预处理技术,通过调整数据使其协方差矩阵成为单位矩阵。这样做可以去除特征之间的相关性,使得数据在各个维度上独立同分布。这有助于加速训练过程,并且可以使模型更容易学习。 **2. 降维** 在处理高维数据时,协方差矩阵可用于降维,以减少计算成本并提高模型的泛化能力。 * **主成分分析(PCA)**:PCA 利用协方差矩阵来找到数据的主要成分,这些成分是数据方差最大的方向。通过将数据投影到这些主成分上,可以显著降低数据的维度,同时保留大部分信息。 * **特征选择** :通过分析协方差矩阵,可以识别出哪些特征之间**高度相关**,并选择其中最具代表性的特征进行保留,从而减少模型的输入维度。 **3. 模型初始化** 在深度学习中,合理的权重初始化可以加速模型的收敛,并提高最终模型的性能。 * **正交初始化**:通过计算数据的协方差矩阵,可以初始化权重矩阵,使其保持正交性(下面会说明正交性)。这种方法可以确保信息在网络层之间均匀传递,从而避免梯度消失或爆炸问题。 * **Xavier/Glorot 初始化**:这种初始化方法考虑了输入和输出的维度,以及激活函数的特性,通过计算输入和输出的方差来确定初始权重的范围,从而改善梯度流。 **4. 正则化** 在深度学习中,正则化技术用于防止过拟合,提高模型的泛化能力。 * **正则化项**:在损失函数中添加基于协方差矩阵的正则化项可以惩罚权重矩阵中的冗余信息,从而提高模型的稳定性。 * **Dropout**:虽然 Dropout 不直接使用协方差矩阵,但它也是一种正则化技术,通过随机丢弃部分神经元的输出,可以减少特征间的依赖性,从而间接影响协方差矩阵的结构。 #### 2. 主成分分析(PCA) 主成分分析(Principal Component Analysis, PCA)是一种常用的线性代数技术,**用于数据降维和特征提取**。PCA 旨在通过线性变换将原始数据转换到一个新的坐标系统中,在这个新系统中,数据沿各个坐标轴的方差被最大化。这样可以识别数据中的主要模式,并将数据简化为较少的维度,同时保留尽可能多的信息。 ##### 2.1 PCA 的基本原理 PCA 的目标是在高维空间中找到一个低维子空间,使得数据在这个子空间上的投影能够保留尽可能多的原始数据的方差。这个子空间由数据协方差矩阵的特征向量来定义,而特征向量的选择是基于相应的特征值大小决定的。 ##### 2.2 步骤概述 1. **数据预处理**:将数据进行中心化,即从每个特征中减去其均值,使数据的均值为零。 2. **计算协方差矩阵**:基于中心化后的数据,计算协方差矩阵。 3. **特征分解**:对协方差矩阵进行特征分解,得到特征值和特征向量。 4. **选择主成分** :选取特征值最大的前 k k k 个特征向量作为新的基,这些特征向量构成了数据的主要方向。 5. **数据投影**:将原始数据投影到选定的主成分上,得到降维后的数据。 ##### 2.3 具体步骤详解 **1. 数据中心化** 设原始数据集为 X \\mathbf{X} X( N × d N \\times d N×d矩阵),其中 N N N 是样本数量, d d d是特征数量。首先,计算每个特征的均值,并从中减去这些均值,以中心化数据: X centered = X − 1 N μ ⊤ \\mathbf{X}_{\\text{centered}} = \\mathbf{X} - \\mathbf{1}_N \\mathbf{\\mu}\^\\top Xcentered=X−1Nμ⊤ 其中 μ \\mathbf{\\mu} μ 是一个包含每个特征均值的 d d d维向量, 1 N \\mathbf{1}_N 1N 是一个 N N N维向量,其所有元素均为 1,这里乘以 1 N \\mathbf{1}_N 1N是因为要构造 N × d N \\times d N×d的矩阵,保证 X \\mathbf{X} X中的每个元素都能去掉该样本中的特征的均值。 **2. 计算协方差矩阵** 对于中心化后的数据,计算协方差矩阵: Σ = 1 N − 1 X centered ⊤ X centered \\mathbf{\\Sigma} = \\frac{1}{N-1} \\mathbf{X}_{\\text{centered}}\^\\top \\mathbf{X}_{\\text{centered}} Σ=N−11Xcentered⊤Xcentered 协方差矩阵是一个 d × d d \\times d d×d的对称矩阵,其中对角线元素是每个特征的方差,非对角线元素是特征之间的协方差。 **3. 特征分解** 对协方差矩阵进行特征分解,找到其特征值 λ i \\lambda_i λi和相应的特征向量 v i \\mathbf{v}_i vi: Σ v i = λ i v i \\mathbf{\\Sigma} \\mathbf{v}_i = \\lambda_i \\mathbf{v}_i Σvi=λivi 特征值表示了数据沿该特征向量方向上的方差大小。(如果忘记了特征值和特征向量,可以看下本第二篇文章) **4. 选择主成分** 根据特征值的大小,选择前 k k k 个最大的特征值对应的特征向量。这些特征向量构成了新的坐标系,即主成分。 **5. 数据投影** 将原始数据投影到选定的主成分上: Y = X centered V k \\mathbf{Y} = \\mathbf{X}_{\\text{centered}} \\mathbf{V}_k Y=XcenteredVk 其中 V k \\mathbf{V}_k Vk是由前 k k k个特征向量组成的矩阵, Y \\mathbf{Y} Y是降维后的数据。 ##### 2.4 PCA在深度学习中的应用 其实上面已经透露过了PCA在深度学习中的作用: * **降维**:通过减少数据的维度,PCA 可以简化数据集,提高后续处理的速度和效率。 * **去除冗余**:PCA 去除了数据中的冗余信息,保留了数据的主要变化方向。 * **可视化**:将高维数据降维至二维或三维,便于数据可视化。 #### 3. 正交性和正定性 在线性代数中,"正交性"和"正定性"是两个重要的概念,它们在理论和应用中都有着广泛的意义。 ##### 3.1 正交性定义 在向量空间中有两个向量 u \\mathbf{u} u 和 v \\mathbf{v} v ,如果它们的内积(点积)为零: u ⋅ v = u ⊤ v = 0 \\mathbf{u} \\cdot \\mathbf{v} = \\mathbf{u}\^\\top \\mathbf{v} = 0 u⋅v=u⊤v=0 称为这两个向量为正交(Orthogonal)。如果一个向量是单位向量(即长度为 1),并且与其他向量正交,则称为标准正交向量。 **实例说明:** 例如,向量 u = \[ 1 , 0 \] ⊤ \\mathbf{u} = \[1, 0\]\^\\top u=\[1,0\]⊤和 v = \[ 0 , 1 \] ⊤ \\mathbf{v} = \[0, 1\]\^\\top v=\[0,1\]⊤ 是正交的,因为它们的点积为零: u ⊤ v = 1 ⋅ 0 + 0 ⋅ 1 = 0 \\mathbf{u}\^\\top \\mathbf{v} = 1 \\cdot 0 + 0 \\cdot 1 = 0 u⊤v=1⋅0+0⋅1=0 ##### 3.2 正交矩阵 一个 n × n n \\times n n×n矩阵 Q \\mathbf{Q} Q 称为正交矩阵(Orthogonal Matrix),如果它的列向量(或行向量)彼此正交且为单位向量。这意味着: Q ⊤ Q = I \\mathbf{Q}\^\\top \\mathbf{Q} = \\mathbf{I} Q⊤Q=I 其中 I \\mathbf{I} I是单位矩阵。正交矩阵的一个重要性质是它的转置等于它的逆矩阵: Q − 1 = Q ⊤ \\mathbf{Q}\^{-1} = \\mathbf{Q}\^\\top Q−1=Q⊤ ##### 3.3 正定性的定义 一个 n × n n \\times n n×n 的实矩阵 A \\mathbf{A} A,如果对于任何非零向量 x ∈ R n \\mathbf{x} \\in \\mathbb{R}\^n x∈Rn,都有: x ⊤ A x \> 0 \\mathbf{x}\^\\top \\mathbf{A} \\mathbf{x} \> 0 x⊤Ax\>0 称为正定矩阵(Positive Definite Matrix),正定矩阵具有以下性质: 1. **特征值正性**:正定矩阵的所有特征值都是正数。 2. **对称性**:正定矩阵一定是对称矩阵。 3. **可逆性**:正定矩阵总是可逆的。 **实例说明:** 例如,矩阵 A = \[ 2 1 1 2 \] \\mathbf{A} = \\begin{bmatrix} 2 \& 1 \\\\ 1 \& 2 \\end{bmatrix} A=\[2112\]是正定的,因为对于任何非零向量 x = \[ x 1 x 2 \] \\mathbf{x} = \\begin{bmatrix} x_1 \\\\ x_2 \\end{bmatrix} x=\[x1x2\],有: x ⊤ A x = \[ x 1 x 2 \] \[ 2 1 1 2 \] \[ x 1 x 2 \] = 2 x 1 2 + 2 x 2 2 + 2 x 1 x 2 \\mathbf{x}\^\\top \\mathbf{A} \\mathbf{x} = \\begin{bmatrix} x_1 \& x_2 \\end{bmatrix} \\begin{bmatrix} 2 \& 1 \\\\ 1 \& 2 \\end{bmatrix} \\begin{bmatrix} x_1 \\\\ x_2 \\end{bmatrix} = 2x_1\^2 + 2x_2\^2 + 2x_1x_2 x⊤Ax=\[x1x2\]\[2112\]\[x1x2\]=2x12+2x22+2x1x2 由于 2 x 1 2 + 2 x 2 2 + 2 x 1 x 2 2x_1\^2 + 2x_2\^2 + 2x_1x_2 2x12+2x22+2x1x2 总是大于零(除非 x = 0 \\mathbf{x} = \\mathbf{0} x=0),因此 A \\mathbf{A} A 是正定的。 ##### 3.4 正交性和正定性在深度学习中的应用 在深度学习中,正交性和正定性有多种应用: 1. **正交初始化**:在神经网络中,权重矩阵的正交初始化可以避免梯度消失或爆炸问题。通过使用正交矩阵作为初始权重,可以确保信息在网络层之间均匀传递。 2. **正则化**:正则化技术可以利用正定矩阵来惩罚权重矩阵中的冗余信息,从而提高模型的稳定性。 3. **优化算法**:在优化算法中,正定矩阵可以用于改进梯度下降等优化方法的表现,例如自然梯度下降(Natural Gradient Descent)使用信息几何学的概念来调整梯度方向。 4. **数据预处理**:正交变换可以用于数据预处理,例如通过白化(Whitening)等技术来去除特征之间的相关性,使得数据在各个维度上独立同分布。 5. **特征选择与降维**:在主成分分析(PCA)中,特征向量的选择基于协方差矩阵的特征值,而协方差矩阵是对称的,通常是正定的或半正定的。

相关推荐
星云ai3 小时前
矩阵运营:抢占市场与流量的利器
矩阵
蹦蹦跳跳真可爱5893 小时前
Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)
人工智能·pytorch·python·深度学习·分类
lixy5798 小时前
深度学习3.7 softmax回归的简洁实现
人工智能·深度学习·回归
多巴胺与内啡肽.9 小时前
深度学习--自然语言处理统计语言与神经语言模型
深度学习·语言模型·自然语言处理
深度之眼10 小时前
2025时间序列都有哪些创新点可做——总结篇
人工智能·深度学习·机器学习·时间序列
不吃香菜?12 小时前
PyTorch 实现食物图像分类实战:从数据处理到模型训练
人工智能·深度学习
Light6013 小时前
智启未来:深度解析Python Transformers库及其应用场景
开发语言·python·深度学习·自然语言处理·预训练模型·transformers库 |·|应用场景
数据智能老司机13 小时前
构建具备自主性的人工智能系统——在生成式人工智能系统中构建信任
深度学习·llm·aigc
谦行14 小时前
工欲善其事,必先利其器—— PyTorch 深度学习基础操作
pytorch·深度学习·ai编程
xwz小王子14 小时前
Nature Communications 面向形状可编程磁性软材料的数据驱动设计方法—基于随机设计探索与神经网络的协同优化框架
深度学习