matlab算法学习记录2

叫我瞄大人

1、动态加权评价指标

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

2、马尔科夫链模型

%% 马尔科夫链
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); %预测4、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

3、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('实际值','输出值')
阅读 2.1k

个人编程学习
python,matlab,VB

喜欢追星的非科班的编程爱好者

461 声望
76 粉丝
0 条评论

喜欢追星的非科班的编程爱好者

461 声望
76 粉丝
文章目录
宣传栏