线性代数入门:机器学习零基础小白指南
前言
对于零基础的学习者而言,数学听起来也许陌生甚至有点“吓人”。然而,不必惧怕:本篇文章将带你从最直观的概念出发,帮助你理解和掌握线性代数这门支撑机器学习大厦的重要支柱。
为什么选择线性代数作为第一站?
- 数据表示:机器学习中的数据常以矩阵和向量的形式表示,线性代数是理解这种数据结构的语言。
- 模型构建:许多经典模型(如线性回归)和高级算法(如神经网络中的参数更新)都依赖矩阵运算和向量运算的思想。
- 特征变换:降维、特征提取、特征工程等处理步骤都离不开对线性代数的理解。
一、向量:数据的基本单元
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 向量的表示方法
-
数学表示:用列向量或行向量表示,例如:
- 列向量:
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]
- 列向量:
-
编程实现(以 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=[c⋅v1c⋅v2]
例如:
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=1∑nAikBkj
示例:
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=A⋅B=[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} A−1,使得:
A ⋅ A − 1 = A − 1 ⋅ A = I A \cdot A^{-1} = A^{-1} \cdot A = I A⋅A−1=A−1⋅A=I
其中 I I I 是单位矩阵(对角线元素为 1,其他为 0 的矩阵),则称 A − 1 A^{-1} A−1 是 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} A−1=ad−bc1[d−c−ba]
例如:
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 ad−bc=4⋅6−7⋅2=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} A−1=101[6−2−74]=[0.6−0.2−0.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=Xθ
通过最小化误差:
min θ ∥ X θ − y ∥ 2 \min_\theta \|X\theta - y\|^2 θmin∥Xθ−y∥2
可以使用正规方程求解:
θ = ( 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)
写在最后
以上就是关于【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️