matlab算法學習記錄2

一、動態加權評價指標

clipboard.png

%%動態加權評價指標
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

三、BP神經網,第19章

%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('實際值','輸出值')
相關文章
相關標籤/搜索