【深度学习与大模型基础】第4章-矩阵的运算
1、矩阵的转置
什么是矩阵的转置?
矩阵的转置就是把矩阵的行和列互换。换句话说,原来的第 i 行第 j 列的元素,转置后就变成了第 j 行第 i 列的元素。
举个例子,假设我们有一个矩阵 A:
这个矩阵有 2 行 3 列。它的转置矩阵 就是把行和列互换,变成一个 3 行 2 列的矩阵:
矩阵转置在计算机科学中的应用
矩阵转置在计算机科学中有很多应用,尤其是在数据处理和算法设计中。下面举几个例子:
-
图像处理:
-
在图像处理中,图像可以表示为一个矩阵。转置操作可以用来旋转图像。比如,将图像矩阵转置后再进行一些处理,可以实现图像的90度旋转。
-
-
机器学习:
-
在机器学习中,数据通常以矩阵的形式表示。转置操作在计算中非常常见,比如在计算梯度下降时,需要对矩阵进行转置以便进行矩阵乘法。
-
-
数据库和数据分析:
-
在数据库中,数据表可以看作是一个矩阵。转置操作可以用来转换数据的表示形式,方便进行某些类型的查询和分析。
-
-
线性代数计算:
-
在解线性方程组或进行特征值计算时,矩阵转置是一个基本的操作。比如,在计算矩阵的逆或进行奇异值分解(SVD)时,转置操作是必不可少的。
-
python演示
矩阵的转置就是把矩阵的行和列互换。这个操作在计算机科学中非常有用,广泛应用于图像处理、机器学习、数据库管理和线性代数计算等领域。
import numpy as np
import matplotlib.pyplot as plt# 创建一个矩阵(2维张量)
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("Original Matrix:")
print(matrix)# 计算矩阵的转置
transposed_matrix = matrix.T
print("\nTransposed Matrix:")
print(transposed_matrix)# 可视化原始矩阵
plt.figure(figsize=(12, 5))plt.subplot(1, 2, 1)
plt.imshow(matrix, cmap='viridis')
plt.colorbar()
plt.title('Original Matrix')# 可视化转置后的矩阵
plt.subplot(1, 2, 2)
plt.imshow(transposed_matrix, cmap='viridis')
plt.colorbar()
plt.title('Transposed Matrix')plt.tight_layout()
plt.show()
2.矩阵的广播
什么是矩阵的广播?
广播是一种让不同形状的矩阵(或张量)在进行数学运算时能够兼容的机制。简单来说,它允许我们对形状不同的矩阵进行逐元素操作(比如加法、乘法等),而无需显式地改变它们的形状。
举个例子:
假设我们有一个矩阵 A 和一个向量 b:
如果我们想对 A 的每一行都加上向量 b,广播机制会自动将 b “扩展”成与 A 相同的形状,然后再进行逐元素相加:
这里,b 被广播成了一个 2×32×3 的矩阵:
广播的规则
广播并不是随便就能用的,它有一些规则:
-
维度对齐:从最后一个维度开始,两个矩阵的维度必须相同,或者其中一个矩阵的维度为 1。
-
扩展维度:如果某个维度的大小为 1,那么可以沿着这个维度复制数据,使其与另一个矩阵的对应维度大小匹配。
例子:
-
矩阵 A 的形状是 3×4,矩阵 B 的形状是 1×4,那么 B 可以被广播成 3×4。
-
矩阵 A 的形状是 5×3×4,矩阵 B 的形状是 1×3×4,那么 B 可以被广播成 5×3×4。
广播在计算机科学中的应用
广播在计算机科学中非常有用,尤其是在以下领域:
-
深度学习:
-
在神经网络中,广播常用于对权重矩阵和输入数据进行逐元素操作。比如,在计算损失函数时,广播可以简化代码并提高计算效率。
-
-
数值计算:
-
在科学计算中,广播可以避免显式地复制数据,从而节省内存并加速计算。比如,在 NumPy 或 TensorFlow 中,广播机制被广泛使用。
-
-
图像处理:
-
在图像处理中,广播可以用来对图像的每个像素进行操作。比如,对一张彩色图像的每个通道加上一个固定的值。
-
python演示矩阵的广播
矩阵广播(broadcasting)是NumPy中一个强大的功能,它允许不同形状的数组进行算术运算。广播规则使得较小的数组在必要时会被“扩展”以匹配较大数组的形状。
下面是一个示例代码,演示如何使用NumPy进行矩阵广播,并使用Matplotlib进行可视化
import numpy as np
import matplotlib.pyplot as plt# 创建一个矩阵
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("Original Matrix:")
print(matrix)# 创建一个向量
vector = np.array([10, 20, 30])
print("\nVector:")
print(vector)# 使用广播进行加法运算
broadcasted_result = matrix + vector
print("\nBroadcasted Result:")
print(broadcasted_result)# 可视化原始矩阵
plt.figure(figsize=(12, 6))plt.subplot(1, 3, 1)
plt.imshow(matrix, cmap='viridis')
plt.colorbar()
plt.title('Original Matrix')# 可视化向量
plt.subplot(1, 3, 2)
plt.imshow(vector.reshape(1, -1), cmap='viridis', aspect='auto')
plt.colorbar()
plt.title('Vector')# 可视化广播后的结果
plt.subplot(1, 3, 3)
plt.imshow(broadcasted_result, cmap='viridis')
plt.colorbar()
plt.title('Broadcasted Result')plt.tight_layout()
plt.show()
3.矩阵的乘法
什么是矩阵的乘法?
矩阵的乘法是一种将两个矩阵结合起来生成一个新矩阵的操作。不过,矩阵乘法和我们熟悉的逐元素乘法不同,它有自己独特的规则。
规则:
假设我们有两个矩阵 A 和 B:
-
A 的形状是 m×n(m 行 n 列),
-
B 的形状是 n×p(n 行 p 列)。
那么,它们的乘积 C=A×B 的形状是 m×p。也就是说,结果矩阵 C 的行数等于 A 的行数,列数等于 B 的列数。
计算方法:
C 中的每个元素 Cij 是通过 A 的第 i 行和 B 的第 j 列对应元素相乘再相加得到的:
举个例子
假设我们有两个矩阵:
矩阵乘法在计算机科学中的应用
矩阵乘法在计算机科学中非常重要,尤其是在以下领域:
-
图形学:
-
在计算机图形学中,矩阵乘法用于实现图形的变换,比如平移、旋转和缩放。比如,一个 3D 物体的坐标可以通过矩阵乘法变换到屏幕上的 2D 坐标。
-
-
机器学习:
-
在神经网络中,矩阵乘法是核心操作之一。比如,输入数据与权重矩阵的乘积用于计算神经元的输出。
-
-
数据分析:
-
在数据分析中,矩阵乘法可以用于计算特征之间的相关性,或者降维(如主成分分析 PCA)。
-
-
推荐系统:
-
在推荐系统中,用户-物品评分矩阵可以通过矩阵分解(如奇异值分解 SVD)来预测用户对未评分物品的偏好。
-
python演示矩阵的乘法
import numpy as np
import matplotlib.pyplot as plt# 创建两个矩阵
matrix_a = np.array([[1, 2], [3,4]])
matrix_b = np.array([[5, 6], [7, 8]])
print("Matrix A:")
print(matrix_a)
print("\nMatrix B:")
print(matrix_b)# 进行矩阵乘法
matrix_product = np.dot(matrix_a, matrix_b)
print("\nMatrix Product (A * B):")
print(matrix_product)# 可视化矩阵A
plt.figure(figsize=(15, 5))plt.subplot(1, 3, 1)
plt.imshow(matrix_a, cmap='viridis')
plt.colorbar()
plt.title('Matrix A')# 可视化矩阵B
plt.subplot(1, 3, 2)
plt.imshow(matrix_b, cmap='viridis')
plt.colorbar()
plt.title('Matrix B')# 可视化矩阵乘法的结果
plt.subplot(1, 3, 3)
plt.imshow(matrix_product, cmap='viridis')
plt.colorbar()
plt.title('Matrix Product (A * B)')plt.tight_layout()
plt.show()