K-近邻算法的一个缺点是您需要保留整个训练数据集。
学习向量量化算法(简称 LVQ)是一种人工神经网络算法,它允许您选择保留多少训练实例,并学习这些实例具体应该是什么样子。
在这篇文章中,您将了解学习向量量化算法。阅读本文后,您将知道:
- LVQ 算法用于实际保存到文件中的表示。
- 使用学习到的 LVQ 模型进行预测的步骤。
- 如何从训练数据中学习 LVQ 模型。
- 为获得 LVQ 算法最佳性能所需的数据预处理。
- 在哪里可以找到更多关于 LVQ 的信息。
这篇文章是为开发人员编写的,不假定读者具有统计学或数学背景。文章重点介绍了算法的工作原理以及如何将其用于预测建模问题。
如果您对 LVQ 有任何疑问,请留言,我将尽力回答。
通过我的新书《掌握机器学习算法》启动您的项目,其中包括所有示例的**分步教程**和**Excel 电子表格文件**。
让我们开始吧。

用于机器学习的学习向量量化
图片由Holly Victoria Norval提供,保留部分权利。
LVQ 模型表示
LVQ 的表示是码本向量的集合。
LVQ 被开发并最好地理解为一种分类算法。它支持二元(两类)和多类分类问题。
码本向量是数字列表,它具有与您的训练数据相同的输入和输出属性。例如,如果您的任务是具有 0 和 1 类的二元分类,以及输入宽度、长度、高度,那么一个码本向量将由所有四个属性组成:宽度、长度、高度和类别。
模型表示是一个固定大小的码本向量池,从训练数据中学习。它们看起来像训练实例,但每个属性的值都根据学习过程进行了调整。
在神经网络的语言中,每个码本向量可以称为一个神经元,码本向量上的每个属性称为一个权重,码本向量的集合称为一个网络。
获取您的免费算法思维导图

方便的机器学习算法思维导图样本。
我创建了一份方便的思维导图,其中包含60多种按类型组织的算法。
下载、打印并使用它。
还可以独家访问机器学习算法电子邮件迷你课程。
使用 LVQ 模型进行预测
使用 LVQ 码本向量进行预测的方式与 K-近邻算法相同。
通过在所有码本向量中搜索 K 个最相似的实例,并总结这些 K 个实例的输出变量,对新实例 (x) 进行预测。对于分类,这是众数(或最常见的)类别值。
通常,当 K=1 时进行预测,匹配的码本向量称为最佳匹配单元(BMU)。
为了确定训练数据集中哪些 K 个实例与新输入最相似,使用了距离度量。对于实值输入变量,最流行的距离度量是欧几里得距离。欧几里得距离计算为新点 (x) 和现有点 (xi) 之间每个属性 j 的平方差之和的平方根。
欧几里得距离(x, xi) = sqrt( sum( (xj – xij)^2 ) )
从数据中学习 LVQ 模型
LVQ 算法从训练数据中学习码本向量。
您必须选择要使用的码本向量的数量,例如 20 或 40。您可以通过在训练数据集上测试不同的配置来找到要使用的最佳码本向量数量。
学习算法从一组随机码本向量开始。这些可以是训练数据中随机选择的实例,也可以是与训练数据具有相同尺度的随机生成向量。码本向量具有与训练数据相同数量的输入属性。它们还有一个输出类变量。
训练数据集中的实例被逐一处理。对于给定的训练实例,从池中选择最相似的码本向量。
如果码本向量的输出与训练实例相同,则码本向量会向训练实例靠近。如果它们不匹配,则会远离。向量移动的量由一个称为 learning_rate 的算法参数控制。
例如,如果类别匹配,码本向量的输入变量 (x) 会根据 learning_rate 的值向训练输入值 (t) 靠近,如下所示:
x = x + learning_rate * (t – x)
码本变量的输入变量远离训练实例的相反情况计算为:
x = x – learning_rate * (t – x)
这将为每个输入变量重复。
因为每个训练实例只选择一个码本向量进行修改,所以该算法被称为赢者通吃算法或一种竞争学习。
此过程对训练数据集中的每个实例重复。训练数据集的一次迭代称为一个 epoch。该过程将完成您必须选择的 epoch 数量(max_epoch),例如 200 个。
您还必须选择一个初始学习率(例如 alpha=0.3)。学习率随 epoch 递减,从您在 epoch 1 指定的大值开始,该值对码本向量进行最大程度的更改,并在最后一个 epoch 以接近零的小值结束,对码本向量进行非常小的更改。
每个 epoch 的学习率计算公式为:
learning_rate = alpha * (1 – (epoch/max_epoch))
其中 learning_rate 是当前 epoch(0 到 max_epoch-1)的学习率,alpha 是在训练开始时指定给算法的学习率,max_epoch 是运行算法的总 epoch 数量,也在训练开始时指定。
学习过程的直观理解是,码本向量池是训练数据集的压缩,压缩到最能表征类别分离的点。
LVQ 的数据准备
通常,为 LVQ 准备数据的好方法与为 K-近邻算法准备数据相同。
- **分类**:LVQ 是一种分类算法,适用于二元(两类)和多类分类算法。该技术已适用于回归。
- **多轮迭代**:使用 LVQ 的良好技术包括对码本向量执行多轮训练数据集迭代(例如,多次学习运行)。第一次使用较高的学习率来稳定码本向量池,第二次使用较小的学习率来微调向量。
- **多个最佳匹配**:LVQ 的扩展在学习过程中选择多个最佳匹配单元进行修改,例如一个属于同一类别,一个属于不同类别,它们分别被吸引和推离训练样本。其他扩展为每个码本向量使用自定义学习率。这些扩展可以改进学习过程。
- **标准化输入**:传统上,输入被标准化(重新缩放)到 0 和 1 之间。这是为了避免某个属性主导距离度量。如果输入数据被标准化,那么码本向量的初始值可以选择为 0 和 1 之间的随机值。
- **特征选择**:能够降低输入变量维度的特征选择可以提高方法的准确性。LVQ 在预测时与 K-近邻算法一样受到维度诅咒的影响。
Python 中的 LVQ 教程
有关在 Python 中从头开始实现 LVQ 的分步教程,请参阅以下文章:
进一步阅读
这项技术由 Kohonen 开发,他撰写了关于 LVQ 和姊妹方法自组织图的开创性著作,名为《自组织图》。
如果您对 LVQ 感兴趣,我强烈推荐这本书。
- 维基百科上的学习向量量化。
- 我的书《自然启发算法》中的学习向量量化章节。
- LVQ 官方软件实现 LVQ_PAK (由 Kohonen 开发)。
- LVQ 作为 WEKA 的插件(我多年前创建的)。
总结
在这篇文章中,您发现了 LVQ 算法。您了解到
- LVQ 的表示是一个小的码本向量池,小于训练数据集。
- 码本向量用于使用与 K-近邻算法相同的技术进行预测。
- 码本向量通过在匹配良好时靠近、匹配不佳时远离训练数据集来学习。
- 码本向量是训练数据的压缩,用于最好地分离类别。
- 数据预处理传统上涉及将输入值归一化到 0 到 1 的范围。
您对这篇文章或 LVQ 算法有任何疑问吗?请留言提问,我将尽力回答。
你好,
很棒且易读的帖子。如果我没理解错的话,更新规则应该使用“learning_rate”而不是初始值“alpha”。在当前形式中,“learning_rate”被减小但从未应用。或者用“alpha”替换“learning_rate”并在学习率的更新公式中引入类似“alpha0”的东西。
请删除或不要发布此帖子。
祝好
aloo
Alpha 是一个固定参数,学习率是用于更新权重的值。
码本向量 x 的更新规则使用的是固定参数 alpha,而不是自适应学习率参数。
谢谢 aloo masala,我已更新示例。
不客气。现在您可以删除我的评论了。
Kohonen 最近自行出版了一本关于这个主题的书。《MATLAB 实现与自组织图应用》
尽管其示例使用 MATLAB,但我认为这可能是自学的好选择,因为它免费!
http://docs.unigrafia.fi/publications/kohonen_teuvo/
太酷了,我还没看过这个。谢谢 Tom。
我有一个用权重初始化训练的网络(这是在 Java 中),将新数据集/向量输入并找到最佳匹配数据集的最佳方法是什么?
谢谢,
Declan
抱歉,Declan,我不明白您的问题。您能重新表述一下吗?
我有一个网络,训练集里面有向量和名称(分类名称),我试图获取一个没有名称的新向量,并确定它最接近什么。
我正在尝试使用新数据集进行预测,以预测它最相似的对象。
您可能会发现这篇文章有用
https://machinelearning.org.cn/implement-learning-vector-quantization-scratch-python/
我查看了帖子,并尝试实现与您的第一个测试类似的东西。它正确地训练了向量等,但我不确定如何测试一个尚未分类的新数据集?
2017 年,人们真的还在实践中使用 LVQ 和局部加权学习吗?
在问题上进行算法抽查时,我喜欢将 LVQ 混入其中,如果它能产生好的结果或与 kNN 相似的结果,我就选择它。
使用 MATLAB 教程的最佳机器学习分类算法
https://www.simpliv.com/developmenttool/machine-learning-classification-algorithms-using-matlab
谢谢您的链接。
你好!假设我们正在编码到 K 个码本向量集合(例如 K=512)。我们用数据训练系统,然后想要使用它。
网络可能的总输出数量是否为 K?也就是说,如果我用 K=512 训练网络处理 100,000 张 128x128x3 图像,那么训练后任何 128x128x3 图像都将被映射到 512 个输出中的一个吗?
我不确定我是否理解。模型的输出是 BMU 的摘要。
如果每个类别的原型(码本)数量等于我们拥有的数据点数量,会发生什么?
在这种情况下,只有当 LVQ 优于 kNN 时才使用它。它可能会。
你好,
感谢您的精彩网站。
正如您在帖子中所说,KNN“需要保留整个训练数据集”
我想使用 LVQ,但我可以使用 LVQ 作为无监督算法(或单类分类)吗?
我有一个具有正常行为的数据集,我想预测何时出现异常新项目。
谢谢,
MAK
也许可以试试。
你好,
你能给我一点提示吗?
如果我有来自同一类别的码本向量,LVQ 将如何工作?
根据您的解释,LVQ 只能是二元/多类别的。
谢谢
抱歉,我没有示例。也许您可以像在 KNN 模型中进行单类预测一样,使用码本向量的距离度量的阈值作为示例。
非常感谢。
我有个问题
更新码本后(即 x = x + learning_rate * (t – x)),码本中的某些元素
可能不属于训练数据。
如何为这些元素定义类别?
通过找到 BMU 并使用其类别,将类别分配给新实例。
非常感谢您的友好回复。
对于更新后的码本中的每个元素,如果其类别由
其 BMU 的类别确定,则该元素的类别可能
会随迭代而变化,对吗?
如果正确,最终的码本可能会出现类别不平衡。
通常不会。如果您愿意,可以试试。
嗨 Jason,非常感谢您的精彩易读的总结!我有三个快速的后续问题,很高兴能听听您的意见。如果能提供其他参考资料来帮助回答问题,我也很高兴。
1. LVQ 能否输出概率而不是类别?例如,如果我有两个类别(编码为 0 和 1),LVQ 能否输出 0.30 或 0.60 等概率,而不仅仅是 0 和 1?我之所以这样问,是因为我尝试在 R 中使用 LVQ 实现,但它似乎只能通过 lvqtest 函数将类别本身作为输出(https://www.rdocumentation.org/packages/class/versions/7.3-14/topics/lvq3)。所以,我想知道这仅仅是因为这个 R 包的实现,还是 LVQ 普遍无法提供概率。
2. 您认为 LVQ 适用于具有 >= 100 个预测变量和 >= 500,000 个观测值的数据集吗?我感觉情况并非如此,因为我在 R 中使用 LVQ(使用前面提到的实现)时,对于这种大小的数据集遇到了困难。此外,LVQ 似乎仍然与 KNN 有些相似之处,而 KNN 绝对不适用于这种大小的数据集。
3. 您说输入值应该标准化到 0 和 1 之间。是否只需将值标准化以使均值为 0,标准差为 1 就足够了?(基本上,我问的是,如果 Stephen Joy 在此论坛帖子第一个答案中的描述(https://www.researchgate.net/post/How_do_i_normalize_data_from_0_to_1_range)中,在步骤 3 之后停止是否足够)。如果我正在使用的 LVQ 实现没有指定需要 0 到 1 之间的值,这应该没问题,对吗?
提前感谢
不是直接或原生支持的,您可能可以使用 SVM 的方法将输出转换为概率。
LVQ 和 kNN 一样,都会受到维度诅咒的影响。许多特征可能会有问题。
标准化就可以了。
嗨!
首先,非常感谢您的精彩文章和总体上非常有用的网站!
我正在用 Python 实现 SOM(用于聚类/可视化)和 LVQ(一种 SOM 分类器)。
我想知道是否存在任何方法可以在开始时选择/确定神经元的数量。
例如,如果我们以 Iris 数据集为例,我们有三种不同花卉的类别。
所以,如果我理解得没错(我阅读了许多博客和文章,包括 Kohonen 的许多文章),对于 LVQ 模型,我们选择一定数量的神经元,比如说 10 个,并给它们一个类别。LVQ 模型是一维的(神经元网格是平坦的,不像 SOM 可以是二维、三维的…)。
所以例如,我们将前三个神经元赋予 setosa 类别,然后将 versicolor 赋予第四个和第五个神经元,最后其余的赋予 virginica 类别。
然后我们通过随机性初始化神经元的向量,或者通过取一个高斯分布,其均值和标准差与神经元被赋予的类别相同。
然后我们训练模型。
我这样说对吗?因为在我看来,在训练之前给神经元分配类别似乎很奇怪。
有些文章说聚类模型,比如 k-means、dbscan 甚至 SOM,可以在之前应用,但我并没有真正理解如何应用?
论坛上甚至有人说,要使用 SOM 模型进行分类,我们可以创建与类别数量一样多的 SOM,因此对于 Iris 数据集,可以创建三个 SOM。然后分别训练它们,每个 SOM 只训练一个类别。这样就会有一个用于 setose 的 SOM,一个用于 virginica 的 SOM……
然后要对新实例进行分类,我们查看所有 SOM 的 BMU,并预测 BMU 的类别。所以这有点像最佳匹配图,而不是最佳匹配单元……我尝试过,结果与 Iris 上的随机森林相似,但对于更大、更复杂的数据集,情况显然并非如此……
我将把我的“工作”,SOM 和 LVQ 的实现放在 github 上,因为我还没有找到任何真正好的实现……(但奇怪的是,对于神经气体和生长神经气体,有更多内容……)
但是如果您有时间,我希望得到您的一些有用的建议 😉
再次感谢!
我建议测试多种配置,看看哪种最适合您的特定数据集,我们无法事先知道最佳配置。
通常,如果 knn 效果很好,LVQ 也会效果很好。我还没有在监督学习中获得过很好的 som 经验。
另外,这可能很有用
http://cleveralgorithms.com/nature-inspired/neural/som.html
LVQ 不就是自组织图吗!这里随机选择一个训练点作为每个类别的中心,然后将该点移动到其类别的中心。我的观察对吗?
不,节点不像 SOM 中那样连接。
你好,我有一个问题。在“使用 LVQ 模型进行预测”这个子主题中,K 是什么意思?为什么我们通常将 K 取为 1?非常感谢您的回复!
K 是新示例的最佳匹配单元的数量。
LVQ 可以扩展用于聚类方法吗?
您是指 Kohonen 图/SOM 吗?这是一种不同但相关的方法。
在训练 LVQ 时如何使用目标值?
码本向量是如何获得的?
LVQ 和 VQ 有什么区别?它们中哪一个是无监督的,哪一个是监督的?
我认为最好将 VQ 视为 KNN 的结果,而 LVQ 是您获得 VQ 的方式。
你好。
移除不再赢得竞争的权重向量的最佳方法是什么?
选择码本数量的起始点是否有一般规则?例如,基于数据的维度?
在调整码本数量和学习率之间是否有通用的权衡?
嗨,Aaron……以下资源可能对您感兴趣
https://machinelearning.org.cn/implement-learning-vector-quantization-scratch-python/
特别是针对二元分类^^