Argmax 是您在应用机器学习中可能会遇到的一个数学函数。
例如,您可能会在研究论文中看到“argmax”或“arg max”用于描述某个算法。您也可能被指示在算法实现中使用 argmax 函数。
这可能是您第一次接触 argmax 函数,您可能想知道它是什么以及它是如何工作的。
在本教程中,您将了解 argmax 函数及其在机器学习中的用途。
完成本教程后,您将了解:
- Argmax 是一个查找给定目标函数能产生最大值的参数的操作。
- Argmax 在机器学习中最常用于查找具有最大预测概率的类别。
- Argmax 可以手动实现,尽管在实践中更倾向于使用 NumPy 的 argmax() 函数。
快速开始您的项目,阅读我的新书《机器学习线性代数》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

机器学习中的 argmax 是什么?
照片由 Bernard Spragg. NZ 拍摄,部分权利保留。
教程概述
本教程分为三个部分;它们是:
- Argmax 是什么?
- Argmax 在机器学习中如何使用?
- 如何在 Python 中实现 Argmax
Argmax 是什么?
Argmax 是一个数学函数。
它通常应用于另一个接受参数的函数。例如,给定一个接受参数 x 的函数 g(),该函数的 argmax 操作可以描述如下:
- result = argmax(g(x))
argmax 函数返回目标函数(arg)能够产生最大值(max)的参数或参数(arg)。
考虑一个例子,其中 g(x) 计算为 x 值的平方,并且输入值(x)的域或范围限制为 1 到 5 的整数。
- g(1) = 1^2 = 1
- g(2) = 2^2 = 4
- g(3) = 3^2 = 9
- g(4) = 4^2 = 16
- g(5) = 5^2 = 25
我们可以直观地看出,函数 g(x) 的 argmax 是 5。
也就是说,传递给目标函数 g() 并且产生目标函数最大值(25)的参数(x)是 5。Argmax 提供了一种抽象的方式来指定这个参数,而无需知道特定情况下的具体值。
- argmax(g(x)) = 5
请注意,这不是函数返回值(max())的最大值。那个值是 25。
这也不是参数的最大值,尽管在这种情况下 argmax 和参数的最大值是相同的,例如 5。argmax() 是 5 是因为当输入 5 时 g 返回最大值(25),而不是因为 5 是最大的参数。
通常,“argmax”写成两个单词,例如“arg max”。例如:
- result = arg max(g(x))
在不带括号的情况下使用 arg max 函数作为操作也很常见。在研究论文或教科书中,您通常会看到这种操作的写法和用法。例如:
- result = arg max g(x)
您也可以使用类似的操作来查找使目标函数产生最小值的参数,这称为 argmin 或“arg min”。
Argmax 在机器学习中如何使用?
Argmax 函数在数学和机器学习领域都有广泛应用。
但是,在应用机器学习中有一些特定情况会使用 argmax,并且您可能需要自己实现它。
在应用机器学习中,您会遇到的最常见的使用 argmax 的情况是查找数组中产生最大值的索引。
回想一下,数组是数字的列表或向量。
多类别分类模型通常会预测一个概率向量(或类似概率的值),每个类别标签对应一个概率。这些概率表示样本属于每个类别标签的可能性。
预测概率的顺序是:索引 0 处的预测概率属于第一个类别,索引 1 处的预测概率属于第二个类别,依此类推。
对于多类别分类问题,通常需要从一组预测概率中得到一个类别标签预测。
这种从预测概率向量到类别标签的转换通常使用 argmax 操作来描述,并且最常用 argmax 函数来实现。
让我们用一个例子来具体说明。
考虑一个具有三个类别的多类别分类问题:“red”、“blue”和“green”。在建模中,类别标签映射到整数值,如下所示:
- red = 0
- blue = 1
- green = 2
每个类别标签的整数值映射到模型可能预测的 3 元素向量的索引,该向量指定了样本属于每个类别的可能性。
假设一个模型对某个输入样本进行了一次预测,并预测了以下概率向量:
- yhat = [0.4, 0.5, 0.1]
我们可以看到,该样本属于“red”的概率为 40%,属于“blue”的概率为 50%,属于“green”的概率为 10%。
我们可以将 argmax 函数应用于概率向量。该向量就是函数,函数的输出是概率,函数的输入是向量元素索引或数组索引。
- arg max yhat
我们可以直观地看到,在这种情况下,预测概率向量(yhat)的 argmax 是 1,因为索引为 1 处的概率是最大值。
请注意,这不是概率的最大值(max()),即 0.5。同样请注意,这也不是参数的最大值,即 2。而是产生最大值(0.5)的参数,即 1。
- arg max yhat = 1
然后,我们可以将这个整数值映射回类别标签,即“blue”。
- arg max yhat = “blue”
如何在 Python 中实现 Argmax
Argmax 函数可以在 Python 中为给定的数字向量实现。
从零开始实现 Argmax
首先,我们可以定义一个名为 argmax() 的函数,该函数枚举提供的向量并返回具有最大值的索引。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# argmax function def argmax(vector): index, value = 0, vector[0] for i,v in enumerate(vector): if v > value: index, value = i,v return index # 定义向量 vector = [0.4, 0.5, 0.1] # get argmax result = argmax(vector) print('arg max of %s: %d' % (vector, result)) |
运行此示例将打印我们先前部分中使用的测试数据的 argmax,在这种情况下,索引为 1。
1 |
arg max of [0.4, 0.5, 0.1]: 1 |
使用 NumPy 实现 Argmax
值得庆幸的是,NumPy 库提供了一个内置的 argmax() 函数版本。
这就是您在实践中应该使用的版本。
下面的示例演示了在相同的概率向量上使用 argmax() NumPy 函数。
1 2 3 4 5 6 7 |
# numpy implementation of argmax from numpy import argmax # 定义向量 vector = [0.4, 0.5, 0.1] # get argmax result = argmax(vector) print('arg max of %s: %d' % (vector, result)) |
运行此示例将打印索引 1,正如预期的那样。
1 |
arg max of [0.4, 0.5, 0.1]: 1 |
更有可能的是,您会拥有一系列样本的预测概率。
这将被存储为一个矩阵,其中行是预测概率,每一列代表一个类别标签。对该矩阵进行 argmax 的期望结果是为每行预测生成一个索引(或类别标签整数)的向量。
这可以通过 NumPy 的 argmax() 函数设置“axis”参数来实现。默认情况下,将对整个矩阵计算 argmax,返回一个数字。相反,我们可以将 axis 值设置为 1,并为每行数据计算跨列的 argmax。
下面的示例演示了这一点,使用一个包含四行预测概率(针对三个类别标签)的矩阵。
1 2 3 4 5 6 7 8 9 |
# numpy implementation of argmax from numpy import argmax from numpy import asarray # 定义向量 probs = asarray([[0.4, 0.5, 0.1], [0.0, 0.0, 1.0], [0.9, 0.0, 0.1], [0.3, 0.3, 0.4]]) print(probs.shape) # get argmax result = argmax(probs, axis=1) print(result) |
运行此示例,首先会打印预测概率矩阵的形状,确认我们有四行,每行有三列。
然后计算矩阵的 argmax 并将其打印为一个向量,显示四个值。这正是我们期望的,其中每一行都产生一个 argmax 值或具有最大概率的索引。
1 2 |
(4, 3) [1 2 0 2] |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本教程中,您了解了 argmax 函数及其在机器学习中的用途。
具体来说,你学到了:
- Argmax 是一个查找给定目标函数能产生最大值的参数的操作。
- Argmax 在机器学习中最常用于查找具有最大预测概率的类别。
- Argmax 可以手动实现,尽管在实践中更倾向于使用 NumPy 的 argmax() 函数。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
我非常欣赏您所做的工作,您以如此出色而简单的方式解释了一切。
谢谢!
嗨,Jason,
感谢您将重点内容提炼得如此精确,阅读您的文章后我总能获得有益的收获。
不客气。
哇,解释得真清楚,非常感谢您让它如此简单易懂。
谢谢,很高兴它能帮到你!
哇,非常感谢!
不客气。
非常感谢
不客气。
这是网络上顶尖的公民数据科学家和营销人员之一的极好的通俗解释。
谢谢您的美言。
我非常欣赏您所做的工作,您以如此出色而简单的方式解释了一切。
谢谢!
我毫不夸张地说,您真的在用这些文章改变世界。抱歉评论区充斥着与主题无关的陈述,但伙计,您真的很棒。文章长度适中,深度恰当,清晰而不肤浅,太棒了。
谢谢!
谁能告诉我如何写上面给定例子的 argmax 方程?
上面的教程向您准确展示了如何编写 argmax,无论是从零开始还是使用库。
你到底遇到了什么问题?
嗨,Jason,
这个教程非常有帮助,非常感谢。
我只是想知道您是否可以再写一篇关于机器学习中常用的数学方程和公式的文章?我认为这对于刚进入这个领域的人(比如我 🙂)来说,能够获得一些研究人员常用的数学技术的数学支持,将会非常有帮助。
我知道您很忙,写一篇好文章需要时间。但这只是一个建议,希望您能考虑一下 🙂
谢谢
Elmer
不客气。
感谢您的建议。
我很高兴能找到如此好的文章和如此好的作者。您的工作让我的机器学习之路更加顺畅!
非常感谢您的反馈和支持 QingHe_Li!我们非常感激!
为什么下一个词预测需要 argmax?
你好 Bhaskar…您可能会发现以下资源很有趣
https://towardsdatascience.com/a-deep-learning-approach-in-predicting-the-next-word-s-7b0ee9341bfe
海滩的照片拍得真美 🙂