关键词 神经网络;管网水;预测
1 引言
中国 是一个干旱缺水严重的国家,是全球13个人均水资源最贫乏的国家之一。中国入世以来,伴随着 工业 发展 出现的水环境恶化,水质下降等情况已经严重 影响 到居民的生产和生活。管网水的质量对人民的生活和生命举足轻重。管网水的水质是保证居民健康状况的关键。而如此珍贵的饮用水,经过地下管道中的“长途跋涉”后,才能最终抵达千家万户的水龙头。可惜的是在此过程中,由于饮用水与输送管道“亲密接触”而遭到二次污染,饮用水的清洁程度大打折扣。因此,加强管网水的水质预测和预报对于预防管网水的二次污染和及时处理出现的二次污染 问题 具有重要的意义。
本文是在第一手管网水水质实测数据的基础上进行管网水水质预测的。由于输水管道的布局有很大差别,管道本身又可以看作一个系统,而且我们所讨论的水质实测数据时间序列是服从于线性关系还是非线性关系不易说明白,因此很难建立一个具体的数学模型来预测未来的水质数据。本文将采用BP神经网络模型来预测管网水的水质,并将预测值与实际值做了比较 分析 。针对管网水二次污染的原因,提出相应的对策。
2 BP神经网络的基本简介
1)BP网络结构
BP网络通常有一个或多个隐层,隐层中的神经元均采用S型变换函数,输出层的神经元采用纯线性变换函数。图1描述了一个具有一个隐层的BP网络。

图1 BP网络模型结构
2)BP网络的 学习 过程
目前 在神经网络的实际 应用 中,绝大部分的神经网络模型是采用BP网络和它的变化形式,BP网络也是前馈网络的核心部分,并体现了人工神经网络最精华的部分。BP神经网络一般由一个输入层、多个隐层和一个输出层构成,各层之间实行全连接。隐层中的神经元均采用S型变换函数,输出层的神经元采用纯线性变换函数。BP网络的学习过程主要由四部分组成:
(1) 模式顺传播:输入模式由输入层经中间层向输出层传播。
(2) 误差逆传播:网络的希望输出与网络实际输出之差的误差信号由输出层传经中间层向输入层逐层修正连接权值。
(3) 记忆训练:“模式顺传播”与“误差逆传播”的反复交替进行的网络“记忆训练”过程。
(4) 学习收敛: 网络趋向收敛即网络的全局误差趋向极小值的“学习收敛”过程。
3 预测管网水质参数的BP网络
BP网络可以用于模式识别,即用一个特定的输出矢量将其与输入矢量联系起来。我们所建立的模型是在有大量实测数据基础之上的,数据库中每天都有对PH值、硫酸盐、硝酸盐氮、氨氮、总硬度、永久硬度、氯化物、总碱度、耗氧量这九个水质参数的实测记录。我们选择常用的3层BP神经网络来预测未来某一天的九个水质参数。
为了使网络预测值能够达到与实测值无限的接近我们要对所建立的网络进行训练以获得我们设定的误差范围内的神经网络预测模型的每层的权值和阈值。然后通过访问数据库WaterQualityRecords读出已有的实测数据并赋给输入变量Variable;将最新一天的实测数据赋给TrueValue来检测我们的预测值是否达到要求的依据。下面是读取数据的m语言实现。
connA=database('WaterQualityRecords','','');
% 连接到数据库
cursorA=exec(connA,'SELECT * FROM WaterPlant'); % 执行SQL语句和打开游标
cursorA=fetch(cursorA);
% 读数据到MATLAB单元数组
WaterDataBase=cursorA.Data;
% 读数据到WaterDataBase
for i=1:600
% 前600天的数据赋给Variable
Variable= WaterDataBase (i,:)
end
TrueValue= WaterDataBase (601,:);
% 第601天的数据赋给TrueValue
与数据库连接好以后就可进行网络的自学习过程来训练出网络每层的权值与阈值。使用random阵列来产生网络的初始权值与阈值。为了避免神经网络过训练我们采用交互检验法:即将我们数据库中的实测数据分为训练集、检验集和测试集。首先用训练集训练网络,依照BP算法调整网络结构和参数;然后用检验集检验训练好的网络,进一步优化网络结构和参数,最终确定训练网络中最佳的一个;最后用测试集对未知样本进行测试并检验网络的 计算 精度。下面是学习及预测过程的m语言实现:
Matrix=zeros(30,width);
NeuralI=100;
InData=zeros(NeuralI,6);
GoalData=zeros(6,6);
Neuralo=6;
[R,Q]=size(InData);
[S2,Q]=size(GoalData);
S1=6;
[w1 b1]=rands(S1,R);
[w2 b2]=rands(S2,S1);
max_epoch =400; % 最大训练步数
err_goal =0.01; % 训练目标
lr=0.01; % 学习速率
NNTWARN OFF
for j=1:width
P=PingMeiWaterBase(j,1:end);
simdata=P(end-NeuralI+1-31+x:end-31+x)';
for i=1:Neuralo
InData(:,i)=P(end-NeuralI-Neuralo-1+i:end-Neuralo-2+i)';
GoalData(:,i)=P(end-2*Neuralo+i:end-Neuralo-1+i)';
end
for i=1:max_epoch
A1=tansig(w1*Indata,b1);
A2=purelin(w2*A1,b2);
error= GoalData -A2;
D2=deltalin(A2,error);
D1=deltatan(A1,D2);
[dw1,db1]=learnbp(Indata,D1,lr);
[dw2,db2]=learnbp(A1,D2,lr);
w1=w1+dw1;
w2=w2+dw2;




