重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
用mapminmax函数。几个要说明的函数接口:
成都创新互联是一家集网站建设,立山企业网站建设,立山品牌网站建设,网站定制,立山网站建设报价,网络营销,网络优化,立山网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
[Y,PS] = mapminmax(X)
[Y,PS] = mapminmax(X,FP)
Y = mapminmax('apply',X,PS)
X = mapminmax('reverse',Y,PS)
在最新版的matlab里面共有两个归一化函数:mapminmax()和mapstd(),其中第一个函数是归一化到[0 1]范围,后一个的原理为统计归一化。
各自的归一化格式如下:
[pn,ps]=mapminmax(P)或=mapstd(P) %P是输入向量
[tn, ts]=mapminmax(t)或=mapstd(t) %t 是目标向量
在训练完后,对测试样本归一化格式为:
pnt=mapminmax('apply',pt,ps)或=mapstd('apply',pt,ps)
仿真后反归一化格式则为:
out=mapminmax('reverse',An,ts)或=mapstd('reverse',An,ts);其中An为sim函数的输出
反归一化需要知道原矩阵的两个参数。设原矩阵为a,归一化的过程后得到b:
amin=min(a(:));
amax=max(a(:));
b=(a-amin)/(amax-amin);
则反归一化需要知道amax和amin是多少,用一个语句可求:
a=b*(amax-amin)+amin
k相当于你用来记录每次运算的进度的,k不断的增长的过程,就是假设你用手算一个一个运算的过程。你写两个矩阵A是3*3的,B是3*3的,两个矩阵相乘,你看看是不是你手算的过程和这个程序的步骤是一致的。如果不是方阵假设A是2*3.B是3*2那么k还是原来的东西。只不过,2用i来循环,3用j来循环,for (int i = 0; i len; i++)中的len=2. for (int j = 0; j len; j++)中的len=3而已了。k=2因为C=A*B是2*2的。不明白你再问O(∩_∩)O
你这是在做时间序列呢。
你可以去《神经网络之家》nnetinfo----》学习教程二---神经网络在时间序列上的应用
上面有讲解。我把代码摘抄给你
% time series:神经网络在时间序列上的应用
% 本代码出自《神经网络之家》
timeList = 0 :0.01 : 2*pi; %生成时间点
X = sin(timeList); %生成时间序列信号
%利用x(t-5),x(t-4),x(t-3),x(t-2),x(t-1)作为输入预测x(t),将x(t)作为输出数据
inputData = [X(1:end-5);X(2:end-4);X(3:end-3);X(4:end-2);X(5:end-1)];
outputData = X(6:end);
%使用用输入输出数据(inputData、outputData)建立网络,
%隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。
net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');
%设置一些常用参数
net.trainparam.goal = 0.0001; %训练目标:均方误差低于0.0001
net.trainparam.show = 400; %每训练400次展示一次结果
net.trainparam.epochs = 1500; %最大训练次数:15000.
[net,tr] = train(net,inputData,outputData);%调用matlab神经网络工具箱自带的train函数训练网络
simout = sim(net,inputData); %调用matlab神经网络工具箱自带的sim函数得到网络的预测值
figure; %新建画图窗口窗口
t=1:length(simout);
plot(t,outputData,t,simout,'r')%画图,对比原来的输出和网络预测的输出
%------------------附加:抽取数学表达式----------------------------top
%希望脱离matlab的sim函数来使用训练好网络的话,可以抽取出数学的表达式,|
%这样在任何软件中,只需要按表达式计算即可。 |
%============抽取数学表达式==================
%抽取出网络的权值和阈值
w12 = net.iw{1,1}; %第1层(输入层)到第2层(隐层)的权值
b2 = net.b{1}; %第2层(隐层)的阈值
w23 = net.lw{2,1}; %第2层(隐层)到第3层(输出层)的权值
b3 = net.b{2}; %第3层(输出层)的阈值
%由于有归一化,必须先将归一化信息抓取出来
iMax = max(inputData,[],2);
iMin = min(inputData,[],2);
oMax = max(outputData,[],2);
oMin = min(outputData,[],2);
%方法1:归一化---计算输出---反归一化
normInputData=2*(inputData -repmat(iMin,1,size(inputData,2)))./repmat(iMax-iMin,1,size(inputData,2)) -1;
tmp = w23*tansig( w12 *normInputData + repmat(b2,1,size(normInputData,2))) + repmat(b3,1,size(normInputData,2));
myY = (tmp+1).*repmat(oMax-oMin,1,size(outputData,2))./2 + repmat(oMin,1,size(outputData,2));
%方法2:用真正的权值和阈值进行计算
%公式请参考《提取对应原始数据的权重和阈值》
W12 = w12 * 2 ./repmat(iMax' -iMin',size(w12,1),1);
B2 = -w12* (2*iMin ./(iMax - iMin) + 1) + b2;
W23 = w23 .*repmat((oMax -oMin),1,size(w23,2))/2;
B3 = (oMax -oMin) .*b3 /2 + (oMax -oMin)/2 + oMin;
%最终的数学表达式:
myY2 = W23 *tansig( W12 *inputData + repmat(B2,1,size(inputData,2))) + repmat(B3,1,size(inputData,2));
最后一个数不用除法,改用减法,从总量中减去已知的数字
0.337
0.330
0.334
变成
0.337
0.330
0.333
例如你的输入格式是b=(a-amin)/(amax-amin);则反归一化需要知道amax和amin是多少,用一个语句可求:a=b*(amax-amin)+amin。其中amax和amin都是归一化之前的最大或最小值。