人工智能

线性代数基础

线性代数是深度学习的重要基础,本章节将介绍深度学习中常用的线性代数概念和操作。

1. 标量、向量、矩阵与张量

1.1 标量(Scalar)

标量是单个数值,用$ x \in \mathbb{R} $表示。在深度学习中常用于表示权重、偏置等参数。

import numpy as np

# 创建标量
x = np.array(5)

# 标量运算
print("标量加法:", x + 3)  # 5+3=8
print("标量减法:", x - 2)  # 5-2=3
print("标量数乘:", 2 * x)  # 2×5=10
print("标量除法:", x / 2)  # 5/2=2.5

1.2 向量(Vector)

向量是有序的一维数组,由多个标量组成,用列向量表示:

x=[x1x2⋮xn]∈Rn \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \in \mathbb{R}^n x= x1x2xn Rn

其中,x1,x2,...,xix_1, x_2, ..., x_ix1,x2,...,xi 是向量 x\mathbf{x}x 的元素。xix_ixi表示向量的第iii个元素。

在代码中,可以使用下标索引来访问向量的元素:

# 创建列向量(推荐显式声明二维结构)
x_col = np.array([[1], [2], [3]])  # 3×1列向量
x_row = np.array([1, 2, 3])        # 1×3行向量(严格来说是1维数组)

# 向量运算
print("向量加法:\n", x_col + np.array([[4], [5], [6]]))  # 对应元素相加
print("向量数乘:\n", 2 * x_col)                          # 标量乘法
print("向量点积:", np.dot(x_row, np.array([4, 5, 6])))    # 1×3 ⋅ 3×1 = 标量

1.3 矩阵(Matrix)

矩阵是二维数组,由多个向量组成,用大写字母表示:
A=[a11a12a21a22]∈Rm×n A = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix} \in \mathbb{R}^{m \times n} A=[a11a21a12a22]Rm×n

# 创建矩阵
A = np.array([[1, 2], [3, 4]])  # 2×2矩阵
B = np.array([[5, 6], [7, 8]])

# 矩阵运算
print("矩阵加法:\n", A + B)          # 对应元素相加
print("矩阵乘法:\n", A @ B)          # 标准矩阵乘法
print("矩阵转置:\n", A.T)            # 行列互换

1.4 张量(Tensor)

张量是多维数组(三维及以上),常用于表示批量数据:
X∈Rb×h×w×c \mathcal{X} \in \mathbb{R}^{b \times h \times w \times c} XRb×h×w×c
(b:批次大小,h:高度,w:宽度,c:通道数)

# 创建三维张量(2个样本,每个样本2×2矩阵)
X = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 张量运算
print("张量加法:\n", X + 1)                     # 广播机制
print("张量转置:\n", X.transpose((0, 2, 1)))     # 交换最后两个维度

2. 矩阵运算

2.1 基本运算

  • 加减法:要求相同维度
    C=A+B其中cij=aij+bij C = A + B \quad \text{其中} \quad c_{ij} = a_{ij} + b_{ij} C=A+B其中cij=aij+bij

  • 数乘
    B=kA其中bij=k⋅aij B = kA \quad \text{其中} \quad b_{ij} = k \cdot a_{ij} B=kA其中bij=kaij

  • 矩阵乘法A∈Rm×n,B∈Rn×pA \in \mathbb{R}^{m \times n}, B \in \mathbb{R}^{n \times p}ARm×n,BRn×p
    C=AB其中cij=∑k=1naikbkj C = AB \quad \text{其中} \quad c_{ij} = \sum_{k=1}^n a_{ik}b_{kj} C=AB其中cij=k=1naikbkj


2.2 特殊运算

哈达玛积(Hadamard Product)

C=A⊙B其中cij=aij⋅bij C = A \odot B \quad \text{其中} \quad c_{ij} = a_{ij} \cdot b_{ij} C=AB其中cij=aijbij

矩阵范数

对于矩阵 A∈Rm×nA \in \mathbb{R}^{m \times n}ARm×n

  • Frobenius范数:∥A∥F=∑i,jaij2\|A\|_F = \sqrt{\sum_{i,j} a_{ij}^2}AF=i,jaij2 ​,它是矩阵所有元素的平方和的平方根。
  • L1范数:∥A∥1=max⁡j∑i∣aij∣\|A\|_1 = \max_j \sum_i |a_{ij}|A1=maxjiaij,它是矩阵每列元素的绝对值之和的最大值。
  • 谱范数(L2):∥A∥2=σmax(A)\|A\|_2 = \sigma_{\text{max}}(A)A2=σmax(A),它是矩阵的最大奇异值。

范数的作用:

  • 衡量向量或矩阵的大小:范数提供了一种量化向量或矩阵 “长度” 或 “规模” 的方式,有助于比较不同向量或矩阵的大小。
  • 分析算法的稳定性和收敛性:在数值分析中,范数常用于分析迭代算法的收敛性和稳定性。例如,在求解线性方程组的迭代法中,-通过分析迭代矩阵的范数可以判断算法是否收敛。
  • 机器学习中的应用:在机器学习中,范数常用于正则化项,以防止模型过拟合。例如,L1正则化可以使模型的参数变得稀疏,L2正则化可以减小参数的大小,提高模型的泛化能力。
# 哈达玛积
print("哈达玛积:\n", A * B)

# 矩阵范数
print("Frobenius范数:", np.linalg.norm(A, 'fro'))  # √(1²+2²+3²+4²)=√30≈5.477
print("L1范数:", np.linalg.norm(A, 1))            # 最大列和:max(1+3, 2+4)=6
print("谱范数:", np.linalg.norm(A, 2))             # 最大奇异值≈5.464

3. 线性方程组

形如Ax=bA\mathbf{x} = \mathbf{b}Ax=b,其中A∈Rn×nA \in \mathbb{R}^{n \times n}ARn×n为系数矩阵。

解法:使用NumPy的np.linalg.solve()

A = np.array([[2, 1], 
              [1, 3]])
b = np.array([4, 5])
x = np.linalg.solve(A, b)
print("解向量:", x)  # [1. 2.]

4. 行列式与逆矩阵

4.1 行列式(Determinant)

行列式表征矩阵的可逆性:

  • det(A)≠0⇔A\text{det}(A) \neq 0 \Leftrightarrow Adet(A)=0A可逆
  • 几何意义:线性变换的缩放因子
det_A = np.linalg.det(A)
print("行列式:", round(det_A, 2))  # 2×3 - 1×1 = 5

4.2 逆矩阵(Inverse Matrix)

AAA可逆,则存在A−1A^{-1}A1满足:
A−1A=AA−1=I A^{-1}A = AA^{-1} = I A1A=AA1=I

inv_A = np.linalg.inv(A)
print("逆矩阵:\n", inv_A)
# 验证乘积接近单位矩阵
print("验证:\n", np.round(A @ inv_A, 10))  # 四舍五入消除浮点误差

5. 特征值与特征向量

对矩阵A∈Rn×nA \in \mathbb{R}^{n \times n}ARn×n,若存在标量λ\lambdaλ和非零向量v\mathbf{v}v满足:
Av=λv A\mathbf{v} = \lambda\mathbf{v} Av=λv
则称λ\lambdaλ为特征值,v\mathbf{v}v为对应的特征向量。

eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)   # [1.382, 3.618]
print("特征向量:\n", eigenvectors)

# 验证特征方程(结果应近似相等)
for i in range(len(eigenvalues)):
    lhs = A @ eigenvectors[:, i]
    rhs = eigenvalues[i] * eigenvectors[:, i]
    print(f"验证 {i+1}:", np.allclose(lhs, rhs))  # 使用容差比较

应用实例:主成分分析(PCA)

数学原理

  1. 标准化数据:Xscaled=X−μσX_{\text{scaled}} = \frac{X - \mu}{\sigma}Xscaled=σXμ
  2. 计算协方差矩阵:C=1n−1XscaledTXscaledC = \frac{1}{n-1}X_{\text{scaled}}^T X_{\text{scaled}}C=n11XscaledTXscaled
  3. 特征分解:C=VΛVTC = V\Lambda V^TC=VΛVT
  4. 选择前kkk大特征值对应的特征向量组成投影矩阵WWW
  5. 降维:Xpca=XscaledWX_{\text{pca}} = X_{\text{scaled}}WXpca=XscaledW
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载数据
iris = load_iris()
X = iris.data

# 标准化
X_scaled = StandardScaler().fit_transform(X)

# 协方差矩阵
cov_matrix = np.cov(X_scaled.T)

# 特征分解
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

# 按特征值降序排序
sorted_idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sorted_idx]
eigenvectors = eigenvectors[:, sorted_idx]

# 选择前两个主成分
W = eigenvectors[:, :2]

# 投影降维
X_pca = X_scaled @ W

print("降维数据形状:", X_pca.shape)  # (150, 2)
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐