LIBSVM推理的嵌入式移植

2020年,我主要在为防老人摔倒的产品做算法。我们将一个IMU传感器固定在一根腰带上,从而快速采集人体的6轴数据(三轴加速度数据与三轴角速度数据)。然后使用STM32F4系列的芯片将采集到的数据喂给SVM算法,最终得出是否有摔倒风险的分类结果;另外,我们也在同样的数据上,训练了另外一个分类器,用来判定用户当前的姿态。同样,也是用的SVM。 SVM(Support Vector Machine, 支持向量机)这个算法也是相当经典的一个分类算法了。在深度神经网络出现之前,SVM的表现要好于MLP。而且它的前向推理也很简单,完全可以在低功耗的MCU上进行推理。我们在训练时,使用的是台湾大学林智仁(Lin Chih-Jen)教授开发的libsvm库。但是在准备将libSVM的推理部分移植到STM32上时,遇到了一些挑战。 相比于整个libSVM开源库,其推理部分相对简单,核心公式如下: $$ \operatorname{sgn}\left(\boldsymbol{w}^{T} \phi(\boldsymbol{x})+b\right)=\operatorname{sgn}\left(\sum_{i=1}^{l} y_{i} \alpha_{i} K\left(\boldsymbol{x}_{i}, \boldsymbol{x}\right)+b\right) $$

最小二乘法

最小二乘法是数据拟合中非常基础的一个方法。虽然它非常简单,然而同一种算法,每个人观察、学习的侧面却不尽相同。因此,我想还是有必要把我对最小二乘法的认识整理在这里。 数据拟合中最简单的是线性拟合的问题。比如,现在有这样采样的数据: 我们希望通过线性拟合来达到如下的效果: 我们将这些数据点定义为$(x_1,y_1),(x_2,y_2),…,(x_N,y_N)$。并设该拟合出的直线为 $$ f(x)=a\times x+b $$ 那么,我们肯定希望,这些离散的点离直线越近越好。写成数学表达式,即为: $$ \min E(a,b) $$