您的位置:首页 > 理论基础 > 计算机网络

BP神经网络初步应用(数据预处理)基于matlab

2017-09-10 23:20 232 查看
由于数模比赛临近,本人最近初步了解了一下BP神经网络,但是大部分的知识并不了解,更多做的工作是如何应用和快速上手。

关于入门BP神经网络的资料展示如下:

http://www.jianshu.com/p/3d96dbf3f764 这个是有关BP神经网络的概念介绍

http://playground.tensorflowjiaocheng.com/#activation=tanh&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=4,2&seed=0.38809&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false一个好玩的神经网络

说一下本人对神经网络 一个初步认识:首先,神经网络分为输入层,隐藏层,输出层,每一层隐藏层都有若干神经元,每一层输入层到隐藏层到输出层,主要改变的值就是每一个神经元的权重,而这些神经元进行运算之后所想要得到的是数据的特征。所以,我的理解是BP神经网络有助于找出数据的特征,并根据数据的特征得到分类的效果。

说了这么多,我们主要想做的事情还是应用。所以,基于matlab,在此给出了关于BP神经网络函数包的使用:

newff函数的格式为:

net=newff(PR,[S1 S2 …SN],{TF1 TF2…TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:

PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;

PR:指得是你的训练数据在每一个维度的最大值和最小值,范围越准确,训练的速度和准确度越快

Si:第i层神经元个数;

神经网络每一层的神经元个数

TFi:第i层的传递函数,默认函数为tansig函数;

BTF:训练函数,默认函数为trainlm函数;

BLF:权值/阈值学习函数,默认函数为learngdm函数;

PF:性能函数,默认函数为mse函数。

下面几个参数,初学者一般用默认值

一段最简单神经网络初始化,训练,进行预测的步骤,函数代码如下所示:

p = [0 1 0 5 1 3 2 2 2 1 19 18 23 17 43 12 2 17 19 23;
1 2 0 4 1 1 1 4 0 1 13 15 13 11 9 9 2 14 12 7;
5 5 8 0 10 9 5 7 11 9 0 0 1 0 0 0 3 1 0 0;
7 10 16 2 11 9 6 5 8 6 0 0 0 1 0 0 3 2 0 0;
10 11<
ddab
/span> 15 2 11 12 12 9 5 6 2 1 1 1 0 1 1 0 1 1];
P = [9 2 3 13 3 15 3 10 3 2 6 5 9 2 2 2 2 16 2 18;
7 4 4 8 5 9 6 12 3 3 12 4 7 3 2 4 4 10 2 10;
0 0 4 1 5 0 2 1 7 0 2 2 0 4 2 1 3 1 2 1;
0 2 8 0 1 1 5 0 7 0 1 3 0 3 3 1 1 1 0 2;
2 3 9 1 2 1 8 1 5 0 2 1 1 5 4 1 3 1 1 2];
t = [1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0];
net=newff([0 20;0 16;0 12;0 12;0 13],[3 1],{'logsig' 'purelin'},'traingdx');
net.trainparam.show=100;
%两次显示之间的训练步数
net.trainparam.lr=0.5;  %学习率
net.trainparam.mc=0.8;  %惯性常数
net.trainparam.epochs=20000; %迭代次数
net.trainparam.goal=0.01; %训练目标
[net,tr]=train(net,p,t);  %进行训练
Y=sim(net,p);
a=sim(net,P);


net结构体就是我们训练出来的神经网络,可以用net进行仿真,得到预测分类数据。matlab出来的相关训练窗口如下所示:



Epoch表示迭代数,Time表示运行时间,Performance:表示训练的情况如何,如果训练到Performance达到0.1或者迭代数达到我们的最大迭代数则训练结果,以下的Plots框框中的Performance,Training State,Regression表示迭代过程中,对应Performance图的变化。

接下来是对一个实际例子进行运算:

以下是对一个乳腺肿瘤文件的计算,

题目内容如下:

乳腺肿瘤病灶组织的细胞核显微图像数据包含10个量化特征(细胞核半径、质地、周长、面积、光滑性、紧密度、凹陷度、凹陷点数、对称度、断裂度),这些特征与肿瘤的性质有密切关系。试建立诊断肿瘤是良性还是恶性的数学模型。

数据见data.mat

第一列为病例编号,第二例为确诊结果,良性、恶性分别用1,2标识,第3-12列为量化特征,第13-22为相应 的标准差,23-32为相应的最坏值。

首先,先看数据的类型情况,很明显从题目和数据得到两个特点。

1. 原始数据是一个十维数据,很明显需要降维,降维到5-6维会比较好处理,降维的方法本人采用的是PCA(主层次分析法)

2. 原始数据的10维特征的量纲不同,并且异常值较多,所以剔除异常值和归一化也是必须要做的。

本人使用的剔除异常值的方法是 拉依达准则法(3δ)

这个方法简单好用,可以简单概括为一个公式

P(|x−μ|>3σ)<=0.03

即一般认为>3σ的值为异常值,便可得到异常值,在此数据的异常值我选择剔除。

剔除之后再进行无量纲化

至于PCA,matlab中常用的公式为:

[pc, score, variance, t2]=princomp(X)

列表示维数,行表示样本数。

输出变量:

① pc 主分量zi的系数(ci1,…,cip) ,也叫因子系数;注意:pcTpc=单位阵

② score是主分量下的得分值;得分矩阵与数据矩阵X的阶数是一致的;

③ variance是score对应列的方差向量,即相关系数矩阵R的特征值;容易计算方差所占的百分比

percent-v = 100*variance/sum(variance);

④ t2表示检验的t2-统计量(主要用于方差分析)

以下给出一个例子中的输出参数:

z1 z2 z3 z4

pc = x1 0.7000 0.0950 -0.2400 0.6659

x2 0.6898 -0.2836 0.0585 -0.6636

x3 0.0879 0.9042 -0.2703 -0.3189

x4 0.1628 0.3050 0.9305 0.1208

variance =[ 1.7183 1.0935 0.9813 0.2069];



变量variance的前几列如果方差所占百分比够大的话。

因为前三项综合指标的信息量已经达到94.828%

选择前3个等式。由此,便可以从4维的变量降到三维。

由于13-22为相应的标准差,标准差越大,说明数据变动越大,数据越不可信,所以我对特征数值的计算公式为:(指标最差值-指标数据值)*(数据标准差归一化的导数)

对神经网络进行训练,并用神经网络来预测,相关的数据代码我保存在我的github上

https://github.com/HBKO/math-model-practice-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: