SVM(Support Vector Machine, 支持向量机)这个算法也是相当经典的一个分类算法了。如果想要使用SVM算法,大家一般也不会自己造轮子,开源的库也就够用了。开源的SVM库中最香的,应该是台湾大学林智仁(Lin Chih-Jen)教授开发的libsvm库了。
我最近的项目中,恰巧用到了SVM算法,libsvm很快解决了问题。但我最终希望把算法部署到嵌入式的设备中(STM32)。我一开始兴致勃勃地把整个源码都移植过去了,后来越想越不对,嵌入式的资源这么小,libsvm的底层搞得那么复杂,代码量那么大,全部移植过去岂不是亏大了。事实上,libsvm大部分的精力都在解决训练的问题,而推理部分,说实话,只有一点点。
公式如下:
如果想要了解公式的具体含义,可以参考这篇文章。
多么简单清晰的一个公式,唯一需要变换的就只是核函数而已,而文章中也已经给出了不同的核函数的写法。
另一方面,libsvm训练好后会保存为一个模型文件。而进行libsvm推理时,需要先加载这个文件。而嵌入式的裸机开发中,是没有文件系统的,即使可以加上,也很麻烦。所以,我索性就干了这么个事:自己解析libsvm生成的模型文件,并生成对应的model.h和model.c文件。把数据和方法全部都放在model.h和model.c中,这样,就可以非常简单地在外部调用svm的推理方法了。
我把这个工作放到了我的github中。实现起来其实非常简单,但是却大量地缩小了嵌入式系统中存储的使用,免去了文件系统的搭建。如果你也有同样的需求,也可以试试看。
网友评论