找回密码
 注册
Simdroid-非首页
查看: 118|回复: 7

模糊神经网络,没有可供参考的标准数据值的一个问题

[复制链接]
发表于 2010-8-29 09:46:15 | 显示全部楼层 |阅读模式 来自 湖南长沙
本帖最后由 messenger 于 2010-8-29 17:24 编辑

最近在做一道利用模糊神经网络进行水质评价的题:
在对网络进行训练时往往需要一组历史数据、理论数据或者所谓的标准数据,可是在一般的评价问题中,一般是没有可供参考的标准数据值(因为往往评价的指标以及打分方式都是由评价者来确定的),于是往往就需要人工产生一组数据,可是却不知道如何产生这组数据的目标值,对于这一类问题,请问有没有人遇见过呢?你一般是如何解决的呢?

以下是对该模糊网络进行训练的代码(代码中知识随机产生了训练数据,并没有产生训练数据的目标值):
  1. %% 清空环境变量
  2. clc
  3. clear

  4. %% 参数初始化
  5. xite=0.001;
  6. alfa=0.05;

  7. %网络节点
  8. I=4;   %输入节点数   
  9. M=12;  %隐含节点数
  10. O=1;   %输出节点数

  11. %系数初始化
  12. p0=0.3*ones(M,1);p0_1=p0;p0_2=p0_1;
  13. p1=0.3*ones(M,1);p1_1=p1;p1_2=p1_1;
  14. p2=0.3*ones(M,1);p2_1=p2;p2_2=p2_1;
  15. p3=0.3*ones(M,1);p3_1=p3;p3_2=p3_1;
  16. p4=0.3*ones(M,1);p4_1=p4;p4_2=p4_1;

  17. %参数初始化
  18. c=1+rands(M,I);c_1=c;c_2=c_1;
  19. b=1+rands(M,I);b_1=b;b_2=b_1;

  20. maxgen=100; %进化次数

  21. %% 随机产生一组训练数据
  22. input_train(1,:)=100*rand(1,300);
  23. input_train(2,:)=1000*rand(1,300);
  24. input_train(3,:)=5*rand(1,300);
  25. input_train(4,:)=5*rand(1,300);
  26. input_test(1,:)=100*rand(1,300);
  27. input_test(2,:)=1000*rand(1,300);
  28. input_test(3,:)=5*rand(1,300);
  29. input_test(4,:)=5*rand(1,300);
  30. %%
  31. %选连样本输入输出数据归一化
  32. [inputn,inputps]=mapminmax(input_train);
  33. [n,m]=size(input_train);

  34. %% 网络训练
  35. %循环开始,进化网络
  36. for iii=1:maxgen
  37.     %iii
  38.     for k=1:m        
  39.         x=inputn(:,k);
  40.         
  41.         %输出层结算
  42.         for i=1:I
  43.             for j=1:M
  44.                 u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
  45.             end
  46.         end
  47.         
  48.         %模糊规则计算
  49.         for i=1:M
  50.             w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i);
  51.         end   
  52.         addw=sum(w);
  53.         
  54.         for i=1:M
  55.             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);
  56.         end
  57.         
  58.         addyw=yi*w';
  59.         %网络预测计算
  60.         yn(k)=addyw/addw;
  61.         e(k)=outputn(k)-yn(k);%误差计算不能实现
  62.         
  63.         %计算p的变化值
  64.         d_p=zeros(M,1);
  65.         d_p=xite*e(k)*w./addw;
  66.         d_p=d_p';
  67.         
  68.         %计算b变化值
  69.         d_b=0*b_1;
  70.         for i=1:M
  71.             for j=1:I
  72.                 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);
  73.             end
  74.         end  
  75.         
  76.         %更新c变化值
  77.         for i=1:M
  78.             for j=1:I
  79.                 d_c(i,j)=xite*e(k)*(yi(i)*addw-addyw)*2*(x(j)-c(i,j))*w(i)/(b(i,j)*addw^2);
  80.             end
  81.         end
  82.         
  83.         p0=p0_1+ d_p+alfa*(p0_1-p0_2);
  84.         p1=p1_1+ d_p*x(1)+alfa*(p1_1-p1_2);
  85.         p2=p2_1+ d_p*x(2)+alfa*(p2_1-p2_2);
  86.         p3=p3_1+ d_p*x(3)+alfa*(p3_1-p3_2);
  87.         p4=p4_1+ d_p*x(4)+alfa*(p4_1-p4_2);
  88.             
  89.         b=b_1+d_b+alfa*(b_1-b_2);      
  90.         c=c_1+d_c+alfa*(c_1-c_2);
  91.    
  92.         p0_2=p0_1;p0_1=p0;
  93.         p1_2=p1_1;p1_1=p1;
  94.         p2_2=p2_1;p2_1=p2;
  95.         p3_2=p3_1;p3_1=p3;
  96.         p4_2=p4_1;p4_1=p4;

  97.         c_2=c_1;c_1=c;   
  98.         b_2=b_1;b_1=b;
  99.         
  100.     end   
  101.     E(iii)=sum(abs(e));

  102. end

  103. figure(1);
  104. plot(outputn,'r')
  105. hold on
  106. plot(yn,'b')
  107. % hold on
  108. % plot(outputn-yn,'g');
  109. legend('实际输出','预测输出','fontsize',12)
  110. title('训练数据预测','fontsize',12)
  111. xlabel('样本序号','fontsize',12)
  112. ylabel('水质等级','fontsize',12)

  113. %% 网络预测
  114. %数据归一化
  115. inputn_test=mapminmax('apply',input_test,inputps);
  116. [n,m]=size(inputn_test);
  117. for k=1:m
  118.     x=inputn_test(:,k);
  119.          
  120.      %计算输出中间层
  121.      for i=1:I
  122.          for j=1:M
  123.              u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
  124.          end
  125.      end
  126.      
  127.      for i=1:M
  128.          w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i);
  129.      end
  130.                  
  131.      addw=0;
  132.      for i=1:M  
  133.          addw=addw+w(i);
  134.      end
  135.          
  136.      for i=1:M  
  137.          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);        
  138.      end
  139.          
  140.      addyw=0;        
  141.      for i=1:M   
  142.          addyw=addyw+yi(i)*w(i);        
  143.      end
  144.          
  145.      %计算输出
  146.      yc(k)=addyw/addw;
  147. end

  148. %预测结果反归一化
  149. test_simu=mapminmax('reverse',yc,outputps);
  150. %作图
  151. figure(2)
  152. plot(output_test,'r')
  153. legend('预测输出''fontsize',12)
  154. title('测试数据预测','fontsize',12)
  155. xlabel('样本序号','fontsize',12)
  156. ylabel('水质等级','fontsize',12)
复制代码
发表于 2010-8-29 12:35:15 | 显示全部楼层 来自 四川成都
Simdroid开发平台
本帖最后由 lengyunfeng 于 2010-8-29 12:39 编辑

我对你说的问题没什么概念,不过模糊神经网络应该是将模糊理论和神经网络相结合起来的,二者的优势互补应该能解决你的问题吧。说白点,模糊理论里的专家权系数我们刚开始可以用随机数完成,然后代入神经网络进行处理对比,找到误差,将误差均分后返还给这些权系数并依此修改原权系数,然后再用神经网络对修改权系数后的问题进行处理对比自学习,直到误差满足你的要求。在baidu文库里找了一下(http://baike.baidu.com/view/2161097.htm?fr=ala0_1),内容如下:

  1. 模糊神经网络有如下三种形式:
  2. 1.逻辑模糊神经网络
  3. 2.算术模糊神经网络
  4. 3.混合模糊神经网络
  5. 模糊神经网络就是具有模糊权系数或者输入信号是模糊量的神经网络。上面三种形式的模糊神经网络中所执行的运算方法不同。   模糊神经网络无论作为逼近器,还是模式存储器,都是需要学习和优化权系数的。学习算法是模糊神经网络优化权系数的关键。对于逻辑模糊神经网络,可采用基于误差的学习算法,也即是监视学习算法。对于算术模糊神经网络,则有模糊BP算法,遗传算法等。对于混合模糊神经网络,目前尚未有合理的算法;不过,混合模糊神经网络一般是用于计算而不是用于学习的,它不必一定学习。
复制代码
看你的代码注释,好像并没有做权系数优化工作吧?如果你没有把模糊理论里的权系数采用神经网络进行优化的话,那你的代码就称不上“模糊神经网络”。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-8-29 15:26:57 | 显示全部楼层 来自 湖南长沙
2# lengyunfeng
       谢谢斑竹的详细回答!
       一开始用随机数给的专家权系数要怎么修正呢?这里说的误差不就是目标值和预测值的差值吗?可是一开始的目标值要怎么制定呢?现在的情况就是我手头没有可以用来训练的数据。那还可不可以对网络进行训练呢?
回复 不支持

使用道具 举报

发表于 2010-8-29 16:51:50 | 显示全部楼层 来自 四川成都
本帖最后由 lengyunfeng 于 2010-8-29 17:57 编辑

抛开理论不谈,你已有的就是一堆的已知监测数据(在这里就是你的水样本的一系列指标)及其对应的评价结果(在这里就是这个样本的评价分数,比如对应于某个水库的水样其分数为70分之类的),你想摸清楚的就是根据这些已有的东西找出一个监测数据与评价结果的一个转换方式(在实际中就是各项指标对应的专家权系数),你的目标就是根据你所获得的转换方式来对一个未知样本当已知其监测数据时来找到对应该评价系统的评价结果。你的各种理论只是说实现这一过程而已,就你的方法而言应该就是:1)先假定一组权系数,它用随机数生成;2)用权系数与测量指标通过一定的计算获得在这一组权系数下的评价结果(如用权系数乘以水样本各项指标值之和);3)用2)里的评价结果和其对应数据的实际评价结果对比,算出误差;4)当误差过大时,采用一定的办法将误差分布到各项测量指标中去,然后重复2~4步,直至4步不满足。这里涉及到了神经网络的东西,我不是很清楚,不过应该就是通过不断修改权系数以使理论计算值与实际值尽量接近,而这种修改方法就是模糊神经网络的精华所在,你要保证你的搜索方法是收敛的、快速的。5)当误差达到要求时,即可停止训练,并进入预测阶段。说白了,模糊神经网络其实就是一个自变量个数过多而数据组数过少时的一种预测方法,要预测必须要有已知的东西,你如果没有一组完整的监测及对应评价结果,那不管你是什么方法都是闭门造车的瞎搞。至于在没有已知数据的情况下是否能够进行网络训练,我认为如果你只想知道你的程序思路是否有效的前提下应该是可以的,在这种情况下你可以根据你的专业知识假定出一系列不违反客观规律的监测数据及评价结果,然后带到你的程序中进行处理,最后就能获得在你假定数据情况下的网络系统,当然这一系统不能用在实际中,它只能说明你的编程思路没问题,以后当你有了实际的数据时,就可以代到这里面进行真实处理了。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-8-29 18:06:10 | 显示全部楼层 来自 湖南长沙
首先非常感谢版主的耐心回答!!!
不过对下面那句话我有一点问题:
  1. 抛开理论不谈,你已有的就是一堆的已知监测数据(在这里就是你的水样本的一系列指标)及其对应的评价结果
复制代码


现在我的情况是只有一堆已知的监测数据,没有对应的评价结果,请问那还可以利用模糊神经网络吗?
回复 不支持

使用道具 举报

发表于 2010-8-29 20:27:20 | 显示全部楼层 来自 四川成都
不行。你所有的后序工作都是基于你已经有完整的数据,而且这种完整的数据组数最好大于6组以上,没有的话就不可能做其它工作。我觉得模糊神经网络应该是一套类似于数据拟合的计算方法,只不过它的已知条件要少得多(也就是数据组数相对于自变量个数要小得多)。现在你提的问题就相当于给定了一堆自变量,却不给出其函数关系以及部分自变量及其对应的函数结果,那你怎么进行其它自变量组合的预测?没有给定指定的函数关系,肯定是不能算出来的;没有已知的自变量、因变量组合,想猜也不可能猜出来。巧妇难为无米之炊说的就是这种情况
回复 不支持

使用道具 举报

 楼主| 发表于 2010-8-29 20:49:45 | 显示全部楼层 来自 湖南长沙
是的,所以目前我们只能够通过一些经典的评价模型,比如说模糊评价模型,层次分析法,灰色评价模型,之类的,根据一套具体的评价方法得出最后的评价结果,那么神经网络能够用在后面吗?进行验证之类的?
回复 不支持

使用道具 举报

发表于 2010-8-29 21:32:23 | 显示全部楼层 来自 四川成都
本帖最后由 lengyunfeng 于 2010-8-29 21:33 编辑

7# starbinbin_csu
个人觉得你还是没有理清自己的思路。做任何事都要搞清你手上有什么,你想得到什么,然后再图怎么从手上已有的去得到你想要的。

你前面举的一大堆评价方法都可以用,不过既然你都已经有了评价系统,那你何必再用神经网络呢?评价方法都出来了,那何来的验证呢?就你在1#反映的问题,应该是在已知评价目标各类特征以及评价结果,但却不知道评价过程,想找某种方法从已知的数据里去找出这个评价过程,以此来对其它评价目标进行评价。

所谓模糊神经网络只不过是一个披着五颜六色外衣,听起来吓人一种预测方法罢了,没必要整一些言必称希腊,语必言孔子之类的花花架子。年青人千万不要去搞那种形式主义,屁用没有。

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 14:24 , Processed in 0.062775 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表