一、分類:
1、參考:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html
例子:
%讀取訓練數據 [f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150); %特征值歸一化 [input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ; %構造輸出矩陣 s = length( class) ; output = zeros( s , 3 ) ; for i = 1 : s output( i , class( i ) ) = 1 ; end %創建神經網絡 net = newff( minmax(input) , [10 3] , { 'logsig' 'purelin' } , 'traingdx' ) ; %設置訓練參數 net.trainparam.show = 50 ; net.trainparam.epochs = 500 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ; %開始訓練 net = train( net, input , output' ) ; %這里的input矩陣的行表示特征的維度,列代表一個樣本;output'每一列表示一個樣本的標簽。 %讀取測試數據 [t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150); %測試數據歸一化 testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ; %仿真 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 ; end end sprintf('識別率是 %3.3f%%',100 * hitNum / s2 )
步驟:
1、數據預處理——歸一化
在訓練神經網絡前一般需要對數據進行預處理,一種重要的預處理手段是歸一化處理。下面簡要介紹歸一化處理的原理與方法。
(1) 什么是歸一化?
數據歸一化,就是將數據映射到[0,1]或[-1,1]區間或更小的區間,比如(0.1,0.9) 。
(2) 為什么要歸一化處理?
<1>輸入數據的單位不一樣,有些數據的范圍可能特別大,導致的結果是神經網絡收斂慢、訓練時間長。
<2>數據范圍大的輸入在模式分類中的作用可能會偏大,而數據范圍小的輸入作用就可能會偏小。
<3>由於神經網絡輸出層的激活函數的值域是有限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域。例如神經網絡的輸出層若采用S形激活函數,由於S形函數的值域限制在(0,1),也就是說神經網絡的輸出只能限制在(0,1),所以訓練數據的輸出就要歸一化到[0,1]區間。
<4>S形激活函數在(0,1)區間以外區域很平緩,區分度太小。例如S形函數f(X)在參數a=1時,f(100)與f(5)只相差0.0067。
(3) 歸一化算法
一種簡單而快速的歸一化算法是線性轉換算法。線性轉換算法常見有兩種形式:
<1>
y = ( x - min )/( max - min )
其中min為x的最小值,max為x的最大值,輸入向量為x,歸一化后的輸出向量為y 。上式將數據歸一化到 [ 0 , 1 ]區間,當激活函數采用S形函數時(值域為(0,1))時這條式子適用。
<2>
y = 2 * ( x - min ) / ( max - min ) - 1
這條公式將數據歸一化到 [ -1 , 1 ] 區間。當激活函數采用雙極S形函數(值域為(-1,1))時這條式子適用。
(4) Matlab數據歸一化處理函數
Matlab中歸一化處理數據可以采用premnmx , postmnmx , tramnmx 這3個函數。
<1> premnmx
語法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)
參數:
pn: p矩陣按行歸一化后的矩陣
minp,maxp:p矩陣每一行的最小值,最大值
tn:t矩陣按行歸一化后的矩陣
mint,maxt:t矩陣每一行的最小值,最大值
作用:將矩陣p,t歸一化到[-1,1] ,主要用於歸一化處理訓練數據集。
<2> tramnmx
語法:[pn] = tramnmx(p,minp,maxp)
參數:
minp,maxp:premnmx函數計算的矩陣的最小,最大值
pn:歸一化后的矩陣
作用:主要用於歸一化處理待分類的輸入數據。
<3> postmnmx
語法: [p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)
參數:
minp,maxp:premnmx函數計算的p矩陣每行的最小值,最大值
mint,maxt:premnmx函數計算的t矩陣每行的最小值,最大值
作用:將矩陣pn,tn映射回歸一化處理前的范圍。postmnmx函數主要用於將神經網絡的輸出結果映射回歸一化前的數據范圍。
2、
2. 使用Matlab實現神經網絡
使用Matlab建立前饋神經網絡主要會使用到下面3個函數:
newff :前饋網絡創建函數
train:訓練一個神經網絡
sim :使用網絡進行仿真
下面簡要介紹這3個函數的用法。
(1) newff函數
<1>newff函數語法
newff函數參數列表有很多的可選參數,具體可以參考Matlab的幫助文檔,這里介紹newff函數的一種簡單的形式。
語法:net = newff ( A, B, {C} ,‘trainFun’)
參數:
A:一個n×2的矩陣,第i行元素為輸入信號xi的最小值和最大值;
B:一個k維行向量,其元素為網絡中各層節點數;
C:一個k維字符串行向量,每一分量為對應層神經元的激活函數;
trainFun :為學習規則采用的訓練算法。
<2>常用的激活函數
a) 線性函數 (Linear transfer function)
該函數的字符串為’purelin’。
b) 對數S形轉移函數( Logarithmic sigmoid transfer function )
該函數的字符串為’logsig’。
c) 雙曲正切S形函數 (Hyperbolic tangent sigmoid transfer function )
也就是上面所提到的雙極S形函數。
該函數的字符串為’ tansig’。
Matlab的安裝目錄下的toolbox\nnet\nnet\nntransfer子目錄中有所有激活函數的定義說明。
<3>常見的訓練函數
常見的訓練函數有:
traingd :梯度下降BP訓練函數(Gradient descent backpropagation)
traingdx :梯度下降自適應學習率訓練函數
<4>網絡配置參數
一些重要的網絡配置參數如下:
net.trainparam.goal :神經網絡訓練的目標誤差
net.trainparam.show : 顯示中間結果的周期
net.trainparam.epochs :最大迭代次數
net.trainParam.lr : 學習率
(2) train函數
網絡訓練學習函數。
語法:[ net, tr, Y1, E ] = train( net, X, Y )
參數:
X:網絡實際輸入
Y:網絡應有輸出
tr:訓練跟蹤信息
Y1:網絡實際輸出
E:誤差矩陣
(3) sim函數
語法:Y=sim(net,X)
參數:
net:網絡
X:輸入給網絡的K×N矩陣,其中K為網絡輸入個數,N為數據樣本數
Y:輸出矩陣Q×N,其中Q為網絡輸出個數
二、擬合
例子:擬合曲線
程序:
function BPalg() clear; %X=-4*pi:0.05:4*pi; X=1:100; Y=[]; Y_test=[]; P=length(X); for i=1:P Y(i)=1/X(i)^0.5 %Y(i)=(sin(X(i))/X(i))^2; %Y(i)=exp(-X(i)^2)*sin(X(i)^2); end scatter(X,Y,10,'b'); grid on; hold on; net=newff(minmax(X),[14,1],{'logsig' 'purelin'},'traingdx'); %一個隱藏層,含有神經元14個 net.trainparam.epochs = 1000; net.trainparam.goal = 0.0001 ; net.trainParam.lr = 0.001 ; net = train(net,X,Y); for i=1:P Y_test(i) = sim(net,X(i)); end plot(X,Y_test,'r'); hold off;
這里不需對數據歸一化;