向量是线性代数的基础元素。
在机器学习领域中,向量被广泛用于算法和过程的描述,例如在训练算法时的目标变量 (y)。
在本教程中,您将了解机器学习的线性代数向量。
完成本教程后,您将了解:
- 什么是向量,以及如何使用 Python 中的 NumPy 定义向量。
- 如何执行向量算术运算,例如加法、减法、乘法和除法。
- 如何执行其他操作,例如点积和与标量相乘。
通过我的新书《机器学习线性代数》启动您的项目,其中包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

机器学习向量简介
图片由 Lachlan Donald 拍摄,保留部分权利。
教程概述
本教程分为5个部分,它们是:
- 什么是向量?
- 定义向量
- 向量算术
- 向量点积
- 向量-标量乘法
在机器学习线性代数方面需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
什么是向量?
向量是包含一个或多个称为标量的值的元组。
向量由分量构成,这些分量是普通数字。您可以将向量视为一个数字列表,而向量代数则是对列表中数字执行的操作。
— 第 69 页,《线性代数无废话指南》,2017 年
向量通常用小写字符表示,例如“v”;例如:
1 |
v = (v1, v2, v3) |
其中 v1、v2、v3 是标量值,通常是实数值。
向量也以垂直表示或列的形式显示;例如:
1 2 3 |
v1 v = ( v2 ) v3 |
在描述机器学习算法的训练时,通常将目标变量表示为小写“y”的向量。
通常使用几何类比来引入向量,其中向量表示 n 维空间中的一个点或坐标,n 是维数,例如 2。
向量也可以被认为是向量空间原点出发的一条线,具有方向和大小。
这些类比是一个很好的起点,但不应过于拘泥,因为我们在机器学习中经常考虑非常高维的向量。我发现“向量即坐标”在机器学习中最具说服力。
既然我们知道了什么是向量,那么我们来看看如何在 Python 中定义一个向量。
定义向量
我们可以在 Python 中将向量表示为 NumPy 数组。
NumPy 数组可以从数字列表创建。例如,下面我们定义了一个长度为 3,整数值为 1、2 和 3 的向量。
1 2 3 4 |
# 创建一个向量 from numpy import array v = array([1, 2, 3]) print(v) |
该示例定义了一个包含 3 个元素的向量。
运行该示例将打印出定义的向量。
1 |
[1 2 3] |
向量算术
在本节中,我们将演示简单的向量-向量算术,其中所有操作都在两个等长向量之间逐元素执行,从而生成一个具有相同长度的新向量。
向量加法
两个等长的向量可以相加,生成一个新的第三个向量。
1 |
c = a + b |
新向量与另外两个向量具有相同的长度。新向量的每个元素都是通过将另外两个向量相同索引处的元素相加计算得出的;例如:
1 |
a + b = (a1 + b1, a2 + b2, a3 + b3) |
或者,换句话说:
1 2 3 |
c[0] = a[0] + b[0] c[1] = a[1] + b[1] c[2] = a[2] + b[2] |
我们可以通过在 Python 中添加 NumPy 数组来直接添加向量。
1 2 3 4 5 6 7 8 |
# 添加向量 from numpy import array a = array([1, 2, 3]) print(a) b = array([1, 2, 3]) print(b) c = a + b print(c) |
该示例定义了两个各含三个元素的向量,然后将它们相加。
运行示例首先打印两个父向量,然后打印一个新向量,该向量是两个向量的和。
1 2 3 4 5 |
[1 2 3] [1 2 3] [2 4 6] |
向量减法
一个向量可以从另一个等长向量中减去,从而生成一个新的第三个向量。
1 |
c = a - b |
与加法类似,新向量与父向量具有相同的长度,并且新向量的每个元素都是通过减去相同索引处的元素来计算的。
1 |
a - b = (a1 - b1, a2 - b2, a3 - b3) |
或者,换句话说:
1 2 3 |
c[0] = a[0] - b[0] c[1] = a[1] - b[1] c[2] = a[2] - b[2] |
NumPy 数组可以在 Python 中直接相减。
1 2 3 4 5 6 7 8 |
# 向量相减 from numpy import array a = array([1, 2, 3]) print(a) b = array([0.5, 0.5, 0.5]) print(b) c = a - b print(c) |
该示例定义了两个各含三个元素的向量,然后从第一个中减去第二个。
运行示例首先打印两个父向量,然后打印新向量,该向量是第一个减去第二个的结果。
1 2 3 4 5 |
[1 2 3] [ 0.5 0.5 0.5] [ 0.5 1.5 2.5] |
向量乘法
两个等长向量可以相乘。
1 |
c = a * b |
与加法和减法一样,此操作是逐元素执行的,结果是一个相同长度的新向量。
1 |
a * b = (a1 * b1, a2 * b2, a3 * b3) |
或者
1 |
ab = (a1b1, a2b2, a3b3) |
或者,换句话说:
1 2 3 |
c[0] = a[0] * b[0] c[1] = a[1] * b[1] c[2] = a[2] * b[2] |
我们可以直接在 NumPy 中执行此操作。
1 2 3 4 5 6 7 8 |
# 向量乘法 from numpy import array a = array([1, 2, 3]) print(a) b = array([1, 2, 3]) print(b) c = a * b print(c) |
该示例定义了两个各含三个元素的向量,然后将这些向量相乘。
运行示例首先打印两个父向量,然后打印新向量。
1 2 3 4 5 |
[1 2 3] [1 2 3] [1 4 9] |
向量除法
两个等长向量可以相除。
1 |
c = a / b |
与其他算术运算一样,此操作是逐元素执行的,结果是一个相同长度的新向量。
1 |
a / b = (a1 / b1, a2 / b2, a3 / b3) |
或者
1 |
a / b = (a1b1, a2b2, a3b3) |
或者,换句话说:
1 2 3 |
c[0] = a[0] / b[0] c[1] = a[1] / b[1] c[2] = a[2] / b[2] |
我们可以直接在 NumPy 中执行此操作。
1 2 3 4 5 6 7 8 |
# 向量除法 from numpy import array a = array([1, 2, 3]) print(a) b = array([1, 2, 3]) print(b) c = a / b print(c) |
该示例定义了两个各含三个元素的向量,然后用第一个除以第二个。
运行示例首先打印两个父向量,然后是向量除法的结果。
1 2 3 4 5 |
[1 2 3] [1 2 3] [ 1. 1. 1.] |
向量点积
我们可以计算两个等长向量的元素乘积之和,得到一个标量。
这被称为点积,因描述此操作时使用的点运算符而得名。
点积是计算向量投影、向量分解和确定正交性的关键工具。点积的名称来源于用来表示它的符号。
— 第 110 页,《线性代数无废话指南》,2017 年
1 |
c = a . b |
该操作可用于机器学习中计算向量的加权和。
点积的计算方法如下:
1 |
a . b = (a1 * b1 + a2 * b2 + a3 * b3) |
或者
1 |
a . b = (a1b1 + a2b2 + a3b3) |
我们可以在 Python 中使用 NumPy 数组的 `dot()` 函数来计算两个向量之间的点积。自 Python 3.5 版本以来,也可以使用更新的 `@` 运算符进行计算。下面的示例演示了这两种方法。
1 2 3 4 5 6 7 8 9 10 |
# 向量点积 from numpy import array a = array([1, 2, 3]) print(a) b = array([1, 2, 3]) print(b) c = a.dot(b) print(c) d = a @ b print(d) |
该示例定义了两个各含三个元素的向量,然后计算点积。
运行示例首先打印两个父向量,然后是标量点积。
1 2 3 4 5 6 7 |
[1 2 3] [1 2 3] 14 14 |
向量-标量乘法
向量可以乘以一个标量,有效地缩放向量的幅值。
为保持符号简洁,我们将使用小写字母“s”表示标量值。
1 |
c = s * v |
或者
1 |
c = sv |
乘法作用于向量的每个元素,结果是一个相同长度的新标量向量。
1 |
s * v = (s * v1, s * v2, s * v3) |
或者,换句话说:
1 2 3 |
c[0] = a[0] * s c[1] = a[1] * s c[2] = a[2] * s |
我们可以直接使用 NumPy 数组执行此操作。
1 2 3 4 5 6 7 8 |
# 向量-标量乘法 from numpy import array a = array([1, 2, 3]) print(a) s = 0.5 print(s) c = s * a print(c) |
该示例首先定义向量和标量,然后将向量乘以标量。
运行示例首先打印父向量,然后是标量,最后是两者相乘的结果。
1 2 3 4 5 |
[1 2 3] 0.5 [ 0.5 1. 1.5] |
同样,向量-标量加法、减法和除法也可以用相同的方式执行。
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 使用您自己的数据,为每个操作创建 5 个示例。
- 手动实现定义为列表的向量的每个向量运算。
- 搜索机器学习论文,并找到每个操作被使用的一个例子。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 第 1.15 节,向量。《线性代数无废话指南》,2017 年。
- 第 2.2 节,向量运算。《线性代数无废话指南》,2017 年。
- 线性代数导论, 2016.
- 第 2 章,线性代数,《深度学习》,2016 年。
API
文章
总结
在本教程中,您学习了机器学习的线性代数向量。
具体来说,你学到了:
- 什么是向量,以及如何使用 Python 中的 NumPy 定义向量。
- 如何执行向量算术运算,例如加法、减法、乘法和除法。
- 如何执行其他操作,例如点积和与标量相乘。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
那么如何确定一个向量来帮助分类呢?
Edward,你具体是什么意思?
当您有一个特征向量并被要求确定该向量时,这意味着什么?
如果您有一个特征向量,它可以通过模型进行分类。
特征向量只是一行,其中每个值都是不同特征或列的度量。
这有帮助吗?
向量加法在机器学习中意味着什么?
我有两个包含特征的向量,我可以使用向量加法将两个特征保存在单个向量中吗?
将两个向量相加。
通常我们不会将特征相加,除非它在领域中具有特定含义,例如两者都是某个更大的 n 维空间中的坐标。
我们可以使用向量算术或 GAN 潜在空间来探索嵌入。
你用 SageMaker 的数据处理过向量吗?我的数据是 numpy 数组,但我收到的错误消息是标签必须是向量。
我没有用过 SageMaker,抱歉。
非常清楚,谢谢!
谢谢,很高兴对您有帮助。
谢谢
Jason Brownlee 讲解得非常好。
不客气,Aminzai。
嗨,据我所知,对于文本分类,我们需要一些特征,并且是否根据特定的老师来向量化每个句子,这取决于我们自己,对吗?
我的意思是,我们应该编写合适的程序,根据我们的特征将每个句子转换为向量,对吗?
##我修正了我的问题,先生
嗨,据我所知,对于文本分类,我们需要一些特征,并且是否根据特定的特征将每个句子向量化,这取决于我们自己,对吗?
我的意思是,我们应该编写合适的程序,根据我们的特征将每个句子转换为向量,对吗?
对于特征 1,我们应该编写一个程序来将我们的句子表示为向量,而对于特征 2,我们应该考虑另一段代码来将我们的句子表示为向量,是吗?
你可以使用词袋模型
https://machinelearning.org.cn/gentle-introduction-bag-words-model/
我一直在寻找类似的教程很长时间,现在我找到了。真诚地感谢您。
谢谢!
就像我们有一个特征向量一样,我们是否也可以有一个响应向量?如果可以,那它会包含什么呢?
是的。
您可以为您的项目定义特征向量和目标向量的构成。
我对线性代数一窍不通,但这个解释让我完全明白了。感谢您简单、清晰、简洁的解释。
不客气。
解释太棒了!!很容易理解。
谢谢!
很好的解释。谢谢!
谢谢!
我用列表编写的向量算术运算代码。我知道它并不完美。
我忘了补充
导入模块后,您应该添加一行
Vector = List[float]
我已经为你添加了。
做得好,谢谢分享!
对两个向量应用点积的直觉是什么?例如,为什么我们在基于内容的过滤(推荐系统)中对项目向量和用户向量应用点积?
嗨,Maanas……以下将是一个很好的地方来澄清您的理解:
https://machinelearning.org.cn/linear-algebra-machine-learning-7-day-mini-course/
你好。你能解释一下参考向量的概念吗?我看到 Kohonen 自组织图中提到了它,但我无法理解。
嗨,Guillermo……以下是关于向量及其在机器学习中的作用的很好的起点。
https://neptune.ai/blog/understanding-vectors-from-a-machine-learning-perspective