使用matlab分类学习器生成装袋树模型并导出模型为C++代码到CLION中运行
由于毕设需要使用机器学习方法,数据是使用matlab处理的接收机后处理组合导航数据,正好可以使用matlab自带的机器学习工具箱进行训练和测试,生成初步的机器学习模型,可以到出到matlab中使用,也可以配合coder工具箱生产C++代码在Clion中运行。
在matlab中进行训练和测试
我的数据类型为一个标签四个特征组成的数据集,结构如下:  在整理好了数据集和训练集(格式要对应)训练过程如下: 1.打开分类学习器工具箱:  2.新建会话,这里我数据保存为文件形式所以选择从文件,如果数据在工作区可以选择从工作区  3.从文件导入的数据可以选择导入的内容,会自动识别分割各列,我选择的标签和特征一个5列 4.选择响应即自己的标签列后开始会话,注意这里每一列都有名称这在导出的模型中有对应的关系。  5.在模型类型中选择自己想要的模型,在高级中可以设置参数。如果选择的模型很多可以开启使用并行,那么在跑模型的同时可以做其他的选择(如增加模型,改变模型参数,选择特征等等),选好后点击训练。在这里我选择装袋数,在绘图栏可以查看训练的特征图,训练结果为交叉验证的结果。 
6.导入测试数据,导入过程和训练数据一样,注意要完全对应,在这里我依旧是从文件导入(也可以从工作区),导入内容时每一列都要对应上。 7.点击测试全部可以得到测试结果,同样可以在绘图中绘制测试数据相应图 
导出模型
1.训练好模型后就可以导出使用,我选择导出为紧凑型模型(不带训练数据)输入名称即可导出  2.在工作区会看到生产的一个结构体  3.同时系统给出了使用模型的链接,可以参考使用。  输入一个参数测试:
data = [2 2 2 2];
T = array2table(data, 'VariableNames', {'VarName3','VarName4','VarName5','VarName7'})
yfit = trainedModelshanghia.predictFcn(T);
 可以看到能正常使用,这里要特别注意输入参数应该是列表类型,同时要和之前训练选择的列名称对应上才行这里我之前不知道哪数组试怎么都不行。 4.加载模型,编写调用的函数。为了更好的使用模型以及生成C/C++代码需要新建一个调用模型的函数
saveLearnerForCoder(trainedModepre.ClassificationEnsemble,'mytree')
这个代码将模型保存到工作目录下其中trainedModepre 为生成的,模型名称,,'mytree’为自己定义的名字,本地的模型名称就是mytree。 
新建调用函数如上。至此模型已经导出到matlab可以使用。
生成C/C++代码
有了调用函数以后我们就可以生成C++代码。 1.在命令行输入coder,调用工具箱,选择我们新建的函数  2.点击NEXT,在输入框中输入一个调用函数的代码或者选择一个调用了函数的文件,这里我输入测试用的代码语句,点击Autodefine Input Types自动识别然后点击Next
3.点击Check for Issues等待运行。成功后点击Next 4.选择语言然后点击Generate.生成对应代码,最后又代码的简单介绍,C代码在treeclassfyX 中,examples 中有实例代码。最终代码在工作目录下是codegen文件夹  
导入Clion
1.将生成的代码文件codegen-lib 中的文件夹在clion中打开,把.cpp .h以外的文件删掉,把eaamples中的文件复制出来后把所有其他文件夹删除。  在main.cpp中展示了如何使用函数  所以可以编写自己的测试函数  ==在运行的时候会报错缺文件"tmwtypes.h"==它在我们matlab安装路径下有,
 window可以使用everything搜索这个头文件的位置在Polyspace\R2021a\extern\include中复制过来即可 Linux可以使用locate matlab 找到MATLAB/R2021a/…即matlab的位置同样在extern/include中复制过来即可 再次运行即可成功  自此,所有工作都完成了,可以进一步的在matlab和C编译器中使用这些函数和文件。
总结
在生成模型和C++代码过程中经历了很多坑,所以记录下来共分享。
|