我有一组数据,试图使用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选项设置为系统允许的最大值。