当前位置:   article > 正文

Topsis算法实践:比较LSTM算法与BP神经网络算法,以chickenpox_dataset为例_bp神经网络和lstm神经网络区别

bp神经网络和lstm神经网络区别

目录

Topsis简介

模型分类与转化

极小转化为极大型

中间最优型转极大值

区间最优[a,b]转极大型

计算得分并归一化

LSTM算法预测

数据加载处理

定义和训练LSTM网络

预测并返回误差

BP神经网络预测

数据处理

构建BP神经网络并返回预测值与真实值的误差

​编辑

利用Topsis算法比较两方案的优劣性

数据处理

正向化与标准化

归一化并计算得分

排序得出结果

​编辑

补充说明和疑问

LSTM简介

疑问


Topsis简介

TOPSIS算法(Technique for Order Preference by Similarity to Ideal Solution)可翻译为逼近理想解排序法,国内常简称为优劣解距离法。TOPSIS 法是一种常用的综合评价方法,其能充分利用原始数据信息,其结果能精确地反映各评价方案之间的差距。

模型分类与转化

X=[xij]m×n;m为评价对象,n为评价指标;

下面是对评价指标的四种分类:极大型(越大越好),极小型,中间型(某点最优),区间最优型

为方便处理,统一转化为极大型来解决

极小转化为极大型

max-x;若对象均为正数,也可使用1/x

中间最优型转极大值

M=max{|xi-xbest|}, x_i=1-|xi-xbest|/M

区间最优[a,b]转极大型

M=max{a-min(xi),b-max{xi}},x_i=

1-(a-xi)/M   x<a

1   a<=x<=b

1-(xi-b)/M   x>b

计算得分并归一化

参考清风数模笔记

LSTM算法预测

代码来源:matlab help center deep learning toolbox

数据加载处理

  1. data = chickenpox_dataset;
  2. data = [data{:}];
  3. %序列的前 90% 用于训练,后 10% 用于测试。
  4. numTimeStepsTrain = floor(0.9*numel(data));
  5. dataTrain = data(1:numTimeStepsTrain+1);
  6. dataTest = data(numTimeStepsTrain+1:end);
  7. %% 标准化数据
  8. %为了获得较好的拟合并防止训练发散,将训练数据标准化为具有零均值和单位方差。
  9. mu = mean(dataTrain);
  10. sig = std(dataTrain);
  11. dataTrainStandardized = (dataTrain - mu) / sig;
  12. XTrain = dataTrainStandardized(1:end-1);
  13. YTrain = dataTrainStandardized(2:end);

定义和训练LSTM网络

  1. %创建 LSTM 回归网络。指定 LSTM 层有 200 个隐含单元
  2. numFeatures = 1;
  3. numResponses = 1;
  4. numHiddenUnits = 200;
  5. layers = [ ...
  6. sequenceInputLayer(numFeatures)
  7. lstmLayer(numHiddenUnits)
  8. fullyConnectedLayer(numResponses)
  9. regressionLayer];
  10. %指定训练选项。
  11. %防止梯度爆炸,将梯度阈值设置为 1。。
  12. options = trainingOptions('adam', ...
  13. 'MaxEpochs',10000, ...
  14. 'GradientThreshold',1, ...
  15. 'InitialLearnRate',0.0001, ...
  16. 'LearnRateSchedule','piecewise', ...
  17. 'LearnRateDropPeriod',1, ...
  18. 'LearnRateDropFactor',1, ...
  19. 'Verbose',0, ...
  20. 'Plots','training-progress');
  21. %使用 trainNetwork 以指定的训练选项训练 LSTM 网络。
  22. net = trainNetwork(XTrain,YTrain,layers,options);

预测并返回误差

  1. %预测将来多个时间步的值,使用predictAndUpdateState函数一次预测一个时间步,并在每次预测时更新网络
  2. %状态。对于每次预测,使用前一次预测作为函数的输入。
  3. %使用与训练数据相同的参数来标准化测试数据。
  4. dataTestStandardized = (dataTest - mu) / sig;
  5. XTest = dataTestStandardized(1:end-1);
  6. %要初始化网络状态,先对训练数据 XTrain 进行预测。
  7. %接下来,使用训练响应的最后一个时间步 YTrain(end) 进行第一次预测。
  8. %循环其余预测并将前一次预测输入到 predictAndUpdateState。
  9. %对于大型数据集合、长序列或大型网络,在 GPU 上进行预测计算通常比在 CPU 上快。
  10. %其他情况下,在 CPU 上进行预测计算通常更快。
  11. %对于单时间步预测,请使用CPU。
  12. %使用 CPU 进行预测,请将 predictAndUpdateState 的 'ExecutionEnvironment' 选项设置为 'cpu'。
  13. net = predictAndUpdateState(net,XTrain);
  14. [net,YPred] = predictAndUpdateState(net,YTrain(end));
  15. numTimeStepsTest = numel(XTest);
  16. for i = 2:numTimeStepsTest
  17. [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
  18. end
  19. %使用先前计算的参数对预测去标准化。
  20. YPred = sig*YPred + mu;
  21. YTest = dataTest(2:end);
  22. error2=double((YPred-YTest));

BP神经网络预测

数据处理

  1. for i=1:488
  2. y(i,1)=data(i+10);
  3. for j=1:10
  4. x(i,j)=data(i+j-1);
  5. end
  6. end
  7. %读取数据
  8. input=x;
  9. output=y;
  10. %训练集,测试集
  11. input_train=input(1:439,:)';
  12. output_train=output(1:439,:)';
  13. input_test=input(440:end,:)';
  14. output_test=output(440:end)';
  15. %数据归一化
  16. [inputn,inputs]=mapminmax(input_train,0,1);%归一化至(0,1)区间
  17. [outputn,outputs]=mapminmax(output_train);
  18. inputn_test=mapminmax('apply',input_test,inputs);%inputs记录映射信息

构建BP神经网络并返回预测值与真实值的误差

  1. %构建bp神经网络
  2. net=newff(inputn,outputn,10)
  3. %网络参数
  4. net.trainparam.epochs=10000;%训练次数
  5. net.trainparam.lr=0.0001%学习效率
  6. net.dividefcn='';
  7. %bp神经网络训练
  8. net=train(net,inputn,outputn);
  9. %bp神经网络测试
  10. an=sim(net,inputn_test);%用训练好的模型进行仿真
  11. test_simu=mapminmax('reverse',an,outputs);%预测结果反归一化
  12. error2=test_simu-output_test;%预测值与真实值的误差

 

利用Topsis算法比较两方案的优劣性

数据处理

正向化与标准化

  1. data=[error1;error2];%中间型指标,0为最优
  2. [m,n]=size(data);
  3. k=size(error1,2);
  4. %正向化
  5. sum=0;
  6. for j=1:n
  7. M=max(abs(data(:,j)));
  8. for i=1:m
  9. data(i,j)=1-abs(data(i,j)-M)/M;
  10. sum=sum+data(i,j)^2;
  11. end
  12. end
  13. %标准化
  14. data=data/sqrt(sum);

归一化并计算得分

  1. %这里每一个评价指标等价,无需引入权重矩阵
  2. score=zeros(m,1);
  3. for i=1:m
  4. sum1=0;
  5. sum2=0;
  6. for j=1:n
  7. z1=max(data(:,j));%最大值
  8. z2=min(data(:,j));%最小值
  9. sum1=sum1+(data(i,j)-z1)^2;%与最大值的距离
  10. sum2=sum2+(data(i,j)-z2)^2;%与最小值的距离
  11. s1=sum1^0.5;
  12. s2=sum2^0.5;
  13. score(i)=s2/(s1+s2);
  14. end
  15. end

排序得出结果

关于sort参考matab sort的使用

  1. %排序
  2. [a,b]=sort(score);
  3. [c,d]=sort(b);
  4. disp(d)

score返回值:[0.503574758258623;0.496425241741377]

返回值:2 1 (谁越大序号越大)说明此例中LSTM时序预测略优于BP神经网络预测

附error1与errro2的图像对比:

  1. k=size(error1,2);
  2. x=linspace(1,10,k);
  3. plot(x,error1,x,error2);

 

补充说明和疑问

补充:本文中LSTM预测与BP神经网络预测的迭代次数均为10000,学习速率均为0.0001,其中LSTM的程序跑了6分钟左右

LSTM简介

长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。——百度词条LSTM

疑问

由于LSTM的特性,其常被用来预测股票价格的趋势。本文中的例子原data对应的图形与相应代码:

  1. plot(data)
  2. xlabel('Month')
  3. ylabel('Cases')
  4. title('Monthly Cases of Chickenpox')

 发现它与股票价格走向图有相似之处,但LSTM预测效果并不好,较BP神经网络预测误差区间更大,且由Topsis模型得出LSTM算法在此例中预测效果与BP无明显区别(score非常接近)。

希望得到合理的解释

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号