神经网络算法初探

神经网络算法,其本质其实是一种有向图。从输入层通过节点(神经元)的加权输入到下一层节点,直到输出层。

可以参考知乎上的科普版神经网络

下面所采用的编程语言是matlab

步骤如下所示:

1、读取训练数据,并对其进行归一化

2、构造期望的输出值

3、创建神经网络,并设置训练参数

4、基于训练数据对神经网络进行训练

5、读取测试数据,并对其进行归一化

6、进行仿真

7、统计正确的识别率

将Iris数据集分为2组,每组各75个样本,每组中每种花各有25个样本。其中一组作为以上程序的训练样本,另外一组作为检验样本。为了方便训练,将3类花分别编号为1,2,3 。使用这些数据训练一个4输入(分别对应4个特征),3输出(分别对应该样本属于某一品种的可能性大小)的前向网络。

clc;
clear all;
%读取训练数据
[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);
//If N is specified, the format string is reused N times.  If N is -1 (or
//not specified) TEXTREAD reads the entire file.
//该训练数据针对的是3层的神经网络

//特征值归一化。
[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]');
//用于将网络的输入数据或输出数据进行归一化,此处是将输入数据进行归一化!
//[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T) 
//其中P,T分别为原始输入和输出数据,minp和maxp分别为P中的最小值和最大值。
//mint和maxt分别为T的最小值和最大值。 
//此时的minI= min([f1 , f2 , f3 , f4 ]',[],2)
//此时的max =max([f1 , f2 , f3 , f4 ]',[],2)
//训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据
//也应该和样本数据接受相同的预处理,这就要用到tramnmx。在下面可以看到其使用情况
//
//构造输出矩阵
s = length( class ) ;
output = zeros( s , 3  );%所期望的输出值
for i = 1 : s 
   output( i , class( i )  ) = 1 ;
end

//创建神经网络(feed-forward backpropagation network)
net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; 
//第1层有10个神经元,第2层有3个神经元,所属层对应的传输函数分别为'logsig' 'purelin'
//net=newff(PR,[S1 S2 ...SN],{TF1 TF2...TFN},BTF,BLF,PF)
// PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;
//Si:第i层神经元个数;
// TFi:第i层的传递函数,对于隐含层默认函数为tansig函数;对于输出层则为 'purelin'
//可选:TANSIG, LOGSIG, or PURELIN
// BTF:训练函数,默认函数为trainlm函数;可选:TRAINLM, TRAINBFG, TRAINRP, TRAINGD
// BLF:权值/阀值学习函数,默认函数为learngdm函数;
// PF:性能函数,默认函数为mse函数。
// minmax(input)求解每个行向量中最小值和最大值,返回值第1列为所对应行的最小值,第二列为所对应行的最大值。

%设置训练参数
net.trainparam.show = 50 ;//设置数据显示刷新频率,学习次刷新一次图象。显示训练迭代过程
net.trainparam.epochs = 500 ;//设置训练次数
net.trainparam.goal = 0.01 ;//设置训练的目标结果,训练精度 
net.trainParam.lr = 0.01 ;//学习速率
//lr为反向修正时候的步长参数,这个参数越大,网络每次修正的值越大,
// 收敛快,网络最终结果可能差,小,每次修正的值越小,收敛慢,
// 但是网络最终的结果可能比较好

%开始训练
net = train( net, input , output' ) ;

%读取测试数据
[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);

%测试数据归一化
testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;
// [Pn]=tramnmx(P,minp,maxp) 
//其中P和Pn分别为变换前、后的输入数据,
//maxp和minp分别为premnmx函数找到的最大值和最小值。 
%%
%仿真
Y = sim( net , testInput ) 

//统计识别正确率
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
    [m , Index] = max( Y( : ,  i ) ) ;
    if( Index  == c(i)   ) 
        hitNum = hitNum + 1 ; %当最大值所在的行数与c(i)相等时,即为正确值
//         if(Index>1)
//             disp(Index);
//         end
    end
end
sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )

    原文作者:神经网络算法
    原文地址: https://blog.csdn.net/ljp1919/article/details/42530497
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞