使用Matlab中的svmtrain出现内存不足

我有一组数据,试图使用SVM进行学习。作为背景信息,这组数据的维度为35,包含大约30,000个数据点。

我之前使用这组数据在Matlab中训练过决策树,大约花了20秒。由于对错误率不太满意,我决定尝试使用SVM。

我首先尝试了svmtrain(X,Y)。大约5秒后,我得到了以下消息:

??? 使用 ==> svmtrain 时出错,在453行 计算核函数时出错:内存不足。请输入 HELP MEMORY 查看你的选项。

当我查找这个错误时,有人建议我使用SMO方法:svmtrain(X, Y, 'method', 'SMO');。大约一分钟后,我得到了以下信息:

??? 使用 ==> seqminopt>seqminoptImpl 时出错,在236行 在主循环最大次数(15000)内未达到收敛

在 ==> seqminopt 时出错,在100行 [alphas offset] = seqminoptImpl(data, targetLabels, …

在 ==> svmtrain 时出错,在437行 [alpha bias] = seqminopt(training, groupIndex, …

我尝试了其他方法(LS和QP),但我再次得到了第一个行为:5秒延迟后

??? 使用 ==> svmtrain 时出错,在453行 计算核函数时出错:内存不足。请输入 HELP MEMORY 查看你的选项。

我开始觉得我做错了什么,因为决策树使用起来如此轻松,而在这里我似乎卡在一个非常简单的操作上。

非常感谢你的帮助。


回答:

你有阅读关于算法内存使用情况的备注吗?

尝试将方法设置为SMO,并使用适合你机器可用内存的kernelcachelimit值。

在学习过程中,算法会构建一个大小为kernelcachelimit-by-kernelcachelimit的双精度矩阵。默认值为5000

否则,可以对你的实例进行子采样,并使用交叉验证等技术来衡量分类器的性能。

以下是相关部分:

内存使用和内存不足错误

当你将’Method’设置为’QP’时,svmtrain函数操作包含N个元素的数据集,并创建一个(N+1)-by-(N+1)的矩阵来寻找分离超平面。这需要至少8*(n+1)^2字节的连续内存。如果没有可用如此大小的连续内存,软件会显示“内存不足”的错误信息。

当你将’Method’设置为’SMO’(默认)时,内存消耗由kernelcachelimit选项控制。SMO算法只存储核矩阵的一个子矩阵,受kernelcachelimit选项指定的大小限制。然而,如果数据点的数量超过了kernelcachelimit选项指定的大小,SMO算法会变慢,因为它需要重新计算核矩阵元素。

当在大型数据集上使用svmtrain,并且你遇到内存不足或优化步骤非常耗时时,可以尝试以下任一方法:

  • 使用较少的样本,并使用交叉验证来测试分类器的性能。

  • 将’Method’设置为’SMO’,并将kernelcachelimit选项设置为系统允许的最大值。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注