%%動態加權評價指標 clc,clear,close all inputfile = '../MATLAB/dtjq.xlsx' ; % 銷量數據文件 [num,txt,raw] = xlsread(inputfile); A=num; %% x=[0.6,0.67,0.6];%轉化成標準數區間的中數 ca=[0.1,0.335,0.1];%B1值,一類水的中數 ca1=x-ca./sqrtm((-log(0.1)));%δ值 B=[0.2 0.6 1;0.67 0.67 1;0.2 0.6 1];%標準分級 a=size(A,1);% A的行數 b=size(A,2);% A的列數 MX=max(A);% A的每列的最大值 MN=min(A);% A的每列的最小值 f1=1; % B的行變量 f2=1; % B的列變量 for j=1:b % 將A裏面的值標準化,a爲A的行數,b爲a的列數 for i=1:a A(i,j)=(A(i,j)-MN(j))/(MX(j)-MN(j)); end end X=zeros(a,4);%創建放置每一個城市天天空氣質量的值矩陣 for i=1:a%計算每一個城市天天的空氣質量 h=1; k=1; flag0=1;%算完每一個城市天天的空氣質量後,跳到下一個城市(h=h+1) for j=1:b for flag=1:3 if A(i,j)<=ca(k) w=0; X(i,h)=X(i,h); break; elseif A(i,j)>ca(k)&&A(i,j)<B(f1,f2) w=1-exp(-(A(i,j)-ca(k)/ca1(k))^2); X(i,h)=X(i,h)+w*A(i,j);%加權 break; else k=k+1;%對應每一箇中值 f2=f2+1;%對應每一個等級值 end end f1=f1+1;%對應每一個屬性 k=1;%每循環完一次,跳到第一個中值 f2=1;%每循環完一次,又從第一級開始 if flag0==3%判斷是否算完了一個城市天天的空氣質量 h=h+1; flag0=1; f1=1; else flag0=flag0+1; end end end a=size(X,1);%X的行數 b=size(X,2);%X的列數 h=1; C=zeros(1,b);%創建整體排序矩陣 for k=1:b%將全部城市整體排序 for i=1:a for j=1:b if(A(h)>A(i,j)) C(k)= C(k)+1;%C,Borda數 else end end h=h+1; end end
二、馬爾科夫鏈模型算法
%% 馬爾科夫鏈 clc;clear;close all; load('example.mat') % 加載數據 %% [xrow,xcol]=size(x); for j=1:xrow for i=1:xcol-1 a(j,i)=(x(j,i+1)-x(j,i))/x(j,i); % 求增加率 end end %% 分別爲不一樣增加率賦值 b=zeros(xrow,xcol); for j=1 for i=1:xcol-1 if a(j,i)>=0.03 b(j,i)=2;%快速增加 elseif (a(j,i)<0.03)&&(a(j,i)>0) b(j,i)=1;%緩慢增加 elseif a(j,i)==0 b(j,i)=0; %沒有增加 elseif a(j,i)>-0.03 && a(j,i)<0 b(j,i)=-1;%緩慢降低 elseif a(j,i)<-0.03 b(j,i)=-2; %快速降低 end end end %% 統計相連增加率值特徵Cij c=zeros(xrow,25);%分25類 for j=1 for i=1:xcol-3 if (b(j,i)==2&&b(j,i+1)==2)%先快後也快 c(j,1)=c(j,1)+1; elseif(b(j,i)==2&&b(j,i+1)==1)%先快後緩慢快 c(j,2)=c(j,2)+1; elseif(b(j,i)==2&&b(j,i+1)==0)%先快後平緩 c(j,3)=c(j,3)+1; elseif(b(j,i)==2&&b(j,i+1)==-1) c(j,4)=c(j,4)+1; elseif(b(j,i)==2&&b(j,i+1)==-2) c(j,5)=c(j,5)+1; elseif(b(j,i)==1&&b(j,i+1)==2) c(j,6)=c(j,6)+1; elseif(b(j,i)==1&&b(j,i+1)==1) c(j,7)=c(j,7)+1; elseif(b(j,i)==1&&b(j,i+1)==0) c(j,8)=c(j,8)+1; elseif(b(j,i)==1&&b(j,i+1)==-1) c(j,9)=c(j,9)+1; elseif(b(j,i)==1&&b(j,i+1)==-2) c(j,10)=c(j,10)+1; elseif(b(j,i)==0&&b(j,i+1)==2) c(j,11)=c(j,11)+1; elseif(b(j,i)==0&&b(j,i+1)==1) c(j,12)=c(j,12)+1; elseif(b(j,i)==0&&b(j,i+1)==0) c(j,13)=c(j,13)+1; elseif(b(j,i)==0&&b(j,i+1)==-1) c(j,14)=c(j,14)+1; elseif(b(j,i)==0&&b(j,i+1)==-2) c(j,15)=c(j,15)+1; elseif(b(j,i)==-1&&b(j,i+1)==2) c(j,16)=c(j,16)+1; elseif(b(j,i)==-1&&b(j,i+1)==1) c(j,17)=c(j,17)+1; elseif(b(j,i)==-1&&b(j,i+1)==0) c(j,18)=c(j,18)+1; elseif(b(j,i)==-1&&b(j,i+1)==-1) c(j,19)=c(j,19)+1; elseif(b(j,i)==-1&&b(j,i+1)==-2) c(j,20)=c(j,20)+1; elseif(b(j,i)==-2&&b(j,i+1)==2) c(j,21)=c(j,21)+1; elseif(b(j,i)==-2&&b(j,i+1)==1) c(j,22)=c(j,22)+1; elseif(b(j,i)==-2&&b(j,i+1)==0) c(j,23)=c(j,23)+1; elseif(b(j,i)==-2&&b(j,i+1)==-1) c(j,24)=c(j,24)+1; elseif(b(j,i)==-2&&b(j,i+1)==-2) c(j,25)=c(j,25)+1; end end end %% 分類累加求和,分五類 d=zeros(xrow,5); for i=1 for j=1:25 if(j<6) d(i,1)=d(i,1)+c(i,j);%下一時刻快速增加個數 elseif(j>5&&j<11) d(i,2)=d(i,2)+c(i,j); %下一時刻緩慢增加個數 elseif(j>10&&j<16) d(i,3)=d(i,3)+c(i,j); %下一時刻穩定個數 elseif(j>15&&j<21) d(i,4)=d(i,4)+c(i,j);%下一時刻緩慢降低的個數 else d(i,5)=d(i,5)+c(i,j);%下一時刻快速降低的個數 end end end %% 一步轉移機率矩陣;e值 f=b(:,37); e= zeros(5,5); for i=1 for j=1:25 if(j<6) if(d(i,1)==0) e(5,j)=0; else e(1,j)=c(i,j)/d(i,1); %一步轉移機率,每五個數據與對應的Di相除 end elseif(j>5&&j<11) if(d(i,2)==0) e(5,j-5)=0; else e(2,j-5)=c(i,j)/d(i,2); end elseif(j>10&&j<16) if(d(i,3)==0) e(5,j-10)=0; else e(3,j-10)=c(i,j)/d(i,3); end elseif(j>15&&j<21) if(d(i,4)==0) e(5,j-15)=0; else e(4,j-15)=c(i,j)/d(i,4); end else if(d(i,5)==0) e(5,j-20)=0; else e(5,j-20)=c(i,j)/d(i,5); end end end % h狀態機率 g=zeros(i,5); %預測四、5月的增加率 hr=[]; if(f(i,1)==2) h=[1 0 0 0 0 ]*e for k=1:6 h=h*e end elseif(f(i,1)==1) g(i,:)=[0 1 0 0 0 ]; h=g(i,:)*e for k=1:6 h=h*e end elseif(f(i,1)==0) g(i,:)=[0 0 1 0 0 ]; h=g(i,:)*e for k=1:6 h=h*e end elseif(f(i,1)==-1) g(i,:)=[0 0 0 1 0 ]; h=g(i,:)*e for k=1:6 h=h*e end elseif(f(i,1)==-2) g(i,:)=[0 0 0 0 1 ]; h=g(i,:)*e for k=1:6 h=h*e end end end
%PA 5月31:0:0 計算的MATLAB 程序以下:BP神經網絡預測 %5月31位於第23行 clc,clear load('PA.mat') %原始數據以列向量的方式存放在workplace文件中 PA=PA(2:29,:); %% 數據的標準化,歸一於0~1 N=size(PA);%N爲PA的行列 for j=1:N(1,2)%列 PAHminmax=minmax(PA(:,j)'); for i=1:N(1,1) PA(i,j)=(PA(i,j)-PAHminmax(1,1))/(PAHminmax(1,2)-PAHminmax(1,1));%數據標準化 end end %%以天天的從0時計數起,每隔十五分鐘做爲輸入 P=PA(2:22,:); %以5月31的間隔十五分鐘的發電量做爲目標向量 T=PA(23,:); %建立一個BP神經網絡,每個輸入向量的取值範圍爲[0 ,1],隱含層有22個神經元, %輸出層有一個神經元,隱含層的激活函數爲tansig,輸出層的激活函數爲%logsig, %訓練函數爲梯度降低函數,即標準學習算法 for i=1:21 a(i,1)=0; a(i,2)=1; end net=newff(a,[21,1],{'tansig','logsig'},'traingd'); net.trainParam.epochs=30000; net.trainParam.goal=0.01; %設置學習速率爲0.1 LP.lr=0.1; %訓練網絡 net=train(net,P,T); %預測5月31的發電量數據 T1=sim(net,P);%預測值T1 %PA.5月31日發電量真實值 T0=PA(23,:); %預測值與實際值的偏差 for i=1:N(1,2)%PA的列 error(1,i)=T1(1,i)-T0(1,i); end %繪製偏差圖 figure(1) plot(1:N(1,2),error(1,1:N(1,2)),'-*') grid on xlabel('時點x'),ylabel('發電功率偏差y'); title('PA6.1.0.0-5.31.23.45發電功率偏差圖像') %繪製實時函數圖 figure(2) plot(1:N(1,2),T0(1,:),1:N(1,2),T1(1,:),'r') grid on legend('實際值','預測值',2) xlabel('時點x'),ylabel('發電功率y'); title('PA6.1.0.0-5.31.23.45發電功率實時函數圖像')
第17章網絡
clc,clear,close all; load('x.mat'); x=x'; y=1:14; x=mapminmax(x); y=mapminmax(y); net=newff(minmax(x),[80,1],{'tansig','purelin'},'trainrp'); inputWeights=net.IW{1,1};%層權值 inputbias=net.b{2};%閥值 layerWeights=net.IW{1,1}; layerbias=net.b(2); %訓練參數 net.trainParam.show=50;%訓練步數 net.trainParam.lr=0.01;%學習率 net.trainParam.mc=0.9;% net.trainParam.epochs=400;% net.trainParam.goal=1e-5; [net,tr]=train(net,x,y); A_train=sim(net,x); E=y-A_train; MSE=mse(E) figure(1) plot(y,'ro--','linewidth',2) hold on plot(A_train,'bs--','linewidth',2) legend('實際值','輸出值')