1.简述
学习目标:模糊神经网络预测水质评价——重风水厂、 高升水厂、秦玺水厂
采用模糊神经网络预测这三个水厂的水质,并进行对比
模糊神经网络(Fuzzy Neural Network, FNN)
背景
 系统复杂度的增加,人工智能深度化发展
模糊数学创始人L. A. Zadeh, 1921. 当系统的复杂性增加时,我们使它精确化的能力将减小。直到达到一个阈值,一旦超过它,复杂性和精确性将互相排斥。
 模糊集理论:集合讨论一个对象具有某种性质时记作A,不具有这种性质时记作非A,且两者必居其一,决不允许模棱两可,而没有考虑这种性质的程度上的差异。
 神经网络
 分布式➡️容错、学习,无法利用系统信息、专家知识
只能描述大量数据之间的复杂函数关系
 将知识存在权系数中,具有分布存储的特点
 涉及的神经元很多(并行工作),计算量大
 权系数可由输入输出样本中学习,无需人来设置
 黑箱模型,参数不直观,物理意义不明确。
 模糊系统
 系统性、专家知识➡️推理,建库困难、自适应困难
表达人的经验性知识,便于理解
 将知识存在规则中
 模糊神经网络
 神经网络与模糊系统的结合,在处理大规模的模糊应用问题方面将表现出优良效果。
模糊神经网络本质是将模糊输入信号和模糊权值输入常规的神经网络。其结构上像神经网络,功能上是模糊系统。
学习算法是模糊神经网络优化权系数的关键。
总结:模糊神经网络虽然也是局部逼近网络,但是它是按照模糊系统模型建立的,网络中的各个结点及所有参数均有明显的物理意义,因此这些参数的初值可以根据系统或定性的知识来加以确定,然后利用上述的学习算法可以很快收敛到要求的输入输出关系,这是模糊神经网络比前面单纯的神经网络的优点所在。同时由于它具有神经网络的结构,因而参数的学习和调整比较容易,这是它比单纯的模糊逻辑系统的优点所在。
理论基础:
 模糊神经网络(Fuzzy Neural Network,简称FNN)本质上是一种将模糊理论与人工前向神经网络相结合的多层前向神经网络,在处理信息时,该网络能够具有更大的处理范围以及更快的信息处理速度,因此该网络的自学习能力与映射也相对较高。与反向传播神经网络(BPNN)相似,其训练过程主要分为前向传播与反向传播两个部分。
建模步骤:
 以使用模糊神经网络进行数据预测为例,可以将模糊神经网络预测模型的建模步骤总结如下:
根据输入数据的相关特征确定模糊神经网络输入层、隶属度函数计算层、规则生成层、归一化层以及输出层的节点数;
 选择一种参数初始化方法对模糊神经网络隶属度函数计算层中隶属度函数的中心点、宽度向量以及输出层的连接权值、阈值进行随机初始化;
 数据由输入层输入模糊神经网络,依次经过隶属度函数计算层以及规则生成层计算获得输出;
 将规则生成层的输出在归一化层进行归一化处理之后经由输出层的加权处理获得网络的最终前向传播输出;
 传递至隐含层后经径向基函数对数据进行非线性转换;
 选择一种损失函数对网络的前向传播输出以及目标值进行相关计算得到损失值;
 以输出层的损失值计算得到输出层连接权值的梯度,选择一种反向传播算法对它们进行调整;
 损失值传递至隶属度函数计算层,同样使用相同的反向传播算法对隶属度函数的中心点以及宽度向量进行调整;
 获得一个参数得到更新后的模糊神经网络;
 在达到最大迭代次数之前,重复步骤3到步骤9,在达到最大迭代次数后,输出隐含层与输出层参数确定的多层前馈神经网络。
  
2.代码
%% 清空环境变量
 clc
 clear
%% 参数初始化
 xite=0.001;
 alfa=0.05;
%%  网络节点
 I=6;   %输入节点数
 M=12;  %隐含节点数
 O=1;   %输出节点数
%% 系数初始化
 p0=0.3*ones(M,1);p0_1=p0;p0_2=p0_1;
 p1=0.3*ones(M,1);p1_1=p1;p1_2=p1_1;
 p2=0.3*ones(M,1);p2_1=p2;p2_2=p2_1;
 p3=0.3*ones(M,1);p3_1=p3;p3_2=p3_1;
 p4=0.3*ones(M,1);p4_1=p4;p4_2=p4_1;
 p5=0.3*ones(M,1);p5_1=p5;p5_2=p5_1;
 p6=0.3*ones(M,1);p6_1=p6;p6_2=p6_1;
%% 参数初始化
 c=1+rands(M,I);c_1=c;c_2=c_1;
 b=1+rands(M,I);b_1=b;b_2=b_1;
maxgen=100; %进化次数
%% 网络测试数据,并对数据归一化
 load data1 input_train output_train input_test output_test
%% 样本输入输出数据归一化
 [inputn,inputps]=mapminmax(input_train);
 [outputn,outputps]=mapminmax(output_train);
 [n,m]=size(input_train);
%% 网络训练
 %循环开始,进化网络
 for iii=1:maxgen
     iii
     for k=1:m        
         x=inputn(:,k);
         
         %输出层结算
         for i=1:I
             for j=1:M
                 u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
             end
         end
         
         %模糊规则计算
         for i=1:M
             w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i);
         end    
         addw=sum(w);
         
         for i=1:M
             yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6);
         end
         
         addyw=yi*w';
         %网络预测计算
         yn(k)=addyw/addw;
         e(k)=outputn(k)-yn(k);
         
         %计算p的变化值
         d_p=zeros(M,1);
         d_p=xite*e(k)*w./addw;
         d_p=d_p';
         
         %计算b变化值
         d_b=0*b_1;
         for i=1:M
             for j=1:I
                 d_b(i,j)=xite*e(k)*(yi(i)*addw-addyw)*(x(j)-c(i,j))^2*w(i)/(b(i,j)^2*addw^2);
             end
         end  
         
         %更新c变化值
         for i=1:M
             for j=1:I
                 d_c(i,j)=xite*e(k)*(yi(i)*addw-addyw)*2*(x(j)-c(i,j))*w(i)/(b(i,j)*addw^2);
             end
         end
         
         p0=p0_1+ d_p+alfa*(p0_1-p0_2);
         p1=p1_1+ d_p*x(1)+alfa*(p1_1-p1_2);
         p2=p2_1+ d_p*x(2)+alfa*(p2_1-p2_2);
         p3=p3_1+ d_p*x(3)+alfa*(p3_1-p3_2);
         p4=p4_1+ d_p*x(4)+alfa*(p4_1-p4_2);
         p5=p5_1+ d_p*x(5)+alfa*(p5_1-p5_2);
         p6=p6_1+ d_p*x(6)+alfa*(p6_1-p6_2);
             
         b=b_1+d_b+alfa*(b_1-b_2);      
         c=c_1+d_c+alfa*(c_1-c_2);
    
         p0_2=p0_1;p0_1=p0;
         p1_2=p1_1;p1_1=p1;
         p2_2=p2_1;p2_1=p2;
         p3_2=p3_1;p3_1=p3;
         p4_2=p4_1;p4_1=p4;
         p5_2=p5_1;p5_1=p5;
         p6_2=p6_1;p6_1=p6;
        c_2=c_1;c_1=c;   
         b_2=b_1;b_1=b;
         
     end   
     E(iii)=sum(abs(e));
end
figure(1);
 plot(outputn,'r')
 hold on
 plot(yn,'b')
 hold on
 plot(outputn-yn,'g');
 legend('实际输出','预测输出','误差','fontsize',12)
 title('训练数据预测','fontsize',12)
 xlabel('样本序号','fontsize',12)
 ylabel('水质等级','fontsize',12)
%% 网络预测
 %数据归一化
 inputn_test=mapminmax('apply',input_test,inputps);
 [n,m]=size(inputn_test)
 for k=1:m
     x=inputn_test(:,k);
          
      %计算输出中间层
      for i=1:I
          for j=1:M
              u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
          end
      end
      
      for i=1:M
          w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i);
      end
                  
      addw=0;
      for i=1:M  
          addw=addw+w(i);
      end
          
      for i=1:M  
          yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6);        
      end
          
      addyw=0;        
      for i=1:M    
          addyw=addyw+yi(i)*w(i);        
      end
          
      %计算输出
      yc(k)=addyw/addw;
 end
%预测结果反归一化
 test_simu=mapminmax('reverse',yc,outputps);
 %作图
 figure(2)
 plot(output_test,'r')
 hold on
 plot(test_simu,'b')
 hold on
 plot(test_simu-output_test,'g')
 legend('实际输出','预测输出','误差','fontsize',12)
 title('测试数据预测','fontsize',12)
 xlabel('样本序号','fontsize',12)
 ylabel('水质等级','fontsize',12)
%% 实际水质预测
 load  data2 hgsc gjhy dxg
 %%  秦玺水厂-------
 zssz=hgsc;
 %数据归一化
 inputn_test =mapminmax('apply',zssz,inputps);
 [n,m]=size(zssz);
for k=1:1:m
     x=inputn_test(:,k);
         
     %计算输出中间层
     for i=1:I
         for j=1:M
             u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
         end
     end
     
     for i=1:M
         w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i);
     end
                 
     addw=0;
         
     for i=1:M   
         addw=addw+w(i);
     end
         
     for i=1:M   
         yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6);        
     end
         
     addyw=0;        
     for i=1:M    
         addyw=addyw+yi(i)*w(i);        
     end
         
     %计算输出
     szzb(k)=addyw/addw;
 end
 szzbz1=mapminmax('reverse',szzb,outputps);
for i=1:m
     if szzbz1(i)<=1.5
         szpj1(i)=1;
     elseif szzbz1(i)>1.5&&szzbz1(i)<=2.5
         szpj1(i)=2;
     elseif szzbz1(i)>2.5&&szzbz1(i)<=3.5
         szpj1(i)=3;
     elseif szzbz1(i)>3.5&&szzbz1(i)<=4.5
         szpj1(i)=4;
     else
         szpj1(i)=5;
     end
 end
 %% 高升水厂------
 zssz=gjhy;
 inputn_test =mapminmax('apply',zssz,inputps);
 [n,m]=size(zssz);
for k=1:1:m
     x=inputn_test(:,k);
         
     %计算输出中间层
     for i=1:I
         for j=1:M
             u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
         end
     end
     
     for i=1:M
         w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i);
     end
                 
     addw=0;
         
     for i=1:M   
         addw=addw+w(i);
     end
         
     for i=1:M   
         yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6);        
     end
         
     addyw=0;        
     for i=1:M    
         addyw=addyw+yi(i)*w(i);        
     end
         
     %计算输出
     szzb(k)=addyw/addw;
 end
 szzbz2=mapminmax('reverse',szzb,outputps);
for i=1:m
     if szzbz2(i)<=1.5
         szpj2(i)=1;
     elseif szzbz2(i)>1.5&&szzbz2(i)<=2.5
         szpj2(i)=2;
     elseif szzbz2(i)>2.5&&szzbz2(i)<=3.5
         szpj2(i)=3;
     elseif szzbz2(i)>3.5&&szzbz2(i)<=4.5
         szpj2(i)=4;
     else
         szpj2(i)=5;
     end
 end
 %% ----重风水厂
 zssz=dxg;
 inputn_test =mapminmax('apply',zssz,inputps);
 [n,m]=size(zssz);
for k=1:1:m
     x=inputn_test(:,k);
         
     %计算输出中间层
     for i=1:I
         for j=1:M
             u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
         end
     end
     
     for i=1:M
         w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i);
     end
                 
     addw=0;
         
     for i=1:M   
         addw=addw+w(i);
     end
         
     for i=1:M   
         yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6);        
     end
         
     addyw=0;        
     for i=1:M    
         addyw=addyw+yi(i)*w(i);        
     end
         
     %计算输出
     szzb(k)=addyw/addw;
 end
 szzbz3=mapminmax('reverse',szzb,outputps);
for i=1:m
     if szzbz3(i)<=1.5
         szpj3(i)=1;
     elseif szzbz3(i)>1.5&&szzbz3(i)<=2.5
         szpj3(i)=2;
     elseif szzbz3(i)>2.5&&szzbz3(i)<=3.5
         szpj3(i)=3;
     elseif szzbz3(i)>3.5&&szzbz3(i)<=4.5
         szpj3(i)=4;
     else
         szpj3(i)=5;
     end
 end
figure(3)
 plot(szzbz1,'o-r')
 hold on
 plot(szzbz2,'*-g')
 hold on
 plot(szzbz3,'*:b')
 xlabel('时间','fontsize',12)
 ylabel('预测水质','fontsize',12)
 legend('秦玺水厂','高升水厂','重风水厂','fontsize',12)
  
3.运行结果

 
 



















![P31[10-1]软件模拟IIC通信协议(使用stm32库函数)(内含:实物连接+IIC时序解释+硬件电路+IIC基本时序单元(起始 终止 发送接收 ))](https://img-blog.csdnimg.cn/8daa1d681c6e45aa986067e0d8329314.png)