问题来源:由于用c++神经网络仿真工具太慢,而训练的输入输出都非常缓慢,所以这里还是用神经网络来进行训练,故将数据从sqlserver中取数据。发现可以用database tool 真是非常方便
1、在start toolbox中找到工具箱
2、利用odbc 配置好数据源,以及sql语句,以及matlab变量,就可以执行了
3、效果如下所示:
真是非常方便。
4、对元胞数组进行操作
a=aamatlab{1,2}(1,1)为取元胞数组中1行第2个元胞中 的第一行第一列个值
结果为:0.0375 哈哈 搞定,进行下一步工作。
备注:clc为清屏,而clear为清除工作空间中的变量
5、形成训练样本
导入数据指令 imported_data = importdata('matlab.mat')
6、训练并预测,代码如下:
%%清空环境变量 clc; clear; %%训练数据预测数据?此处数据来源于一药店两年当中24个月的销量 % % data=[1856 1995 2220 2056 1123 1775 1900 1389 1609 1424 2276 1332 2056 2395 2600 2298 1634 1600 1873 1487 1900 1500 2046 1556]; % input_train=zeros(15,3); % output_train=zeros(15,1); % input_test=zeros(1,3); % output_test=zeros(1,1); % % for i=1:15 % input_train(i,1:3)=data(i:i+2); % output_train(i,1)=data(i+3); % end % input_test=[1487 1900 1500]; % output_test=2046; % j=0; % for i=16:21 % j=j+1; % input_test(j,1:3)=data(i:i+2); % output_test(j,1)=data(i+3); % end aamatlab=importdata('matlab.mat'); row=2; input_train=zeros(row,336); output_train=zeros(row,168); input_test=zeros(1,336); output_test=zeros(1,168); for i=1:row for j=1:336 input_train(i,j)=aamatlab{i,j}(1,1); end end for i=1:row for j=337:504 output_train(i,j)=aamatlab{i,j}(1,1); end end for j=1:336 input_test(1,j)=aamatlab{11,j}(1,1); end for j=337:504 output_test(1,j-336)=aamatlab{11,j}(1,1); end input_train=input_train'; output_train=output_train'; input_test=input_test'; output_test=output_test'; %输入数据归一化 [inputn,inputps]=mapminmax(input_train); %%BP网络训练 %初始化网络结构 net=newff(inputn,output_train,10);//隐层神经元数,一般为样本数的一半 net.trainParam.epochs=1000; net.trainParam.lr=0.1; net.trainParam.goal=0.0000004; %%网络训练 net=train(net,inputn,output_train); %%BP网络预测 %预测数据归一化 inputn_test=mapminmax('apply',input_test,inputps); %网络预测输出 BPoutput=sim(net,inputn_test);
结果分析:当样本数较少时,训练的时间比较短,但是当样本数超过5就会出现内存不足的问题,估计是形成的矩阵太大了。所以,输入神经元和输出神经元的数目一定要减少,单纯靠服务器的性能是无法解决问题的,另外,c++版本的程序经过测试,训练运算速度实在是太慢,因此,我还是考虑用matlab来做,其接口问题,虽然现在还没有掌握,但是在宿舍的电脑上还是可以实现的,到时候把生成的c++文件拷贝过来就可以了。
1、今天回去的任务是,将matlab代码进行转化,然后再c++中训练,看其效果。
2、降维的办法?
通过调试,确实发现,训练样本数影响其中一些计算的维数,所以还是考虑降维吧。