冰冰点灯,照亮我家门前~
欢迎进入nnetinfo
用户名:
密码:
深圳学习数据分析,数据挖掘,请联系yahushuxue@163.com~
nnetinfo : 本网发布神经网络相关的学习与研讨内容。
当前位置:教学区
闲谈神经网络--写给初学者(三)
作者:快跑小乌龟   日期:2015-11-19 14:52:08.0

本文转自《快跑小乌龟》,原文地址:http://www.cnblogs.com/wuguanglei/p/4060314.html

接上篇。

  前面两篇讲解了神经网络就是一个黑箱,里面有一个一个的小圆球(神经元)连接而成,通过改变神经元的连接方式及各个参数,就可以实现一个符合要求的神经网络。接下来我们来举一个BP神经网络的例子,以加深理解。

  在讲解这个例子之前,大概说一下一个神经网络解决问题的思路:

  1.对要解决的问题进行理解,找到输入输出数据。

  2.把已知的输入输出数据分为两部分:一部分用来训练网络;另外一部分来验证训练的网络到底好不好用。

  3.对输入数据进行预处理及归一化处理。

  4.创建合适的网络,如BP、感知器、RBF、Hopfield等等。(其实是先建立一个神经网络的黑箱子)

  5.设置网络训练参数,例如设置训练函数,学习函数、激活函数等等。

  6.使用输入输出训练网络。(其实是把黑箱子里面的神经元的各个参数给训练和学习合适了)

  7.使用验证数据验证网络。

  8.验证后觉得网络还不错,就可以实际应用,在实际应用过程中,还可以再对模型进行优化、重构等等。

下面开始我们例子的说明,用一个传统的花分类的例子(http://en.wikipedia.org/wiki/Iris_flower_data_set ):大概意思是:给你一朵花的四个特征,神经网络输出它的品种(共有三个品种)。

所以每一个样本的输入:四个数据,代表花的四个特征;输出:一个数据,代表花的品种,分别为1,2,3代表三个不同的品种。

样本数据为:http://files.cnblogs.com/wuguanglei/%E6%95%B0%E6%8D%AE.rar

其中trainData.txt用作训练数据,testData.txt用作验证数据。Matlab程序代码如下:

%0.操作前
clear;
close all;
clc;
%1.读入训练数据
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);
input=[f1,f2,f3,f4]';%神经网络是一列算做一个样本输入,因此矩阵要转置一下
output=class';
%2.输入数据归一化
[input,Se] = mapminmax(input)  ;
minI=Se.xmin;
maxI=Se.xmax;
%3.构造输出数据矩阵
s = length( class) ;%输出为1,2,3,这用1 0 0表示1;0 1 0表示2;0 0 1表示3
output = zeros( 3, s  ) ;
for i = 1 : s
   output( class( i ),i  ) = 1 ;
end
 
%4.创建神经网络
net = newff( minmax(input) , [70 3] , { 'logsig' 'logsig' } , 'traingdx' ) ; %其中70表示第一层70个神经元,第二层30个神经元,后面几个参数分别设置的是激活函数和训练函数。
 
%5.设置训练参数
net.trainparam.show = 40 ;
net.trainparam.epochs = 600 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;
 
%6.开始训练
[net,tr,e] = train( net, input , output ) ;
 
%7.测试网络
[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);
testInput=[t1,t2,t3,t4]';
testInput = mapminmax (testInput ) ;
Y = sim( net , testInput ) ;
 
%8.统计结果
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
    [m , Index] = max( Y( : ,  i ) )
    if( Index  == c(i)   )
        hitNum = hitNum + 1 ;
    end
end
sprintf('识别率是 %0.3f%%',100 * hitNum / s2 )

详细讲解看代码注释吧。

就先写到这儿吧,对于入门,应该够了。

(完)

  文档信息