Machine learning LS-SVM训练:内存不足
我尝试在具有以下大小的数据集上训练LS-SVM分类器: 培训数据集:TS=48000x12(双倍)Machine learning LS-SVM训练:内存不足,machine-learning,classification,svm,matlab,Machine Learning,Classification,Svm,Matlab,我尝试在具有以下大小的数据集上训练LS-SVM分类器: 培训数据集:TS=48000x12(双倍) 分组:G=48000x1(双) Matlab培训代码为: class = svmtrain(TS,G,'method','LS',... 'kernel_function','rbf','boxconstraint',C,'rbf_sigma',sigma); 然后,我得到了这个错误消息: 使用svmtrain时出错(第516行) 计算核函数“rbf_核”时出错
分组:G=48000x1(双) Matlab培训代码为:
class = svmtrain(TS,G,'method','LS',...
'kernel_function','rbf','boxconstraint',C,'rbf_sigma',sigma);
然后,我得到了这个错误消息:
使用svmtrain时出错(第516行)计算核函数“rbf_核”时出错。 原因:
使用repmat时出错
内存不足。为您的选项键入帮助记忆。
请注意,物理内存的大小是4Gb,当我减小数据集训练大小时,它就会工作。因此,如果有任何解决方案具有相同的数据大小,当然不需要添加物理内存。看来,实现需要计算整个Gram矩阵,它的大小是nxn(其中N-样本数),在您的情况下,它是
2304000000
,现在每个都由32位浮点表示,这意味着它至少需要4个字节,即所需的9216000000
字节,这大约是一个Gram(内核)矩阵的9GB
有两种选择:
- 查找RBF核的实现,该实现不计算核(Gram)矩阵,而是每次使用一些可调用函数来计算核值
- 您可以尝试使用某种LS-SVM近似,如最小二乘支持向量机的快速稀疏近似:
svmtrain
Matlab函数仅适用于二进制分类,因此我只有两个类。您可以在Scala中将Breeze用于SVM。我不喜欢任何不可缩放的解决方案,Matlab总是无法扩展。我建议您进入一个不确定是否可能的领域,但可能使用较小的数据类型,例如,我会尝试Single
或int8
。当然,还要确保你的记忆中没有不必要的东西。另外,请确认您正在运行64位matlab。看看为什么。@DennisJaheruddin:谢谢你的评论。是的,我正在运行一个64位的Matlab,即使我尝试使用单
数据类型(包含双
一个),问题也是一样的。感谢您的回复。但是你是怎么计算N的?(知道我有48000个样本用于培训和12个功能)N=48000,因此N*N=2304000000您的答案的第二个选项是有用的,但它不能解决问题,因为当我尝试集成开发的C函数(在mex
编译之后)时,Matlab遇到内部问题,需要关闭。此外,我更喜欢使用Matlab函数的解决方案(尤其是用于训练和测试的Matlab SVM函数)。谢谢你的建议。