声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2037|回复: 0

[人工智能] 对向传播神经网络预测问题

[复制链接]
发表于 2008-8-19 16:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我在应用对向传播神经网络(counter propagation network)预测信号时,常出现问题。比如当预测周期的正弦信号时,好像趋势比较好,但是当用衰减信号进行测试时,就没有衰减趋势,只能预测出等幅值的周期信号,不知是哪里出现错误了,请高手帮我看看。
function [hiddenweight,outweight,trainout,err]=CPN_learn(inputdata,numhid,numout,outdata) %%进行数据的训练
[numsample, numfeat]=size(inputdata);
W=rands(numhid,numfeat)/2;
V=rands(numout,numhid)/2;
[numsample, numout]=size(outdata);

T=outdata;
T_out=T;
P=inputdata;
%设定学习步骤为1000
% epoch=1000;
%归一化输入向量P
for i=1:numsample
    if P(i,:)==zeros(1,numfeat)
        P(i,:)=P(i,:);
    else
        P(i,:)=P(i,:)/norm(P(i,:));
    end
end
%开始训练
% while epoch>0
for epoch=1:1000
    for j=1:numsample
%%归一化正向权值W
      for i=1:numhid
        W(i,:)=W(i,:)/norm(W(i,:));
        s(1,i)=P(j,:)*W(i,:)';
      end
      %%求输出为最大的神经元,即为获胜的神经元
      temp=max(s);
      for i=1:numhid
          if temp==s(i);
              count=i;
          end
      end
      %%%将所有竞争层神经元的输出置0
      for i=1:numhid
          s(i)=0;
      end
      %%将获胜神经元的输出置为1
      s(count)=1;
      alpha=1/((epoch+1)^2);
      beita=1/((epoch+1)^2);
%       alpha=0.1*(1-epoch/1000);
%       beita=0.1*(1-epoch/1000);
      %%权值调整
      W(count,:)=W(count,:)+alpha*(P(j,:)-W(count,:));
      W(count,:)=W(count,:)/norm(W(count,:));
      V(:,count)=V(:,count)+beita*(T(j,:)'-T_out(j,:)');
      %%计算网络输出      
      T_out(j,:)=V(:,count)';
    end
    delta=T(:,1)'-T_out(:,1)';
    error=sqrt((sum(delta.^2)/numsample));
    wucha(epoch,1)=error;
    if error<10^-1
       break;
    end
end
hiddenweight=W;
outweight=V;
% numsampnode=numiter;
trainout=T_out;
err=wucha;
return;
%%
function predictdata=CPN_predict(W,V,data)  %%进行数据的预测
%%网络输出
% Outc=0;
% countp=1;
[numsample numfeat]=size(data);
%归一化输入向量P
for i=1:numsample
    if data(i,:)==zeros(1,numfeat)
        data(i,:)=data(i,:);
    else
        data(i,:)=data(i,:)/norm(data(i,:));
    end
end
[numhid numfeat]=size(W);
for j=1:numsample
    for i=1:numhid
        sc(i)=data(j,:)*W(i,:)';
    end
    tempc=max(sc);
    for i=1:numhid
        if tempc==sc(i)
            countp=i;
        end
        sc(i)=0;
    end
%     posi=find(sc==tempc);
%     countp=posi;
    sc(countp)=1;
    Outc=V(:,countp)';
end
predictdata=Outc;
%%
%%%对衰减信号进行预测的程序
t=0:0.001:1;
y=1.*exp(-0.02*150.*t).*sin(sqrt(0.9996)*150.*t+pi/2);%+...
%    2.*exp(-0.01*350.*t).*sin(sqrt(0.9999)*350.*t+pi/2);
figure(1)
subplot(2,1,1)
plot(y)
n=length(y);
y1=y(1:1000);
subplot(2,1,2)
plot(y1)
numFeat=11;numOut=1;
N=numFeat;
for i=1:1000-N*6
    inputx(i,:)=y1(i:6:i+(N-1)*6);
    inputy(i)=y1(i+N*6);
end
data=inputx(1:600,:);
supervisor=inputy(1:600)';
%%%未改进的
W = CPNkron_Learn(data,40);
[V,trainout,err]=CPNgros_learn(data,W,1,supervisor);
% %%%进行数据的预测
% % predtest=y(400-N+1:400);
predtest=inputx(1:934,:);
% for i=1:400
%     currentData=predtest;
%     predictdata(1,i) = CPN_predict(W,V,predtest);
%     predtest=[predtest(2:length(predtest)) predictdata(1,i)];
% end
for i=1:934
    predictdata(1,i)=CPN_predict(W,V,predtest(i,:));
end
%%测试结果进行比较
figure(2)
% plot(1:1000,y(1:1000));
plot(inputy)
hold on
% plot(401:800,predictdata,'r-.')
plot(1:934,predictdata,'r-.')
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-7-6 18:33 , Processed in 0.054590 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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