计算向量的长度或大小通常是必需的,无论是直接作为机器学习中的正则化方法,还是作为更广泛的向量或矩阵操作的一部分。
在本教程中,您将了解计算向量长度或大小(称为向量范数)的不同方法。
完成本教程后,您将了解:
- L1 范数是向量绝对值之和。
- L2 范数是向量平方值之和的平方根。
- 最大范数是向量最大值。
通过我的新书《机器学习线性代数》启动您的项目,包括分步教程和所有示例的Python 源代码文件。
让我们开始吧。
- 2018年3月更新:修正了最大范数方程中的拼写错误。
- 2018年9月更新:修正了与所定义向量大小相关的拼写错误。

机器学习中向量范数简介
图片由Cosimo拍摄,部分权利保留。
教程概述
本教程分为4个部分,它们是:
- 向量范数
- 向量L1范数
- 向量L2范数
- 向量最大范数
在机器学习线性代数方面需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
向量范数
计算向量的大小或长度通常是必需的,无论是直接计算还是作为更广泛的向量或向量矩阵操作的一部分。
向量的长度被称为向量范数或向量的模。
向量的长度是一个非负数,它描述了向量在空间中的范围,有时被称为向量的模或范数。
——第112页,《线性代数无废话指南》,2017年
向量的长度总是正数,除了所有元素都为零的向量。它是通过某种度量来计算的,该度量总结了向量到向量空间原点的距离。例如,一个具有3个元素的向量的向量空间原点是(0, 0, 0)。
符号用于在更广泛的计算中表示向量范数,并且向量范数计算的类型几乎总是有其自己独特的符号。
我们将看看机器学习中使用的几种常见向量范数计算。
向量L1范数
向量的长度可以使用L1范数来计算,其中1是L的上标,例如L^1。
向量L1范数的记号是||v||1,其中1是下标。因此,这个长度有时被称为出租车范数或曼哈顿范数。
1 |
l1(v) = ||v||1 |
L1范数被计算为向量绝对值的和,其中标量的绝对值使用符号|a1|。实际上,该范数是计算从向量空间原点到曼哈顿距离的量度。
1 |
||v||1 = |a1| + |a2| + |a3| |
向量的L1范数可以使用NumPy中的norm()函数计算,并带有一个参数来指定范数阶数,在此例中为1。
1 2 3 4 5 6 7 |
# 向量的L1范数 from numpy import array from numpy.linalg import norm a = array([1, 2, 3]) print(a) l1 = norm(a, 1) print(l1) |
首先,定义了一个1×3的向量,然后计算该向量的L1范数。
运行示例首先打印定义的向量,然后打印向量的L1范数。
1 2 3 |
[1 2 3] 6.0 |
L1范数通常在拟合机器学习算法时用作正则化方法,例如,一种保持模型系数较小,进而使模型复杂度降低的方法。
向量L2范数
向量的长度可以使用L2范数来计算,其中2是L的上标,例如L^2。
向量L2范数的记号是||v||2,其中2是下标。
1 |
l2(v) = ||v||2 |
L2范数计算向量坐标到向量空间原点的距离。因此,它也被称为欧几里得范数,因为它计算的是到原点的欧几里得距离。结果是一个正的距离值。
L2范数是向量平方值之和的平方根。
1 |
||v||2 = sqrt(a1^2 + a2^2 + a3^2) |
向量的L2范数可以使用NumPy中的norm()函数和默认参数来计算。
1 2 3 4 5 6 7 |
# 向量的L2范数 from numpy import array from numpy.linalg import norm a = array([1, 2, 3]) print(a) l2 = norm(a) print(l2) |
首先,定义了一个1×3的向量,然后计算该向量的L2范数。
运行示例首先打印定义的向量,然后打印向量的L2范数。
1 2 3 |
[1 2 3] 3.74165738677 |
与L1范数类似,L2范数通常在拟合机器学习算法时用作正则化方法,例如,一种保持模型系数较小,进而使模型复杂度降低的方法。
迄今为止,L2范数在机器学习中比其他向量范数更常用。
向量最大范数
向量的长度可以使用最大范数来计算,也称为最大范数。
向量的最大范数被称为L^inf,其中inf是上标,可以用无穷大符号表示。最大范数的记号是||x||inf,其中inf是下标。
1 |
maxnorm(v) = ||v||inf |
最大范数被计算为返回向量的最大值,因此得名。
1 |
||v||inf = max(|a1|, |a2|, |a3|) |
向量的最大范数可以使用NumPy中的norm()函数,并将order参数设置为inf来计算。
1 2 3 4 5 6 7 8 |
# 向量的最大范数 from numpy import inf from numpy import array from numpy.linalg import norm a = array([1, 2, 3]) print(a) maxnorm = norm(a, inf) print(maxnorm) |
首先,定义了一个1×3的向量,然后计算该向量的最大范数。
运行示例首先打印定义的向量,然后打印向量的最大范数。
1 2 3 |
[1 2 3] 3.0 |
最大范数也用作机器学习中的正则化方法,例如在神经网络权重上的正则化,称为最大范数正则化。
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 使用您自己的数据,为每个操作创建 5 个示例。
- 手动实现每个矩阵操作,用于定义为列表的列表的矩阵。
- 搜索机器学习论文,并找到每个操作被使用的一个例子。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
API
文章
总结
在本教程中,您学习了计算向量长度或大小的不同方法,称为向量范数。
具体来说,你学到了:
- L1 范数是向量绝对值之和。
- L2 范数是向量平方值之和的平方根。
- 最大范数是向量最大值。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
嗨,Jason,
我有一个问题,为什么它们是L1和L2。还有L3、L4等更多范数吗?
如果是这样,为什么我们只在机器学习中使用L1/L2范数?
这是否与我们在优化时使用误差的平方而不是误差的绝对值来最小化有关?
对不起,我不能立刻说出这些名称的原因。
是的,mse有很好的数学特性。
你好 Hari,
0、1 和 2 范数只是最常用的情况,但存在无限多的范数。
形式上,l_p 范数定义为 \left \| x \right \|_p = \sqrt[p]{\sum_{i}\left | x_i \right |^p},其中 p \epsilon \mathbb{R}
L2 范数之所以得名,是因为您计算向量/矩阵/张量中元素的平方和。L3 是单个元素立方体的和,依此类推。L1 是单个元素绝对值的和。它们都是 L_p 范数(通过将每个单个元素提升到 p 次幂并求和计算)的表现形式,正如 Daniel 所提到的。
我认为这可以更详细,例如提供实际公式。
比如
当 p=1 时,L1 实际上是求和 {x1^p + x2^p + x3^p … xn^p } ^ 1/p。
只是几个建议,以增加清晰度。
在撰写L1范数时,这句话似乎没有必要
“向量的L2范数可以使用NumPy中的norm()函数计算,并带有一个参数来指定范数阶数,在此例中为1。”
另外,尽管在实际编程中我不会这样做,但Python编程示例中的“l”在l1、l2中最好用大写字母L1、L2表示。
谢谢拉塞尔!
未解释最大范数的计算。
它是否正在获取向量点[1, 0, 0]、[0, 2, 0]和[0, 0, 3],并找到稀疏向量中最大的向量?
谢谢你的解释,
我的问题是如何计算准范数,例如L(0.5)
找到向量范数(向量长度 – 向量模)的不同方法是L1、L2和L inf。难道同一个向量的向量范数不应该相同吗?
不,计算长度的方法有很多种。
那么我们如何从向量的模和方向中找到向量的分量呢?通常在这种情况下我们使用欧几里得函数。我感到困惑。
我的困惑已经消除了。谢谢你
很高兴听到。
只是想知道!为什么我们需要在机器学习中将向量转换为单位范数?这背后的原因是什么?另外,我正在查看股票运动数据集中的预处理示例,作者使用了preprocessing.normalizer(norm='l2')。这背后有什么特殊原因吗?它与数据的稀疏性有关吗?抱歉问题太多。
我们这样做是为了在学习(优化)机器学习模型时保持向量中的值较小,这反过来会降低模型的复杂性并产生更好的模型(更好的泛化)。
文本中说“定义了一个3×3向量”,但您的代码定义了一个1×3向量:[1,2,3]。您可以更正您的文本吗?
谢谢,已修复!
很棒的文章。喜欢这个网站。
谢谢克里斯!
如何计算3D矩阵的L1和L2范数?
例如
input_shape = (10, 20, 3)
a = np.ones(input_shape) * 2
b = np.ones(input_shape) * 4
x = a – b
l1_norm_of_x = ????
l2_norm_of_x = ????
矩阵的范数是弗罗贝尼乌斯范数
https://zh.wikipedia.org/wiki/矩阵范数#弗罗贝尼乌斯范数
有没有决定一个问题使用哪种距离度量的经验法则?
是的,我见过一些。这主要取决于你想要的结果——例如,你希望在度量中捕获/处理/促进什么。
我读到L1范数比L2范数更能捕捉模型系数的小变化,L2范数在原点附近增加得很慢,我没有明白为什么?
也许可以问向您作出此声明的人,以确切了解他们的意思?
因为对于任何正数 x <1,您都会看到 x^2 (L2) < 1,x^2 > x
我清楚地理解了范数,但想了解它在机器学习和神经网络中使用的幕后原理。您能详细解释一下它在归一化中是如何使用的吗?
先谢谢您了。
当然,这篇文章展示了如何实现:
https://machinelearning.org.cn/how-to-reduce-overfitting-in-deep-learning-with-weight-regularization/
嗨,Jason,
我很好奇L2是否像斜边一样?
你在这个页面上发布的MATLAB操作窗口是否使用了MATLAB?
代码示例都是用Python编写的。
我对以上练习的解决方案。一如既往的精彩文章。
感谢分享!
你好,我有一个4*9的稀疏矩阵,在应用Fit和Transform函数后(我是机器学习新手),现在我需要在上述矩阵上实现L2范数,但是当我尝试使用你的方法时,它没有按预期工作,输出是(L2范数之外的第一行)
(0, 3) 1
(0, 6) 1
(0, 8) 1
(0, 2) 1
但它应该是 (0, 8) 0.38408524091481483
(0, 6) 0.38408524091481483
(0, 3) 0.38408524091481483
(0, 2) 0.5802858236844359
我哪里做错了?我应该如何解决我的矩阵问题?
下面是作为参考的密集矩阵
[[0 1 1 1 0 0 1 0 1]
[0 2 0 1 0 1 1 0 1]
[1 0 0 1 1 0 1 1 1]
[0 1 1 1 0 0 1 0 1]]
也许可以先将其转换为密集矩阵
https://machinelearning.org.cn/sparse-matrices-for-machine-learning/
你好,先生,
我想知道是否有人可以在深度哈希损失函数中使用向量最大范数?因为一些研究人员在他们的损失函数中使用了L2范数。谢谢
我不知道,抱歉。
||W|| = 1。
这是什么意思???
你好 Efran,
这意味着向量的“范数”或大小是长度为1。更多示例和解释可以在这里找到:
http://mathonline.wikidot.com/the-norm-of-a-vector
此致,
向量需要是单位向量才能使用L1/L2范数吗?
如果是,那为什么呢?
你好 Kartik…不。这些用于确定向量的“长度”或大小。一旦确定,它们可以用于创建单位向量
https://www.cuemath.com/calculus/unit-vector/
你好 Jason,我喜欢你的博客!我开始用 C++ 尝试机器学习。关于 L1 和 L2 归一化,这些值是否只是按比例缩放(alpha 和 beta)并在算法的梯度下降阶段应用?我尝试了以下代码,但只有当 alpha 和 beta 等于 0.0 时才能收敛到解决方案。如果我的范数位置正确,那么 alpha 和 beta 通常取什么大小?谢谢,Ben。
W[i][j] -= learning_rate * dW[i][j] – alpha*L1_norm – beta*L2_norm;
你好 Ben…您可能会发现以下内容有所帮助
https://towardsdatascience.com/l1-and-l2-regularization-methods-ce25e7fc831c
这个网站在学习神经网络时简直是金矿,非常感谢你们的帮助!
很棒的反馈 Mathias!
你好 Jason。我通过这篇文章很好地理解了L1范数和L2范数。我想知道什么是L2,1范数?
你好 Vaishali…以下资源可能会增加清晰度
https://ai.stackexchange.com/questions/17304/what-is-the-ell-2-1-norm
虽然这个问题与本文无关,但我仍会感谢您的回答。在混合模型中描述特定概率时何时使用分号(;)?谢谢。
你好 spike…以下资源是一个出色的参考资料
https://scholarworks.umass.edu/cgi/viewcontent.cgi?article=3475&context=dissertations_2