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

ops/2024/12/18 14:57:05/

文章目录

  • 线性代数入门:机器学习零基础小白指南
    • 前言
    • 一、向量:数据的基本单元
      • 1.1 什么是向量?
        • 1.1.1 举个例子:
      • 1.2 向量的表示与维度
        • 1.2.1 向量的维度
        • 1.2.2 向量的表示方法
      • 1.3 向量的基本运算
        • 1.3.1 向量加法
        • 1.3.2 向量的数乘
        • 1.3.3 向量的长度(范数)
      • 1.4 向量的几何意义
    • 二、矩阵:多维数据的集合
      • 2.1 什么是矩阵?
        • 2.1.1 举个例子:
      • 2.2 矩阵的表示与维度
        • 2.2.1 矩阵的表示
        • 2.2.2 矩阵的维度
      • 2.3 矩阵的基本运算
        • 2.3.1 矩阵加法
        • 2.3.2 矩阵数乘
        • 2.3.3 矩阵乘法
        • 2.3.4 转置矩阵
    • 三、矩阵的高级操作
      • 3.1 矩阵的逆
        • 3.1.1 什么是逆矩阵?
        • 3.1.2 矩阵可逆的条件
        • 3.1.3 逆矩阵的计算
      • 3.2 特征值与特征向量
        • 3.2.1 什么是特征值和特征向量?
        • 3.2.2 几何意义
        • 3.2.3 计算特征值和特征向量
      • 3.3 奇异值分解(SVD)
        • 3.3.1 什么是奇异值分解?
        • 3.3.2 SVD的用途
      • 3.4 矩阵的伪逆
        • 3.4.1 什么是伪逆?
        • 3.4.2 伪逆的计算方法
    • 四、矩阵在机器学习中的应用
      • 4.1 数据表示
      • 4.2 模型训练中的矩阵运算
  • 写在最后

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

💬 欢迎讨论:如果你在阅读过程中对某些公式或内容有疑问,欢迎在评论区留言,大家一起交流进步!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?记得点赞收藏,并分享给对机器学习感兴趣的朋友吧!你们的支持是我创作的最大动力!

🚀 知识的启航线性代数机器学习的基础,也是未来探索智能模型的关键。让我们从这里开始,一步步搭建知识大厦!


前言

在正式踏入机器学习的实战领域前,我们需要为自己筑起一座坚实的数学地基。 对于零基础的学习者而言,数学听起来也许陌生甚至有点“吓人”。然而,不必惧怕:本篇文章将带你从最直观的概念出发,帮助你理解和掌握线性代数这门支撑机器学习大厦的重要支柱。

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

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

本篇文章将采用从浅入深的方式,带你从最基本的概念(向量与矩阵)出发,逐步触及更深层的运算与应用。你不需要担心自己的数学基础薄弱,每一个概念都会配以直观解释、示例和适合初学者的类比。通过本篇的学习,你将在脑海中构建起对数据表示和线性结构的基础认知,为后续的学习奠定牢固根基。


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

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 为例):

    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代码:

python">import numpy as npa = 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代码:

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代码:

python">from numpy.linalg import normv = 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 举个例子:

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

面积(平方米)房龄(年)房价(万元)
505100
10010200
1508300

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

  • 特征矩阵 (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代码实现:

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代码:

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代码:

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代码:

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代码:

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代码:

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代码:

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代码:

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代码:

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代码:

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)

写在最后

通过这篇文章的学习,你初步了解了向量和矩阵这些基础概念,以及它们在机器学习中的重要性。从简单的向量加减和数乘,到稍微复杂的矩阵运算,再到特征值、奇异值分解等高级知识点,这些都是构建更高级模型和理解算法原理的关键砖瓦。

你或许会发现,这些数学内容并不是遥不可及的高门槛,相反,它们能帮助你更直观地理解数据与模型之间的关系。接下来,你可以尝试把这里学到的知识灵活运用到一些简单数据分析或小项目中,比如实现一个最基础的线性回归预测,或者对一个数据集进行简单的降维操作。

在后续的学习中,我们还会介绍更多与机器学习相关的数学和编程技巧。希望这篇文章能成为你打牢数学基础的起点,让你在机器学习这片广阔的领域中更有方向感和掌控力。加油!


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

在这里插入图片描述


http://www.ppmy.cn/ops/142936.html

相关文章

OpenShift 4 - 多云管理(2) - 配置多集群观察功能

《OpenShift / RHEL / DevSecOps 汇总目录》 本文在 OpenShift 4.17 RHACM 2.12 环境中进行验证。 文章目录 多集群观察技术架构安装多集群观察功能监控多集群的运行状态监控多集群的应用运行在被管集群监控应用运行在管理集群监控被管集群的应用运行 参考 多集群观察技术架构…

CSDN博客:如何使用Python的`datasets`库转换音频采样率

CSDN博客:如何使用Python的datasets库转换音频采样率 什么是采样率?代码用途:调整音频数据的采样率完整代码示例代码详解运行结果(示例)总结 在这篇文章中,我们将学习如何使用Python的datasets库对音频数据…

ios swift 开发系列--如何把粤语转语音

在Swift中,我们可以使用AVSpeechSynthesizer进行文本到语音的转换,我们通过设置AVSpeechUtterance的voice属性来指定朗读的语言和口音。 要确保朗读的是粤语,我们应该使用一个特定的语言代码,例如"zh-Hant-HK"&#xf…

Python+OpenCV系列:膨胀和腐蚀——图像形态学操作深度解析

文章目录 什么是膨胀(Dilation)?什么是腐蚀(Erosion)?膨胀和腐蚀如何工作?如何在Python中使用OpenCV实现膨胀和腐蚀?**1. 图像膨胀****2. 图像腐蚀****3. 膨胀与腐蚀的组合使用****调…

【JavaEE初阶】线程 和 thread

本节⽬标 认识多线程 掌握多线程程序的编写 掌握多线程的状态 一. 认识线程(Thread) 1概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码. 还…

SQL 中的 JOIN(JOIN 简化与提速系列 1)

连接运算(JOIN)一直是 SQL 中的老大难问题。在关联表稍多一点的时候,代码书写就变得很容易出错了。而且因为 JOIN 语句的复杂,导致关联查询也一向是 BI 软件的软肋,几乎没有 BI 软件能让业务用户顺畅地完成多表关联查询…

linux 20.04 安装sougou输入法 重启 可视化界面 无法点击

在Linux 20.04(Ubuntu 20.04)系统中安装搜狗输入法后,如果遇到重启后可视化界面无法点击的问题,这通常是由于搜狗输入法或其依赖的输入法框架(如fcitx)与系统的某些部分不兼容所导致的。以下是一些可能的解…

使用git bash本地创建分支并将分支提交到远程仓库

第一次推送分支到远程仓库 步骤1&#xff1a;进入本地项目目录 打开 Git Bash。通过以下命令进入你的本地项目目录&#xff1a; cd /path/to/your/project步骤2&#xff1a;添加远程仓库 git remote add origin <远程仓库URL> 例子&#xff1a; git remote add orig…