Hoshiᅟᅠ     

Hoshiᅟᅠ     

文章目录

线性代数入门:机器学习零基础小白指南


前言

对于零基础的学习者而言,数学听起来也许陌生甚至有点“吓人”。然而,不必惧怕:本篇文章将带你从最直观的概念出发,帮助你理解和掌握线性代数这门支撑机器学习大厦的重要支柱。

为什么选择线性代数作为第一站?

  • 数据表示:机器学习中的数据常以矩阵和向量的形式表示,线性代数是理解这种数据结构的语言。
  • 模型构建:许多经典模型(如线性回归)和高级算法(如神经网络中的参数更新)都依赖矩阵运算和向量运算的思想。
  • 特征变换:降维、特征提取、特征工程等处理步骤都离不开对线性代数的理解。

一、向量:数据的基本单元

1.1 什么是向量?

向量(Vector)是线性代数的核心概念之一。简单来说,向量是一组有序数值的集合,可以用来表示一个物理量或者一个对象的特征。

1.1.1 举个例子:

假设我们想描述一个人的体型,可以用以下信息:

  • 身高:170 厘米
  • 体重:65 公斤
  • 年龄:30 岁

我们可以把这些特征组合成一个向量:
v = [ 170 65 30 ] \mathbf{v} = \begin{bmatrix} 170 \\ 65 \\ 30 \end{bmatrix} v= 1706530


1.2 向量的表示与维度

1.2.1 向量的维度

向量的维度(Dimension)是其元素的个数。例如:

  • v = [ 170 65 30 ] \mathbf{v} = \begin{bmatrix} 170 \\ 65 \\ 30 \end{bmatrix} v= 1706530 是一个三维向量。
  • w = [ 1 2 ] \mathbf{w} = \begin{bmatrix} 1 \\ 2 \end{bmatrix} w=[12] 是一个二维向量。
1.2.2 向量的表示方法
  1. 数学表示:用列向量或行向量表示,例如:

    • 列向量:
      v = [ v 1 v 2 v 3 ] \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} v= v1v2v3
    • 行向量:
      v = [ v 1 v 2 v 3 ] \mathbf{v} = \begin{bmatrix} v_1 & v_2 & v_3 \end{bmatrix} v=[v1v2v3]
  2. 编程实现(以 Python 为例):

    import numpy as np
    
    # 创建列向量
    v = np.array([[170], [65], [30]])
    print(v)
    
    # 创建行向量
    w = np.array([1, 2, 3])
    print(w)
    

1.3 向量的基本运算

向量运算是线性代数的基础,在机器学习中用于描述数据间的关系。

1.3.1 向量加法

两个维度相同的向量可以逐元素相加。例如:
a = [ 1 2 ] , b = [ 3 4 ] \mathbf{a} = \begin{bmatrix} 1 \\ 2 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 3 \\ 4 \end{bmatrix} a=[12],b=[34]
它们的加法结果为:
a + b = [ 1 + 3 2 + 4 ] = [ 4 6 ] \mathbf{a} + \mathbf{b} = \begin{bmatrix} 1+3 \\ 2+4 \end{bmatrix} = \begin{bmatrix} 4 \\ 6 \end{bmatrix} a+b=[1+32+4]=[46]

Python代码:

import numpy as np

a = np.array([1, 2])
b = np.array([3, 4])
print(a + b)  # 输出:[4 6]

1.3.2 向量的数乘

标量 (c) 与向量 v \mathbf{v} v 的乘积是将 (c) 逐一乘以向量中的每个元素:
c v = [ c ⋅ v 1 c ⋅ v 2 ] c \mathbf{v} = \begin{bmatrix} c \cdot v_1 \\ c \cdot v_2 \end{bmatrix} cv=[cv1cv2]

例如:
2 ⋅ [ 3 4 ] = [ 6 8 ] 2 \cdot \begin{bmatrix} 3 \\ 4 \end{bmatrix} = \begin{bmatrix} 6 \\ 8 \end{bmatrix} 2[34]=[68]

Python代码:

v = np.array([3, 4])
c = 2
print(c * v)  # 输出:[6 8]

1.3.3 向量的长度(范数)

向量的长度,也称范数(Norm),定义为:
∥ v ∥ = v 1 2 + v 2 2 + ⋯ + v n 2 \|\mathbf{v}\| = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2} v=v12+v22++vn2

示例
v = [ 3 4 ] \mathbf{v} = \begin{bmatrix} 3 \\ 4 \end{bmatrix} v=[34],则:
∥ v ∥ = 3 2 + 4 2 = 5 \|\mathbf{v}\| = \sqrt{3^2 + 4^2} = 5 v=32+42 =5

Python代码:

from numpy.linalg import norm

v = np.array([3, 4])
print(norm(v))  # 输出:5.0

1.4 向量的几何意义

向量可以用来描述“方向”和“大小”。例如:

  • 向量 v = [ 3 4 ] \mathbf{v} = \begin{bmatrix} 3 \\ 4 \end{bmatrix} v=[34] 指向二维平面中的点 ((3,4)),其长度为 5。

二、矩阵:多维数据的集合

2.1 什么是矩阵?

矩阵(Matrix)是一个二维数组,由行(Row)和列(Column)组成。矩阵在机器学习中非常重要,用于表示数据集、模型参数和特征变换。

2.1.1 举个例子:

假设我们有一个房价预测的数据集,包括以下信息:

可以将这个数据用矩阵表示:

  • 特征矩阵 (X):
    X = [ 50 5 100 10 150 8 ] X = \begin{bmatrix} 50 & 5 \\ 100 & 10 \\ 150 & 8 \end{bmatrix} X= 501001505108

  • 目标向量 (y):
    y = [ 100 200 300 ] y = \begin{bmatrix} 100 \\ 200 \\ 300 \end{bmatrix} y= 100200300


2.2 矩阵的表示与维度

2.2.1 矩阵的表示

矩阵通常用大写字母(如 (A), (X))表示,矩阵中的元素可以用行列索引 (A_{ij}) 表示,例如:
A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]

  • A 11 = 1 A_{11} = 1 A11=1 表示第一行第一列的元素。
  • A 23 = 6 A_{23} = 6 A23=6 表示第二行第三列的元素。
2.2.2 矩阵的维度

矩阵的维度用“行数 × 列数”表示,例如:

  • 上述矩阵 (A) 的维度是 2 × 3 2 \times 3 2×3(2 行 3 列)。
  • 如果一个矩阵的行数和列数相同,则称其为方阵

Python代码实现:

import numpy as np

# 创建矩阵
A = np.array([[1, 2, 3],
              [4, 5, 6]])
print("矩阵 A:\n", A)
print("A 的形状:", A.shape)  # 输出 (2, 3)

2.3 矩阵的基本运算

2.3.1 矩阵加法

两个矩阵相加要求维度相同,逐元素相加。例如:
[ 1 2 3 4 ] + [ 5 6 7 8 ] = [ 6 8 10 12 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} + \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} =\begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix} [1324]+[5768]=[610812]

Python代码:

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
print(A + B)  # 输出 [[6, 8], [10, 12]]

2.3.2 矩阵数乘

标量(普通数值)与矩阵相乘是将标量逐元素乘以矩阵中的每个元素。例如:
2 ⋅ [ 1 2 3 4 ] = [ 2 4 6 8 ] 2 \cdot \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} =\begin{bmatrix} 2 & 4 \\ 6 & 8 \end{bmatrix} 2[1324]=[2648]

Python代码:

A = np.array([[1, 2],
              [3, 4]])
print(2 * A)  # 输出 [[2, 4], [6, 8]]

2.3.3 矩阵乘法

矩阵乘法是矩阵运算中最常见的操作,用于特征变换和模型训练。

规则

  • 如果 A A A m × n m \times n m×n 的矩阵, B B B n × p n \times p n×p 的矩阵,则它们的乘积 C = A B C = AB C=AB m × p m \times p m×p 的矩阵。
  • 元素 C i j C_{ij} Cij 的计算公式为:
    C i j = ∑ k = 1 n A i k B k j C_{ij} = \sum_{k=1}^n A_{ik} B_{kj} Cij=k=1nAikBkj

示例
A = [ 1 2 3 4 ] , B = [ 5 6 7 8 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} A=[1324],B=[5768]

矩阵乘积:
C = A ⋅ B = [ 19 22 43 50 ] C = A \cdot B = \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix} C=AB=[19432250]

Python代码:

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
C = A.dot(B)  # 或使用 np.matmul(A, B)
print(C)  # 输出 [[19, 22], [43, 50]]

2.3.4 转置矩阵

矩阵的转置是将其行列互换。例如:
A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]
其转置为:
A T = [ 1 4 2 5 3 6 ] A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} AT= 123456

Python代码:

A = np.array([[1, 2, 3],
              [4, 5, 6]])
print(A.T)  # 输出 [[1, 4], [2, 5], [3, 6]]

三、矩阵的高级操作


3.1 矩阵的逆

3.1.1 什么是逆矩阵?

对于一个方阵 (A),如果存在一个矩阵 A − 1 A^{-1} A1,使得:
A ⋅ A − 1 = A − 1 ⋅ A = I A \cdot A^{-1} = A^{-1} \cdot A = I AA1=A1A=I
其中 I I I 是单位矩阵(对角线元素为 1,其他为 0 的矩阵),则称 A − 1 A^{-1} A1 A A A 的逆矩阵。

3.1.2 矩阵可逆的条件
  • 只有方阵(行数等于列数)可能有逆矩阵。
  • 如果矩阵的行列式(Determinant)为 0,则该矩阵不可逆(奇异矩阵)。
3.1.3 逆矩阵的计算

对于 2 × 2 2 \times 2 2×2 的矩阵 A = [ a b c d ] A = \begin{bmatrix} a & b \\ c & d \end{bmatrix} A=[acbd],其逆矩阵为:
A − 1 = 1 a d − b c [ d − b − c a ] A^{-1} = \frac{1}{ad - bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix} A1=adbc1[dcba]

例如:
A = [ 4 7 2 6 ] A = \begin{bmatrix} 4 & 7 \\ 2 & 6 \end{bmatrix} A=[4276]
行列式 a d − b c = 4 ⋅ 6 − 7 ⋅ 2 = 10 ad - bc = 4 \cdot 6 - 7 \cdot 2 = 10 adbc=4672=10

因此:
A − 1 = 1 10 [ 6 − 7 − 2 4 ] = [ 0.6 − 0.7 − 0.2 0.4 ] A^{-1} = \frac{1}{10} \begin{bmatrix} 6 & -7 \\ -2 & 4 \end{bmatrix} = \begin{bmatrix} 0.6 & -0.7 \\ -0.2 & 0.4 \end{bmatrix} A1=101[6274]=[0.60.20.70.4]

Python代码:

import numpy as np

# 定义矩阵
A = np.array([[4, 7],
              [2, 6]])

# 计算逆矩阵
A_inv = np.linalg.inv(A)
print("逆矩阵:\n", A_inv)

3.2 特征值与特征向量

3.2.1 什么是特征值和特征向量?

对于一个方阵 A A A,如果存在一个标量 λ \lambda λ 和一个非零向量 v \mathbf{v} v,使得:
A v = λ v A \mathbf{v} = \lambda \mathbf{v} Av=λv
则称:

  • λ \lambda λ 为矩阵 A A A 的特征值。
  • v \mathbf{v} v 为对应的特征向量。
3.2.2 几何意义

特征向量是一个方向,在矩阵变换下保持方向不变;特征值是对应的缩放因子。

3.2.3 计算特征值和特征向量

特征值通过解以下特征方程获得:
det ⁡ ( A − λ I ) = 0 \det(A - \lambda I) = 0 det(AλI)=0
解得的 λ \lambda λ 为特征值,将特征值代入方程 ( A − λ I ) v = 0 (A - \lambda I)\mathbf{v} = 0 (AλI)v=0 可解得特征向量。

Python代码:

from numpy.linalg import eig

# 定义矩阵
A = np.array([[4, 1],
              [2, 3]])

# 计算特征值和特征向量
values, vectors = eig(A)
print("特征值:\n", values)
print("特征向量:\n", vectors)

3.3 奇异值分解(SVD)

3.3.1 什么是奇异值分解?

奇异值分解(Singular Value Decomposition, SVD)是对矩阵的一种分解方法,可以表示为:
A = U Σ V T A = U \Sigma V^T A=UΣVT

3.3.2 SVD的用途
  • 数据降维:通过保留主要的奇异值,可以减少数据维度(如 PCA)。
  • 数据压缩:SVD可用于压缩图片或文本数据。
  • 推荐系统:通过矩阵分解预测用户评分。

Python代码:

from numpy.linalg import svd

# 定义矩阵
A = np.array([[1, 2],
              [3, 4],
              [5, 6]])

# 奇异值分解
U, Sigma, VT = svd(A)
print("U 矩阵:\n", U)
print("奇异值:\n", Sigma)
print("V 转置:\n", VT)

3.4 矩阵的伪逆

3.4.1 什么是伪逆?

伪逆矩阵(Pseudo-Inverse)是逆矩阵的推广,用于处理非方阵或奇异矩阵。对于一个矩阵 A A A,伪逆记为 A + A^+ A+

3.4.2 伪逆的计算方法

伪逆可以通过 SVD 计算:
A + = V Σ + U T A^+ = V \Sigma^+ U^T A+=VΣ+UT
其中 Σ + \Sigma^+ Σ+ 是对奇异值矩阵的伪逆。

Python代码:

# 定义矩阵
A = np.array([[1, 2],
              [3, 4],
              [5, 6]])

# 计算伪逆
A_pinv = np.linalg.pinv(A)
print("伪逆矩阵:\n", A_pinv)

四、矩阵在机器学习中的应用

4.1 数据表示

  • 特征矩阵:存储样本的特征数据,每一行表示一个样本,每一列表示一个特征。
  • 目标向量:存储样本对应的目标值。

4.2 模型训练中的矩阵运算

4.2.1 线性回归

在线性回归中,我们希望找到参数向量 θ \theta θ,使得:
y = X θ y = X\theta y=
通过最小化误差:
min ⁡ θ ∥ X θ − y ∥ 2 \min_\theta \|X\theta - y\|^2 θminy2
可以使用正规方程求解:
θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)1XTy

Python代码:

# 定义特征矩阵 X 和目标向量 y
X = np.array([[1, 50],
              [1, 100],
              [1, 150]])
y = np.array([100, 200, 300])

# 计算参数向量 theta
theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
print("参数向量 theta:", theta)

写在最后


以上就是关于【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章-LMLPHP

12-10 07:02