向量范数的计算在人工智能和量子计算中都至关重要 用于诸如特征缩放、正则化、距离等任务度量、收敛标准、表示量子态、确保运算的统一性、纠错以及设计量子算法和电路。
您将在 Python 库,例如 NumPy、 SciPy、Scikit-Learn
,TensorFlow 和 PyTorch。
了解范数与距离
在开始之前,我们先了解一下欧几里德范数与欧几里德距离之间的区别。
- 范数是向量距原点 (0,0) 的距离/长度/大小。
- 距离是两个向量之间的距离/长度/大小。
先决条件
- 安装 Jupyter。
- 在 Jupyter Notebook 中运行以下代码以安装先决条件。
# 安装运行笔记本的先决条件
!pip 安装 numpy
!pip 安装 scipy
%pip 安装火炬
!pip 安装tensorflow
您将使用 Jupyter Notebook 运行 Python 代码单元来计算不同 Python 库中的 L2 范数。
让我们开始吧
现在您已经在计算机上设置了 Jupyter 并安装了所需的 Python 库,让我们开始使用 NumPy 定义一维张量。
NumPy
NumPy 是一个用于科学计算的 Python 库。 NumPy 提供多维数组和其他派生对象。
张量秩
图标题>
# 定义一维(1D)张量
将 numpy 导入为 np
矢量1 = np.array([3,7]) #np.random.randint(1,5,2)
矢量2 = np.array([5,2]) #np.random.randint(1,5,2)
print("向量 1:",向量1)
print("向量 2:",向量2)
print(f"Vector1 和 Vector2 的形状和大小:", vector1.shape, vector1.size)
打印向量
矢量 1:[3 7]
矢量2:[5 2]
Vector1 和 Vector2 的形状和大小:(2,) 2
Matplotlib
Matplotlib 是一个 Python 可视化库,用于创建静态、动画和交互式可视化。您将使用 Matplotlib 的 quiver
来绘制向量。
# 使用 MatplotLib 绘制向量
将 matplotlib.pyplot 导入为 plt
%matplotlib 内联
原点 = np.array([0,0])
plt.quiver(*原点,向量1[0],向量1[1],角度='xy',颜色='r',scale_units='xy',比例=1)
plt.quiver(*原点,向量2[0],向量2[1],角度='xy',颜色='b',scale_units='xy',比例=1)
plt.plot([向量1[0],向量2[0]],[向量1[1],向量2[1]],'走',linestyle=”--”)
plt.title('向量表示')
plt.xlim([0,10])
plt.ylim([0,10])
plt.grid()
plt.show()
使用 Matplolib 的矢量表示
图标题>
# 向量的 L2(欧几里德)范数
# numpy
norm1 = np.linalg.norm(向量1, ord=2)
print("距离原点的大小/距离",norm1)
norm2 = np.linalg.norm(向量2, ord=2)
print("距离原点的大小/距离",norm2)
在 Jupyter Notebook 中运行此命令后的输出:
距原点的幅度/距离 7.615773105863909
距原点的震级/距离5.385164807134504
SciPy
SciPy 构建于 NumPy 之上,用于数学计算。如果您观察,SciPy 使用与 NumPy 相同的 linalg
函数。
# SciPy
导入 scipy
norm_vector1 = scipy.linalg.norm(向量1, ord=2)
print("scipy 中向量 1 的 L2 范数:",norm_vector1)
norm_vector2 = scipy.linalg.norm(向量2, ord=2)
print("scipy 中向量2的L2范数:",norm_vector2)
输出:
scipy 中向量1的L2范数:7.615773105863909
scipy 中向量2的L2范数:5.385164807134504
Scikit-Learn
正如 Scikit-learn 文档所述: p>
<块引用>
Scikit-learn
是一个开源机器学习库,支持监督和无监督学习。它还提供了用于模型拟合、数据预处理、模型选择、模型评估和许多其他实用程序的各种工具。
块引用>
我们重塑向量,因为 Scikit-learn
期望向量是二维的。
# Sklearn
从 sklearn.metrics.pairwise 导入 euclidean_distances
矢量1_reshape = 矢量1.reshape(1,-1)
## Scikit-learn 期望向量是二维的
euclidean_distances(vector1_reshape, [[0, 0]])[0,0]
输出
7.615773105863909
TensorFlow
TensorFlow 是一个端到端机器学习平台。
# TensorFlow
导入操作系统
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
将张量流导入为 tf
print("TensorFlow 版本:", tf.__version__)
## Tensorflow 需要 float32、float64、complex64、complex128 类型的 Tensor
矢量1_tf =矢量1.astype(np.float64)
tf_norm = tf.norm(向量1_tf, ord=2)
print("TensorFlow 中的欧几里得 (l2) 范数:",tf_norm.numpy())
输出
输出打印 TensorFlow 的版本和 L2 范数:
TensorFlow 版本:2.15.0
TensorFlow 中的欧几里得(l2)范数:7.615773105863909
PyTorch
PyTorch 是一个优化的张量库,用于使用 GPU 和 CPU 进行深度学习。
# PyTorch
进口火炬
print("PyTorch 版本:", torch.__version__)
norm_torch = torch.linalg.norm(torch.from_numpy(vector1_tf), ord=2)
norm_torch.item()
输出打印 PyTorch 版本和规范:
欧几里德距离
欧几里得距离的计算方式与范数相同,不同之处在于您在将差异 – vector_diff
(在本例中)传递到各自的库之前计算向量之间的差异。
输出
使用 NumPy 库的范数和点函数进行输出:
5.385164807134504
5.385164807134504
# SciPy
从 scipy.spatial 导入距离
distance.euclidean(向量1,向量2)
使用 SciPy 输出
<前>5.385164807134504前>
包含输出的 Jupyter Notebook 可在 GitHub 存储库一个>。您可以按照 GitHub 存储库上的说明在 Colab 上运行 Jupyter Notebook。