我在Octave中编写了一个机器学习程序,步骤如下:
- 从音频文件中提取特征
- 对特征进行缩放和归一化
- 训练SVM分类器
- 执行分类
我遇到的问题是步骤2、3和4在整个数据库上完成只需几秒钟的时间。然而,步骤1却需要每处理一个文件大约1秒钟,这实在是太长了。
之所以耗时如此之长,主要是因为我对每个文件进行了多次指数拟合,使用了leasqr
函数。
由于每个类别大约有1500个音频文件,且有3个或更多类别,时间很快就累积起来了。我希望扩展到15000个文件,但以目前的特征提取速度,这将不可行。
我不得不反复处理特征提取步骤,因为我一直在用它来调整分类器的性能。例如,通过改变进行指数拟合的范围来调整。
我的问题是这样的。我没有经验在外部运行繁重的进程,但这是否是一个可行的解决方案?如果是,那么在这种情况下,什么是好的/标准的做法?如果不是,那么什么是好的做法?
回答:
由于您的过程高度独立(从一个文件中提取特征与从其他文件中提取的结果没有任何依赖性),处理这个问题最合乎逻辑的方式是并行化。您可以同时在多个线程/核心/处理器/计算机/集群上运行此过程,使整个过程的速度达到您希望的程度,假设您有足够的计算能力。如果您是一名研究人员,那么您很可能有权访问大学/研究机构/公司的某些计算集群。否则,您总是可以购买此类资源的访问权,例如在Amazon EC2上(不过我相信您可以找到更便宜且更好的集群)。
但似乎,更好的(在价格和结果方面)做法是放弃Octave,因为它速度极慢,并使用像c++这样的高效语言来进行预处理。如果这还不够(我相当确定,这将至少提高一个数量级的速度),那么再考虑并行化。
一般来说,Matlab/Octave是分析工具,应该用于研究,而不是实际计算。一旦涉及到效率,就该进行“实际编程”了。