使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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