以神经网络使用为例的Matlab和Android混合编程

本文介绍了一种将Matlab神经网络模型整合到Android应用中的方法。首先在Matlab中建立并训练神经网络,将其保存为jar文件。然后在Android工程中导入jar包,通过编写Java代码调用Matlab神经网络模型进行预测。详细步骤包括数据处理、函数打包、环境配置、错误处理等。最后探讨了由于Android系统限制,直接使用Matlab生成的jar包在Android上运行的问题,提出了可能的替代方案。
摘要由CSDN通过智能技术生成

http://www.cnblogs.com/bellkosmos/p/5598439.html

由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是。。。)
这个问题大概处理了两天,原本预计5个小时的。。。
过程遇到了诸多一手坑以及看到相关资料的对新手不友好,所以就把过程记录下来希望能给后来者一些帮助
这个教程从0开始讲如何在Android App中使用Matlab的神经网络代码
整个过程大概可以分成这么几步:
  1. 首先你要在Matlab中写一个完整的神经网络
    1. 获取样本
    2. 样本导入
    3. 神经网络建模
    4. 神经网络训练
    5. 神经网络测试(优化建模)
  2. 然后你要在Matlab中重写一个神经网络,第二个神经网络的特殊之处是
    1. 首先这个神经网络必须写成函数,具体有几个细节
    2. 把第一个神经网络的训练结果net网络保存成mat文件
    3. 把相关需要用的但无法直接写入代码的数据也保存成mat文件(比如数据归一化的参数)
    4. 然后在函数中把上面几个mat文件导入,基本上就是一个完整的神经网络模型了
    5. 再加上一个神经网络计算语句,并把结果返回,这个函数就完成了
  3. 然后把这个Matlab神经网络函数进行打包,打包的结果是一个jar包
  4. 然后把这个jar包连同另一个jar包一块导入Andorid工程,并添加为外部依赖
  5. 最后在Android工程中写一个专门调用这个jar包接口代码的函数,传入输入变量,返回计算结果
  6. ()
 
1.在Matlab中写一个完整的神经网络
1.1.获取样本就不说了
1.2.样本导入
如何导入数据呢,一般matlab中有通用的数据存储格式,那就是Mat格式,但是我并不知道怎么编写这个格式
在我发现有办法可以把txt中的数据导入进去之后我就选定它了,因为这种格式也非常方便我用android输出,也就是说它是一种比较通用的信息交换格式
具体的操作方法非常简单:
  1. 你在txt中按这种格式保存数据:每行用回车隔开,每列用空格隔开
  2. 然后你在matlab中load这个文件,就能得到一个数据的矩阵了
代码如下:
 
alldata = load('alldata.txt');
alldata = alldata(:,:);
 
1.3. 1.4. 1.5. 这几个过程照着代码修改还是比较简单的(虽然matlab很久没用让我当时读得有点困难。。。),稍微提这么几点:
  1. (把经典书目《MATLAB神经网络30个案例分析》的源码包放到工作路径再进行阅读修改)
  2. 输出数据需要进行一下矩阵转换
  3. 使用newff工具函数来构建神经网络,使用matlab内部的工具箱(其实就是库函数)来建模、训练和计算,不需要自己写逻辑代码
  4. 中间各种矩阵的变换感觉不是很习惯,可以参看一下工作空间里的变量状态,或者一步步打印一些变量的结果来看
 
clc;
clear;
 
%导入300组数据
alldata = load('alldata.txt');
alldata = alldata(:,:);
 
%输入输出数据
input = alldata(:,2:33);
outputtemp = alldata(:,1);
%输出数据需要处理一下
output = zeros(300,2);%预先分配内存
for i=1:300
    switch outputtemp(i)
        case 0
            output(i,:) = [1 0];%意思是如果数据结果是0,则输出层的状态是[1 0],或者用第一个输出节点表示
        case 1 %能直接识别带小数位的数据
            output(i,:) = [0 1];
    end
end
 
%从中随机抽取280组数据作为训练数据,20组数据作为预测数据
k = rand(1,300);
[m,n] = sort(k);
 
input_train = input(n(1:280),:)';
output_train = output(n(1:280),:)';
 
input_test = input(n(281:300),:)';
output_test = output(n(281:300),:)';
 
%输入输出数据进行归一化处理
[inputn,inputps] = mapminmax(input_train);
[outputn,outputps] = mapminmax(output_train);
 
%网络结构构建32-6-2
net=newff(inputn,outputn,6);
 
%网络参数配置(迭代次数,学习率,目标)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0004;
 
%网络训练
net=train(net,inputn,outputn);
 
%BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
 
%网络预测输出
an=sim(net,inputn_test);
 
%网络输出反归一化
BPoutput=mapminmax('reverse',an,outputps);
 
%结果分析
figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error=BPoutput-output_test;
 
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
 
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')
 
errorsum = sum(abs(error))
 
最后输出的结果还可以,虽然正确率一般,因为样本太少 。但是还能接受,是可以解释的结果:
 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值