标题:有点挑战!!求教高手 matlab实现bp神经网络拟合函数,如何加入约束条件
只看楼主
huangxinghao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-7
 问题点数:0 回复次数:3 
有点挑战!!求教高手 matlab实现bp神经网络拟合函数,如何加入约束条件
发个老程序为例
clc
clear
close all

%---------------------------------------------------
% 产生训练样本与测试样本

P1 = 1:2:200;                   % 训练样本,每一列为一个样本
T1 = sin(P1*0.1);               % 训练目标

P2 = 2:2:200;                   % 测试样本,每一列为一个样本
T2 = sin(P2*0.1);               % 测试目标

%---------------------------------------------------
% 归一化

[PN1,minp,maxp,TN1,mint,maxt] = premnmx(P1,T1);
PN2 = tramnmx(P2,minp,maxp);
TN2 = tramnmx(T2,mint,maxt);

%---------------------------------------------------
% 设置网络参数

NodeNum = 20;                   % 隐层节点数
TypeNum = 1;                    % 输出维数

TF1 = 'tansig';TF2 = 'purelin'; % 判别函数(缺省值)
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';

net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});

%

%---------------------%

net.trainParam.show = 20;          % 训练显示间隔
net.trainParam.lr = 0.3;            % 学习步长 - traingd,traingdm
net.trainParam.mc = 0.95;           % 动量项系数 - traingdm,traingdx
net.trainParam.mem_reduc = 1;      % 分块计算Hessian矩阵(仅对Levenberg-Marquardt算法有效)
net.trainParam.epochs = 1000;       % 最大训练次数
net.trainParam.goal = 1e-8;         % 最小均方误差
net.trainParam.min_grad = 1e-20;    % 最小梯度
net.trainParam.time = inf;          % 最大训练时间

%---------------------------------------------------
% 训练

net = train(net,PN1,TN1);     % 训练

%---------------------------------------------------
% 测试

YN1 = sim(net,PN1);             % 训练样本实际输出
YN2 = sim(net,PN2);             % 测试样本实际输出

MSE1 = mean((TN1-YN1).^2)       % 训练均方误差
MSE2 = mean((TN2-YN2).^2)       % 测试均方误差

%---------------------------------------------------
% 反归一化

Y2 = postmnmx(YN2,mint,maxt);

%---------------------------------------------------
% 结果作图

plot(1:length(T2),T2,'r+:',1:length(Y2),Y2,'bo:')
title('+为真实值,o为预测值')
搜索更多相关主题的帖子: 神经网络 matlab 约束条件 函数 拟合 
2008-11-09 20:56
huangxinghao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-7
得分:0 
比如约束条件为函数定义域为多少到多少之间,或者值域在多少之间,特定的x一定对应特定的y
2008-11-09 20:58
hitzhang
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:21
帖 子:369
专家分:52
注 册:2006-9-24
得分:0 
限制值域的一个比较笨的方法:

可以把输出节点的传递函数设置成logsig,把输出之限制在0,1之间,比如你的输出值是
>> x=1:6

x =

     1     2     3     4     5     6

要求输出在[0 10]范围内,那么你可以把x先在这个范围内归一化
>> x=x/10

x =

    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000
现在你可以用logsig函数作为输出节点传递函数了,但是输出的值要经过反归一化才能得到你想要的结果
>> x=x*10

x =

     1     2     3     4     5     6

对于定义域:
net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});%的minmax已经给你完成了,
至于特定的x一定对应特定的y,你是不是要求严格相等阿?我的观点是,把这些有特定要求的点,在训练完之后再训练,不行再训练,但有可能导致一个病态的结果。
收到的鲜花
  • meteora11062008-11-09 23:05 送鲜花  49朵   附言:谢谢

2008-11-09 22:04
huangxinghao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-7
得分:0 
谢谢,版主亲自解释,我知道了 ,就是都搞几个 对应特定值 的样本训练再不行就多搞
有其他方法也请告诉我,比如 把输出的net函数值域最大最小值限定什么的
谢谢了
2008-11-11 17:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-243270-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.506785 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved