如何在Python中计算L1和L2范数?

各位读者大家好!在本教程中,我们将学习如何计算各种形式的向量范数。向量的长度或大小称为范数。有多种计算长度的方法。向量的范数是非负数。

向量的 L1 范数

L1 范数也称为曼哈顿距离或出租车范数。空间中向量的幅值之和就是 L1 范数。它用 ||x|| 表示 (其中 x 是向量),这是测量向量之间距离的最直接的方法,因为它是向量分量的绝对差的总和。所有向量分量在此范数中均等加权。

请参阅下图以可视化向量 x = (-7,5) 的 L1 范数

L1标准

如图所示,L1 范数是起点 (0,0) 和终点 (-7,5) 之间的“距离”。||x|| =|-7| + |5| = 12 是 x 的 L1 范数。

在Python中实现L1范数

现在让我们使用 Python 中的 NumPy 库实现 L1 范数。我们将从导入np.linalg模块开始并声明我们的向量 = [-8, 6, 0, -15]。

1
2
3
4
5
6
7
8
from numpy.linalg import norm
 
x = [-8, 6, 0, -15]
print("Example vector:", x)
 
#calculate l1 norm
l1 = norm(x ,1)
print("L1 norm =", l1)

我们从 np.linalg 模块导入了范数函数来计算向量的范数。对于 L1 范数,我们传递了一个附加参数 1,它表示要计算 L1 范数。如果没有给出附加参数,默认情况下,norm() 计算向量的 L2 范数。

输出:

1
2
Example vector: [ -8   6   0 -15]
L1 norm = 29.0

结果包含向量的 L1 范数 |-8|+|6|+|0|+|-15| = 29.0

向量的 L2 范数

L2范数,也称为欧几里得范数,有些人也使用术语“ 2范数”,它是欧几里得空间中向量大小的度量。它被定义为向量各个元素的平方和的平方根。表示为 ||x|| 2 . L2 范数广泛应用于机器学习、工程和物理学等许多领域,用于各种应用,包括优化、正则化和归一化。请参阅下图以可视化向量 x = (7,5) 的 L2 范数

L2范数

如图所示,L2 范数是起点 (0,0) 和目的地 (7,5) 之间的直接距离。||x|| 2 = sqrt(|7| 2 + |5| 2 ) = 8.60 是 x 的 L2 范数。

在Python中实现L2范数

variable x我们将使用相同的方法计算 L2 范数np.linalg,但这次我们在传递向量时不会向函数norm() 提供任何额外的参数。

1
2
3
4
5
6
from numpy.linalg import norm
 
x = [-8, 6, 0, -15]
print("Example vector:", x)
l2 = norm(x)
print("L2 norm =","%.2f" % l2)

我们过去常常"%.2f" % l1将结果四舍五入到小数点后两位。

另请阅读:在 Python 中处理精度值的 5 种方法

输出:

1
2
Example vector: [ -8   6   0 -15]
L2 norm = 18.03

输出包含向量 x 的 L2 范数,计算公式为:

  • ||x|| 2 = sqrt(|-8| 2 + |6| 2 +|0| 2 + |-15| 2 )
  • ||x|| 2 = 开方(64+36+0+225) = 开方(325)
  • ||x|| 2 = 18.02

请注意,L2 范数总是小于或等于 L1 范数

结论

在本教程中,我们介绍了 L1 和 L2 规范的基础知识以及与之相关的不同术语。我们还学习了如何使用 python 中的 numpy 库计算范数。numpy 中的模块np.linalg提供了几个用于线性代数计算的函数,包括向量范数的计算。通过使用norm中的函数np.linalg,我们可以轻松计算给定向量的 L1 或 L2 范数。

值得注意的是,所使用的范数的选择取决于具体的应用和解决方案所需的属性。L1 范数通常用于需要对异常值不敏感的稳健解决方案的情况,而 L2 范数通常用于需要更平滑且更可预测的解决方案的情况。

另请阅读:如何用 Python 计算距离?[ 简单的分步指南 ]

参考

Numpy 线性代数库:https://numpy.org/doc/stable/reference/routines.linalg.html