3

我有一组数据,我正在尝试使用 SVM 学习。对于上下文,数据的维度为 35,包含大约 30'000 个数据点。

我之前用这个数据集在 Matlab 中训练过决策树,大约需要 20 秒。对错误率并不完全满意,我决定尝试 SVM。

我第一次尝试svmtrain(X,Y)。大约 5 秒后,我收到以下消息:

???在 453 处使用 ==> svmtrain 时出错 计算内核函数时出错:内存不足。键入 HELP MEMORY 作为您的选项。

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

???在 236 处使用 ==> seqminopt>seqminoptImpl 时出错 在主循环通过的最大次数 (15000) 内未实现收敛

==> seqminopt 中的错误为 100 [alphas offset] = seqminoptImpl(data, targetLabels, ...

==> svmtrain 在 437 [alpha 偏差] = seqminopt(training, groupIndex, ...

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

???在 453 处使用 ==> svmtrain 时出错 计算内核函数时出错:内存不足。键入 HELP MEMORY 作为您的选项。

我开始认为我做错了什么,因为决策树使用起来非常轻松,在这里我陷入了看似非常简单的操作。

非常感谢您的帮助。

4

1 回答 1

4

您是否阅读关于算法内存使用情况的评论?

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

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

否则,对您的实例进行二次抽样并使用交叉验证等技术来衡量分类器的性能。

以下是相关部分:

内存使用和内存不足错误

当您将“方法”设置为“QP”时,svmtrain 函数对包含 N 个元素的数据集进行操作,并创建一个 (N+1)×(N+1) 矩阵来查找分离超平面。该矩阵至少需要 8*(n+1)^2 字节的连续内存。如果此大小的连续内存不可用,软件会显示“内存不足”错误消息。

当您将“方法”设置为“SMO”(默认)时,内存消耗由 kernelcachelimit 选项控制。SMO 算法仅存储内核矩阵的子矩阵,受 kernelcachelimit 选项指定的大小限制。但是,如果数据点的数量超过 kernelcachelimit 选项指定的大小,SMO 算法会变慢,因为它必须重新计算内核矩阵元素。

在大型数据集上使用 svmtrain 时,如果内存不足或优化步骤非常耗时,请尝试以下任一方法:

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

  • 将“方法”设置为“SMO”,并将 kernelcachelimit 选项设置为系统允许的最大大小。

于 2013-04-14T00:18:14.000 回答