3 线性代数回顾

矩阵,向量,矩阵乘法,矩阵求逆转置(我补充了利用Numpy和Pandas进行运算的方法)

Posted by Hilda on March 3, 2025

吴恩达课程系列

1-1 欢迎参加《机器学习》课程【机器学习简介/例子】

1-2 什么是机器学习【机器学习的2个定义和分类】

1-3监督学习【监督学习的定义,监督学习的分类(回归与分类)】

1-4无监督学习【无监督学习的定义,无监督学习问题的分类(聚类/信号分离/降维)】

2-1模型描述【如何描述一个模型(用一些符号),单变量线性回归是什么?】

2-2~2-4代价函数【代价函数的数学定义、代价函数的直观理解】

2-5 梯度下降【梯度下降的数学原理】

2-6梯度下降知识点总结【导数项、学习率的直观理解】

2-7线性回归的梯度下降【线性回归问题运用梯度下降法(求偏导)】


本篇博客主要记录矩阵的一些操作(线性代数知识的回顾),简单记录,不赘述

3 线性代数回顾(linear algebra review)

3-1 矩阵(matrix)和向量(vector)

如图:这个是 4×2 矩阵,即 4 行 2 列,如 m 为行,n 为列,那么 m×n 即 4×2

image-20250303154225726

矩阵的维数即行数×列数

今天看西瓜书,也看到了维数的概念:

image-20250303154325902

矩阵元素(矩阵项):

image-20250303154349633

\(A_{ij}\)指第 \(i\)行,第 \(j\) 列的元素。

向量是一种特殊的矩阵,讲义中的向量一般都是列向量,如:

image-20250303154428443

为四维列向量(\(4 \times 1\))。 如下图为 1 索引向量0 索引向量,左图为 1 索引向量,右图为 0 索引向量,一般我们用 1 索引向量。

image-20250303154504579

编程中肯定更习惯用右边的。

3-2 矩阵加法和标量乘法

矩阵的加法:行列数相等的可以加。 比如下图:

image-20250303154550852

矩阵的乘法:每个元素都要乘

image-20250303154606497

组合算法也类似,例如下图:

image-20250303154632041

3-3 矩阵向量乘法

矩阵和向量的乘法如图:m×n 的矩阵乘以 n×1 的向量,得到的是 m×1 的向量

image-20250303154735230

3-4 矩阵乘法

矩阵乘法: m×n 矩阵乘以 n×o 矩阵,变成 m×o 矩阵。

如果这样说不好理解的话就举一个例子来说明一下,比如说现在有两个矩阵 A 和 B,那么它们的乘积就可以表示为图中所示的形式。

image-20250303154835355

3-5 矩阵乘法的性质

矩阵乘法的性质: 矩阵的乘法不满足交换律:A×B≠B×A

矩阵的乘法满足结合律。即:A×(B×C)=(A×B)×C

单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的 1,我们称这种矩阵为单位矩阵.它是个方阵,一般用 I 或者 E 表示,本讲义都用 I 代表单位矩阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1 以外全都为 0。如:

image-20250303154938453

对于单位矩阵,有 AI=IA=A

3-6 逆、转置

矩阵的逆:如矩阵 A 是一个 m×m 矩阵(方阵),如果有逆矩阵,则:

image-20250303155010585

矩阵的转置:设 A 为 m×n 阶矩阵(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),即:A=a(i,j)

定义 A 的转置为这样一个 n×m 阶矩阵 B,满足 B=a(j,i),即 b (i,j)=a (j,i)(B 的第 i 行第j 列元素是 A 的第 j 行第 i 列元素),记\(A^T=B\)。(有些书记为 \(A'=B\))

直观来看,将 \(A\) 的所有元素绕着一条从第 1 行第 1 列元素出发的右下方 45 度的射线作镜面反转,即得到 \(A\) 的转置。

比如:

image-20250303155151239

矩阵的转置基本性质:

image-20250303155216650

补充:numpy/pandas中的矩阵运算

主要补充:

  • 乘法
  • 转置

NumPy 中的矩阵运算

NumPy 提供了强大的数组(ndarray)对象,非常适合进行矩阵运算。

元素级乘法:要求两个数组的形状(shape)必须相同

1
2
3
4
5
6
7
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

element_wise_product = a * b
print("Element-wise Product:\n", element_wise_product)

image-20250303155407504

矩阵乘法

这个就是一般我们说的矩阵乘法

使用 @ 运算符或 np.matmul() 函数。 这种乘法符合线性代数中矩阵乘法的定义。 a @ b 要求 a 的列数等于 b 的行数。(也是两个矩阵相乘的要求):

1
2
3
4
5
6
7
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

matrix_product = a @ b  # 或者 np.matmul(a, b)
print("Matrix Product:\n", matrix_product)

image-20250303155550502

逆矩阵

使用 np.linalg.inv() 函数计算方阵的逆矩阵。 只有方阵(行数和列数相等的矩阵)才可能存在逆矩阵。 如果矩阵不可逆(奇异矩阵),则会引发 LinAlgError 异常。

1
2
n = np.array([[1, 2], [3, 4]])
np.linalg.inv(n)

image-20250303155655728

转置

使用 .T 属性或 np.transpose() 函数获取矩阵的转置。 转置矩阵是将原矩阵的行和列互换得到的新矩阵。

1
2
3
a = np.array([[1, 2], [3, 4]])
a.T
a.transpose()

image-20250303155759176

Pandas 中的矩阵运算

Pandas 的 DataFrame 对象也可以进行一些矩阵运算,但通常需要先将其转换为 NumPy 数组,然后再进行计算。

元素级乘法

与 NumPy 类似,使用 * 运算符。

1
2
3
4
df1 = pd.DataFrame([[1, 2], [3, 4]])
df2 = pd.DataFrame([[5, 6], [7, 8]])
display(df1, df2)
df1*df2

image-20250303155924026

矩阵乘法

需要先将 DataFrame 转换为 NumPy 数组,然后再使用 @np.matmul()

1
2
3
4
df1 = pd.DataFrame([[1, 2], [3, 4]])
df2 = pd.DataFrame([[5, 6], [7, 8]])

df1.values @ df2.values

image-20250303160041806

逆矩阵

需要先将 DataFrame 转换为 NumPy 数组,然后再使用 np.linalg.inv()

1
2
3
4
5
6
7
8
a = pd.DataFrame([[1, 2], [3, 4]])

try:
    inver = np.linalg.inv(a.values)
    display(inver)
except:
    print("矩阵不可逆")
    

image-20250303160245012

转置

使用 .T 属性或 np.transpose() 函数。 可以直接对 DataFrame 对象进行转置

1
2
3
4
5
df = pd.DataFrame([[1, 2], [3, 4]])
df.T
df.transpose()
df.values.T
df.values.transpose()

image-20250303160413395

总结:

  • NumPy 是进行数值计算的基础库,提供了丰富的矩阵运算函数。
  • Pandas 主要用于数据处理和分析,DataFrame 对象可以进行一些基本的矩阵运算,但更复杂的运算需要转换为 NumPy 数组进行(df.values就转换成了ndarray)。
  • 记住 * 是元素级乘法,@ np.matmul() 是矩阵乘法。
  • 使用 np.linalg.inv() 计算逆矩阵,注意处理奇异矩阵的情况。
  • 使用 .T 属性或 np.transpose() 函数进行转置。