向量范数的计算在人工智能和量子计算中都至关重要 用于诸如特征缩放、正则化、距离等任务度量、收敛标准、表示量子态、确保运算的统一性、纠错以及设计量子算法和电路。

您将在 Python 库,例如 NumPy、 SciPy、Scikit-LearnTensorFlowPyTorch

了解范数与距离

在开始之前,我们先了解一下欧几里德范数与欧几里德距离之间的区别。

  • 范数是向量距原点 (0,0) 的距离/长度/大小。
  • 距离是两个向量之间的距离/长度/大小。
  • 先决条件

    • 安装 Jupyter
    • 在 Jupyter Notebook 中运行以下代码以安装先决条件。
    Python

     

    # 安装运行笔记本的先决条件
    !pip 安装 numpy
    !pip 安装 scipy
    %pip 安装火炬
    !pip 安装tensorflow

    您将使用 Jupyter Notebook 运行 Python 代码单元来计算不同 Python 库中的 L2 范数。

    让我们开始吧

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

    NumPy

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

    张量排名

    张量秩

    Python

     

    # 定义一维(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 来绘制向量。

    Python

     

    # 使用 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()

    使用 Maplotlib 的矢量表示

    使用 Matplolib 的矢量表示

    Python

     

    # 向量的 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 函数。

    Python

     

    # 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 文档所述:
    <块引用>

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

    我们重塑向量,因为 Scikit-learn 期望向量是二维的。

    Python

     

    # 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 是一个端到端机器学习平台。

    Python

     

    # 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 进行深度学习。

    Python

     

    # PyTorch
    进口火炬
    print("PyTorch 版本:", torch.__version__)
    
    norm_torch = torch.linalg.norm(torch.from_numpy(vector1_tf), ord=2)
    norm_torch.item()

    输出打印 PyTorch 版本和规范:

    纯文本

     

    PyTorch 版本:2.1.2 7.615773105863909

    欧几里德距离

    欧几里得距离的计算方式与范数相同,不同之处在于您在将差异 – vector_diff(在本例中)传递到各自的库之前计算向量之间的差异。

    Python

     

    # 向量之间的欧氏距离 导入数学 向量_差异 = 向量 1 - 向量 2 # 使用范数 欧氏距离 = np.linalg.norm(vector_diff, ord=2) 打印(欧几里德距离) # 使用点积 norm_dot = math.sqrt(np.dot(vector_diff.T,vector_diff)) 打印(norm_dot)

    输出

    使用 NumPy 库的范数和点函数进行输出:

    纯文本

     

    5.385164807134504
    5.385164807134504

    Python

     

    # SciPy
    从 scipy.spatial 导入距离
    distance.euclidean(向量1,向量2)

    使用 SciPy 输出

    <前>5.385164807134504

    包含输出的 Jupyter Notebook 可在 GitHub 存储库。您可以按照 GitHub 存储库上的说明在 Colab 上运行 Jupyter Notebook。

    Comments are closed.