向量范数的计算在人工智能和量子计算中至关重要,应用于特征缩放、正则化、距离度量、收敛准则、量子态表示、操作的幺正性保障、错误校正以及量子算法与电路设计等任务。
你将学习如何使用Python中的NumPy、SciPy、Scikit-Learn
、TensorFlow和PyTorch等库计算一维(1D)张量的欧几里得范数(距离),即L2范数。
理解范数与距离的区别
在开始之前,我们先区分欧几里得范数与欧几里得距离的概念。
- 范数是指向量从原点(0,0)出发的距离/长度/大小。
- 而距离则是指两个向量之间的距离/长度/大小。
预备知识
- 安装Jupyter.
- 在Jupyter Notebook中运行以下代码以安装必要的依赖项.
# 安装运行笔记本所需的预先条件
!pip install numpy
!pip install scipy
%pip install torch
!pip install tensorflow
您将使用Jupyter Notebook运行Python代码单元格,以在不同的Python库中计算L2范数.
让我们开始吧
现在您已经在您的机器上设置了Jupyter并安装了所需的Python库,让我们开始使用NumPy定义一个一维张量.
NumPy
NumPy是一个用于科学计算的Python库. NumPy提供了一个多维数组和其他派生对象.
张量秩
# 定义一个单维(1D)张量
import numpy as np
vector1 = np.array([3,7]) #np.random.randint(1,5,2)
vector2 = np.array([5,2]) #np.random.randint(1,5,2)
print("Vector 1:",vector1)
print("Vector 2:",vector2)
print(f"shape & size of Vector1 & Vector2:", vector1.shape, vector1.size)
打印向量
Vector 1: [3 7]
Vector 2: [5 2]
shape & size of Vector1 & Vector2: (2,) 2
Matplotlib
Matplotlib是一个用于创建静态、动画和交互式可视化的Python可视化库. 您将使用Matplotlib的quiver
来绘制向量.
# 使用MatplotLib绘制向量
import matplotlib.pyplot as plt
%matplotlib inline
origin = np.array([0,0])
plt.quiver(*origin, vector1[0],vector1[1], angles='xy', color='r', scale_units='xy', scale=1)
plt.quiver(*origin, vector2[0],vector2[1], angles='xy', color='b', scale_units='xy', scale=1)
plt.plot([vector1[0],vector2[0]], [vector1[1],vector2[1]], 'go', linestyle="--")
plt.title('Vector Representation')
plt.xlim([0,10])
plt.ylim([0,10])
plt.grid()
plt.show()
使用Matplolib的向量表示
# 向量的L2(欧几里得)范数
# NumPy
norm1 = np.linalg.norm(vector1, ord=2)
print("The magnitude / distance from the origin",norm1)
norm2 = np.linalg.norm(vector2, ord=2)
print("The magnitude / distance from the origin",norm2)
在Jupyter Notebook中运行此代码后的输出:
The magnitude / distance from the origin 7.615773105863909
The magnitude / distance from the origin 5.385164807134504
SciPy
SciPy基于NumPy构建,用于数学计算. 如果您注意到,SciPy使用与NumPy相同的linalg
函数.
# SciPy
import scipy
norm_vector1 = scipy.linalg.norm(vector1, ord=2)
print("L2 norm in scipy for vector1:", norm_vector1)
norm_vector2 = scipy.linalg.norm(vector2, ord=2)
print("L2 norm in scipy for vector2:", norm_vector2)
输出:
L2 norm in scipy for vector1: 7.615773105863909
L2 norm in scipy for vector2: 5.385164807134504
Scikit-Learn
正如Scikit-learn文档所述:
Scikit-learn
是一个开源的机器学习库,支持监督学习和非监督学习。它还提供了多种工具用于模型拟合、数据预处理、模型选择、模型评估以及许多其他实用功能。
我们将向量重塑为Scikit-learn
期望的二维形式。
# Sklearn
from sklearn.metrics.pairwise import euclidean_distances
vector1_reshape = vector1.reshape(1,-1)
## Scikit-learn 要求向量为二维
euclidean_distances(vector1_reshape, [[0, 0]])[0,0]
输出
7.615773105863909
TensorFlow
TensorFlow 是一个端到端的机器学习平台。
# TensorFlow
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
## Tensorflow 期望张量类型为 float32, float64, complex64, complex128
vector1_tf = vector1.astype(np.float64)
tf_norm = tf.norm(vector1_tf, ord=2)
print("Euclidean(l2) norm in TensorFlow:",tf_norm.numpy())
输出
输出打印了TensorFlow的版本及L2范数:
TensorFlow version: 2.15.0
Euclidean(l2) norm in TensorFlow: 7.615773105863909
PyTorch
PyTorch 是一个针对GPU和CPU优化的深度学习张量库。
# PyTorch
import torch
print("PyTorch version:", torch.__version__)
norm_torch = torch.linalg.norm(torch.from_numpy(vector1_tf), ord=2)
norm_torch.item()
输出打印了PyTorch版本及范数:
PyTorch version: 2.1.2
7.615773105863909
欧氏距离
欧氏距离的计算方式与范数类似,只是你在将差异传递给相应的库之前,先计算向量之间的差异——在本例中为vector_diff
。
# 向量之间的欧氏距离
import math
vector_diff = vector1 - vector2
# 使用范数计算
euclidean_distance = np.linalg.norm(vector_diff, ord=2)
print(euclidean_distance)
# 使用点积计算
norm_dot = math.sqrt(np.dot(vector_diff.T,vector_diff))
print(norm_dot)
输出
使用NumPy库中的norm和dot函数输出结果:
5.385164807134504
5.385164807134504
# SciPy
from scipy.spatial import distance
distance.euclidean(vector1,vector2)
使用SciPy输出
5.385164807134504
包含输出结果的Jupyter Notebook可在GitHub仓库中获取。您可以按照GitHub仓库中的指南,在Colab上运行该Jupyter Notebook。
Source:
https://dzone.com/articles/norm-of-a-one-dimensional-tensor-in-python-libraries