Python库中一维张量的范数计算

向量范数的计算在人工智能和量子计算中至关重要,应用于特征缩放、正则化、距离度量、收敛准则、量子态表示、操作的幺正性保障、错误校正以及量子算法与电路设计等任务。

你将学习如何使用Python中的NumPy、SciPy、Scikit-LearnTensorFlowPyTorch等库计算一维(1D)张量的欧几里得范数(距离),即L2范数。

理解范数与距离的区别

在开始之前,我们先区分欧几里得范数与欧几里得距离的概念。

  1. 范数是指向量从原点(0,0)出发的距离/长度/大小。
  2. 而距离则是指两个向量之间的距离/长度/大小。

预备知识

  • 安装Jupyter.
  • 在Jupyter Notebook中运行以下代码以安装必要的依赖项.
Python

 

# 安装运行笔记本所需的预先条件
!pip install numpy
!pip install scipy
%pip install torch
!pip install tensorflow

您将使用Jupyter Notebook运行Python代码单元格,以在不同的Python库中计算L2范数.

让我们开始吧

现在您已经在您的机器上设置了Jupyter并安装了所需的Python库,让我们开始使用NumPy定义一个一维张量.

NumPy

NumPy是一个用于科学计算的Python库. NumPy提供了一个多维数组和其他派生对象.

张量秩

Python

 

# 定义一个单维(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)

打印向量

Plain Text

 

Vector 1: [3 7]
Vector 2: [5 2]
shape & size of Vector1 & Vector2: (2,) 2

Matplotlib

Matplotlib是一个用于创建静态、动画和交互式可视化的Python可视化库. 您将使用Matplotlib的quiver来绘制向量.

Python

 

# 使用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的向量表示

Python

 

# 向量的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中运行此代码后的输出:

Plain Text

 

The magnitude / distance from the origin 7.615773105863909
The magnitude / distance from the origin 5.385164807134504

SciPy

SciPy基于NumPy构建,用于数学计算. 如果您注意到,SciPy使用与NumPy相同的linalg函数.

Python

 

# 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)

输出:

Plain Text

 

L2 norm in scipy for vector1: 7.615773105863909
L2 norm in scipy for vector2: 5.385164807134504

Scikit-Learn

正如Scikit-learn文档所述:

Scikit-learn是一个开源的机器学习库,支持监督学习和非监督学习。它还提供了多种工具用于模型拟合、数据预处理、模型选择、模型评估以及许多其他实用功能。

我们将向量重塑为Scikit-learn期望的二维形式。

Python

 

# Sklearn
from sklearn.metrics.pairwise import euclidean_distances
vector1_reshape = vector1.reshape(1,-1)
## Scikit-learn 要求向量为二维
euclidean_distances(vector1_reshape, [[0, 0]])[0,0]

输出

Plain Text

 

7.615773105863909

TensorFlow

TensorFlow 是一个端到端的机器学习平台。

Python

 

# 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范数:

Plain Text

 

TensorFlow version: 2.15.0
Euclidean(l2) norm in TensorFlow: 7.615773105863909

PyTorch

PyTorch 是一个针对GPU和CPU优化的深度学习张量库。

Python

 

# PyTorch
import torch
print("PyTorch version:", torch.__version__)

norm_torch = torch.linalg.norm(torch.from_numpy(vector1_tf), ord=2)
norm_torch.item()

输出打印了PyTorch版本及范数:

Plain Text

 

PyTorch version: 2.1.2

7.615773105863909

欧氏距离

欧氏距离的计算方式与范数类似,只是你在将差异传递给相应的库之前,先计算向量之间的差异——在本例中为vector_diff

Python

 

# 向量之间的欧氏距离
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函数输出结果:

Plain Text

 

5.385164807134504
5.385164807134504

Python

 

# 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