趋近智
矩阵可以表示线性变换。使用NumPy对一组数据点应用缩放和旋转等变换。此应用说明了矩阵乘法在处理几何数据方面的作用,这是计算机图形学和机器学习数据预处理等方面的常见任务。
首先,确保已安装并导入NumPy。我们将定义一个由二维点组成的小型数据集。为使变换易于观察,我们使用构成简单形状(如“L”形)的点。
import numpy as np
import math
# 将数据点定义为矩阵中的行向量
# 每行是一个点 (x, y)
data_points = np.array([
[0, 0],
[1, 0],
[1, 1],
[1, 2]
])
print("原始数据点(每行是一个点):")
print(data_points)
我们的data_points矩阵有4行(表示点)和2列(表示x和y坐标)。
在进行变换前,我们先可视化这些起始点。散点图适用于此。
我们的数据点形成的初始L形。
让我们应用一个缩放变换。我们将x坐标缩放1.5倍,y坐标缩放0.5倍。为此的缩放矩阵S为:
S=[1.5000.5]当我们用这个缩放矩阵S乘以我们的数据矩阵D(点以行表示),即D′=D@S,每个点(x,y)将变为(1.5x,0.5y)。
# 定义缩放矩阵
scaling_matrix = np.array([
[1.5, 0],
[0, 0.5]
])
# 应用变换
# 数据点是行 (n x 2),缩放矩阵是 (2 x 2)
# 结果是 (n x 2) @ (2 x 2) = (n x 2)
scaled_data = data_points @ scaling_matrix
print("\n缩放后的数据点:")
print(scaled_data)
让我们可视化结果并与原始点一起显示。
L形水平拉伸(x轴缩放1.5倍)并垂直压缩(y轴缩放0.5倍)。
现在,让我们将原始点逆时针旋转45度(π/4弧度)。角度为θ的逆时针旋转矩阵R为:
R=[cos(θ)−sin(θ)sin(θ)cos(θ)]我们将其应用为D′=D@R。
# 以弧度定义旋转角度
angle_degrees = 45
angle_radians = math.radians(angle_degrees)
cos_theta = math.cos(angle_radians)
sin_theta = math.sin(angle_radians)
# 定义旋转矩阵
rotation_matrix = np.array([
[cos_theta, sin_theta],
[-sin_theta, cos_theta]
])
# 对原始数据应用变换
rotated_data = data_points @ rotation_matrix
print(f"\n旋转矩阵({angle_degrees}度逆时针):")
print(rotation_matrix)
print("\n旋转后的数据点:")
print(rotated_data)
让我们可视化旋转结果。
L形围绕原点(0,0)逆时针旋转45度。请注意,坐标根据旋转矩阵中的三角函数而变化。
线性变换可以组合使用。对数据D应用变换T1后再应用T2的效果,等同于应用一个单一的组合变换Tcombined=T1@T2。顺序很重要!我们先应用缩放,然后应用旋转。
D′′=(D@S)@R=D@(S@R)
# 组合变换:先缩放,后旋转
# 选项1:按顺序应用
temp_data = data_points @ scaling_matrix # 先应用缩放
scaled_then_rotated_data = temp_data @ rotation_matrix # 然后应用旋转
# 选项2:先组合矩阵
combined_matrix_SR = scaling_matrix @ rotation_matrix
scaled_then_rotated_data_combined = data_points @ combined_matrix_SR
print("\n组合矩阵(先缩放后旋转):")
print(combined_matrix_SR)
print("\n先缩放后旋转的数据(按顺序):")
print(scaled_then_rotated_data)
print("\n先缩放后旋转的数据(组合矩阵):")
print(scaled_then_rotated_data_combined)
# 验证它们在数值上接近
assert np.allclose(scaled_then_rotated_data, scaled_then_rotated_data_combined)
让我们可视化先缩放后旋转的最终结果。
L形经过缩放(水平拉伸、垂直压缩)然后逆时针旋转45度后的结果。将其与先旋转后缩放的效果进行比较(供读者练习!)。
本次动手练习说明了矩阵乘法如何提供一种简洁且计算高效的方式,来对数据应用几何变换。我们使用NumPy的@运算符进行矩阵乘法,以对一组二维点执行缩放和旋转操作。
理解这些操作对以下方面很有意义:
以下是完整的Python代码供参考:
import numpy as np
import math
# 1. 定义原始数据
data_points = np.array([
[0, 0],
[1, 0],
[1, 1],
[1, 2]
])
print("原始数据点:\n", data_points)
# 2. 定义缩放变换
scaling_factor_x = 1.5
scaling_factor_y = 0.5
scaling_matrix = np.array([
[scaling_factor_x, 0],
[0, scaling_factor_y]
])
scaled_data = data_points @ scaling_matrix
print("\n缩放矩阵:\n", scaling_matrix)
print("缩放后的数据:\n", scaled_data)
# 3. 定义旋转变换
angle_degrees = 45
angle_radians = math.radians(angle_degrees)
cos_theta = math.cos(angle_radians)
sin_theta = math.sin(angle_radians)
rotation_matrix = np.array([
[cos_theta, sin_theta],
[-sin_theta, cos_theta]
])
rotated_data = data_points @ rotation_matrix
print(f"\n旋转矩阵 ({angle_degrees} 度逆时针):\n", rotation_matrix)
print("旋转后的数据:\n", rotated_data)
# 4. 组合变换 (先缩放后旋转)
# 选项1: 按顺序
scaled_then_rotated_data = (data_points @ scaling_matrix) @ rotation_matrix
# 选项2: 先组合矩阵
combined_matrix_SR = scaling_matrix @ rotation_matrix
scaled_then_rotated_data_combined = data_points @ combined_matrix_SR
print("\n组合矩阵 (缩放 @ 旋转):\n", combined_matrix_SR)
print("先缩放后旋转的数据:\n", scaled_then_rotated_data)
# 验证
assert np.allclose(scaled_then_rotated_data, scaled_then_rotated_data_combined)
print("\n按顺序和组合矩阵应用的结果是一致的。")
尝试使用不同的变换矩阵(例如,剪切、反射、不同的缩放因子或旋转角度),并观察它们对数据点的影响。考虑以不同顺序应用变换,看看结果如何变化。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造