神經(jīng)網(wǎng)絡(luò)作業(yè)使用BPRBFSVM進行函數(shù)擬合和分類_第1頁
神經(jīng)網(wǎng)絡(luò)作業(yè)使用BPRBFSVM進行函數(shù)擬合和分類_第2頁
神經(jīng)網(wǎng)絡(luò)作業(yè)使用BPRBFSVM進行函數(shù)擬合和分類_第3頁
神經(jīng)網(wǎng)絡(luò)作業(yè)使用BPRBFSVM進行函數(shù)擬合和分類_第4頁
神經(jīng)網(wǎng)絡(luò)作業(yè)使用BPRBFSVM進行函數(shù)擬合和分類_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 神經(jīng)網(wǎng)絡(luò) 神經(jīng)網(wǎng)絡(luò)作業(yè) 作業(yè)說明第一題(函數(shù)逼近):BP網(wǎng)絡(luò)和RBF網(wǎng)絡(luò)均是自己編寫的算法實現(xiàn)。BP網(wǎng)絡(luò)均采用的三層網(wǎng)絡(luò):輸入層(1個變量)、隱層神經(jīng)元、輸出層(1個變量)。轉(zhuǎn)移函數(shù)均為sigmoid函數(shù),所以沒有做特別說明。在第1小題中貼出了BP和RBF的Matlab代碼,后面的就沒有再貼出;而SVM部分由于沒有自己編寫,所以沒有貼出。而針對其所做的各種優(yōu)化或測試,都在此代碼的基礎(chǔ)上進行,相應(yīng)參數(shù)的命名方式也沒有再改變。RBF網(wǎng)絡(luò)使用了聚類法和梯度法兩種來實現(xiàn)。而對于SVM網(wǎng)絡(luò),在后面兩題的分類應(yīng)用中都是自己編寫的算法實現(xiàn),但在本題應(yīng)用于函數(shù)逼近時,發(fā)現(xiàn)效果很差,所以后來從網(wǎng)上下載到一個S

2、VM工具包LS-SVMlab1.5aw,調(diào)用里面集成化的函數(shù)來實現(xiàn)的,在本題函數(shù)逼近中均都是采用高斯核函數(shù)來測試的。第二題(分類):BP網(wǎng)絡(luò)和RBF網(wǎng)絡(luò)都是使用的Matlab自帶的神經(jīng)網(wǎng)絡(luò)工具包來實現(xiàn)的,不再貼出代碼部分。而SVM網(wǎng)絡(luò)則是使用的課上所教的算法來實現(xiàn)的,分別測試了多項式核函數(shù)和高斯核函數(shù)兩種實現(xiàn)方法,給出了相應(yīng)的Matlab代碼實現(xiàn)部分。第三題:由于問題相對簡單,所以就沒有再使用Matlab進行編程實現(xiàn),而是直接進行的計算。程序中考慮到MATLAB處理程序的特性,盡可能地將所有的循環(huán)都轉(zhuǎn)換成了矩陣運算,大大加快了程序的運行速度。編寫時出現(xiàn)了很多錯誤,常見的如矩陣運算維數(shù)不匹配,索

3、引值超出向量大小等;有時候用了很麻煩的運算來實現(xiàn)了后來才知道原來可以直接調(diào)用Matlab里面的庫函數(shù)來實現(xiàn)以及怎么將結(jié)果更清晰更完整的展現(xiàn)出來等等。通過自己編寫算法來實現(xiàn)各個網(wǎng)絡(luò),一來提升了我對各個網(wǎng)絡(luò)的理解程度,二來使我熟悉了Matlab環(huán)境下的編程。1. 函數(shù)擬合(分別使用BP,RBF,SVM),要求比較三個網(wǎng)絡(luò)。解:(1)a. BP網(wǎng)絡(luò):Matlab代碼如下:nv=10; %神經(jīng)元個數(shù):10個err=0.001; %誤差閾值J=1; %誤差初始值N=1; %迭代次數(shù)u=0.2; %學(xué)習(xí)率wj=rand(1,nv); %輸入層到隱層神經(jīng)元的權(quán)值初始化wk=rand(1,nv); %隱層神經(jīng)

4、元到輸出層的權(quán)值初始化xtrain=1:4:100; %訓(xùn)練集,25個樣本xtest=1:1:100; %測試集,100個dtrain=1./xtrain; %目標輸出向量,即教師 %訓(xùn)練過程while(J>err)&&(N<100000) uj=wj'*xtrain; h=1./(1+exp(-uj); %訓(xùn)練集隱層神經(jīng)元輸出 uk=wk*h; y=1./(1+exp(-uk); %訓(xùn)練集輸出層實際輸出 delta_wk = u*(dtrain-y).*y.*(1-y)*h' %權(quán)值調(diào)整 delta_wj = u*wk.*(dtrain-y).*y

5、.*(1-y).*xtrain)*(h.*(1-h)'); wk = wk+delta_wk; wj = wj+delta_wj; J=0.5*sum(dtrain-y).2); %誤差計算 j(N)=J; N=N+1;end %測試及顯示uj=wj'*xtest;h=1./(1+exp(-uj);uk=wk*h;dtest=1./(1+exp(-uk);figuresubplot(1,2,1),plot(xtest,dtest,'ro',xtest,1./xtest);legend('y=1/x', 'network output

6、9;);subplot(1,2,2),plot(xtest,1./xtest-dtest);x=1:N-1;figureplot(x,j(x); 運行條件:10個神經(jīng)元,誤差迭代閾值為0.001.學(xué)習(xí)率為0.2。隱層和輸出層都采用了sigmoid函數(shù)。25個訓(xùn)練集,100個測試集。批處理方式。其中一次的運行結(jié)果:運行時間為0.340742s.迭代了5980次。(都在一定范圍內(nèi)不停改變,因為每次運行的權(quán)值都是隨機賦值的)。下左圖為逼近結(jié)果,藍線為理想輸出。右圖為逼近誤差。 下面為迭代誤差曲線。注意兩張圖里面的“誤差”不是一樣的概念。上面圖中的誤差指的是實際的逼近誤差,即實際輸出與期望輸出之差,漸

7、進0代表逼近效果良好。而下面圖中的誤差指的是誤差函數(shù),它逼近0代表著訓(xùn)練過程的結(jié)束。可以看出,除前面幾點有些許誤差外,后面逼近效果良好。這在可以接受的范圍內(nèi)。這是因為我的訓(xùn)練集是均勻選取的,而1/x在前面收斂比較快,到了后面變化不大,因此誤差較小。下面是我在解題過程中走的一些彎路以及做出的一些探索。其中逼近次數(shù)100 000次為預(yù)設(shè)值,沒有再相應(yīng)增加,對于可能造成的一些影響或誤差不予考慮。在其他題中做的類似測試結(jié)果類似,就不再貼出。神經(jīng)元數(shù)目對逼近效果的影響具體的實驗過程不再詳述,只對結(jié)果做一些相關(guān)介紹。當神經(jīng)元數(shù)目在3以內(nèi)時,運行時間會變的非常長,逼近效果尚可。而當神經(jīng)元數(shù)目在4到三十幾的范

8、圍內(nèi)時,運行時間和逼近效果同上面的例子差不多,只迭代誤差曲線有稍許差別。而當神經(jīng)元數(shù)目在40以上時,運行時間再度變長,逼近效果極差。究其原因,做如下推測。當神經(jīng)元數(shù)目較少時,網(wǎng)絡(luò)不能很好學(xué)習(xí),即不足以描述此時的函數(shù)逼近,需要的訓(xùn)練次數(shù)多,因此迭代次數(shù)超出的我們設(shè)置的限制100 000次,運行時間相應(yīng)較長;相應(yīng)訓(xùn)練精度也不高。而當神經(jīng)元數(shù)目過多時,會使運算變得極度復(fù)雜化,運行時間也會相應(yīng)變長。但是為何此時迭代次數(shù)也會超出100 000次呢?我原本以為神經(jīng)元數(shù)目增多的話,雖然會更復(fù)雜,但功能更加強大,實現(xiàn)效果會更好,迭代次數(shù)也會相應(yīng)減少。據(jù)此猜測是由于神經(jīng)元數(shù)目增多,為了實現(xiàn)這種更好的逼近效果,相

9、應(yīng)的迭代次數(shù)會需要相應(yīng)增加。具體理論支持不是很清楚。誤差閾值對逼近效果影響這個是很明顯的,誤差閾值設(shè)置的越低,逼近效果越好,相應(yīng)需要的迭代次數(shù)會更多,運行時間也就更長些。學(xué)習(xí)率對逼近效果的影響學(xué)習(xí)率決定每一次循環(huán)訓(xùn)練中所產(chǎn)生的權(quán)值變化量。大的學(xué)習(xí)率可能導(dǎo)致系統(tǒng)的不穩(wěn)定;但小的學(xué)習(xí)率導(dǎo)致較長的訓(xùn)練時間,可能收斂很慢,不過能保證網(wǎng)絡(luò)的誤差值不跳出誤差表面的低谷而最終趨于誤差最小值。因此,一般情況下傾向于選擇較小的學(xué)習(xí)率以保證系統(tǒng)的穩(wěn)定性。根據(jù)張老師課上講述,學(xué)習(xí)率()一般取在0到1之間。下面是0.1:0.1:1之間的一些測試結(jié)果。當0.10.5時,逼近效果同例子近似,實現(xiàn)良好逼近。當0.61時,逼

10、近效果不穩(wěn)定。有時候逼近效果同例子近似,實現(xiàn)良好逼近。有時候迭代次數(shù)超過100 000次,且前端逼近效果較差。效果圖如下所示:猜測不穩(wěn)定性是由于權(quán)值賦值的隨機性導(dǎo)致的,下面是針對具體原因的一個猜測:BP算法的缺點之一是解不唯一,局部極小。猜測迭代次數(shù)超過100 000次的是因為陷入了死循環(huán)中無法跳出的結(jié)果。初始權(quán)值對逼近效果的影響以上測試結(jié)果的初始權(quán)值都是由Matlab產(chǎn)生的01之間的隨機數(shù)。對于BP神經(jīng)網(wǎng)絡(luò)而言,網(wǎng)絡(luò)的初始權(quán)值不同,每次訓(xùn)練的結(jié)果也不同,這是由于誤差曲面的局部最小點非常多造成的。BP算法本質(zhì)上是梯度算法,容易陷入局部最小點。一般選取較小的隨機初始值,在(-1,+1)間。此處不

11、再考慮。學(xué)習(xí)模式的影響分為增量學(xué)習(xí)和批處理學(xué)習(xí)兩種。增量學(xué)習(xí)一般適合于在線學(xué)習(xí),因此此處就沒有再考慮。訓(xùn)練集的影響訓(xùn)練集的選取測試有很多種情況,此處我只選取了幾種比較有代表性的情況。訓(xùn)練集為1:1:20,此時可以發(fā)現(xiàn)由于前端選取點集跟測試集一樣,所以前端逼近沒有問題,但是后面由于沒有訓(xùn)練集的分布,所以逼近效果不好,出現(xiàn)較大誤差。因此說明只有學(xué)習(xí)的全面才有較好的測試即逼近效果。下面是效果圖:下面首先固定訓(xùn)練集為1:4:100,分別改變測試集為2:2:100和1:0.5:100等,可以發(fā)現(xiàn)此時的逼近效果都不錯,證明我們的訓(xùn)練不是有針對性而是有普適性的,效果圖就不再貼出了。然后固定測試集為1:0.5

12、:100,分別改變訓(xùn)練集為1:1:100, 1:4:100, 2:4:100, 1:10:100, 1:20:100等,結(jié)果分別如下:訓(xùn)練集為1:1:100時,逼近效果良好,但是訓(xùn)練時間很長,迭代次數(shù)超過100 000次(仍沒有使誤差減小到0.001)。通過類似測試可以發(fā)現(xiàn),在選取訓(xùn)練集較為合理情況下,學(xué)習(xí)中的達到相當精度所需的迭代次數(shù)隨輸入訓(xùn)練樣本數(shù)的增加而變大,這是因為在所使用的梯度下降學(xué)習(xí)算法中,誤差函數(shù),顯然J的取值會隨著樣本數(shù)的增加而不斷增大。所以,在對大量的樣本進行訓(xùn)練時,在逼近效果相似時訓(xùn)練的誤差會比用小量樣本訓(xùn)練時大一點,這是正?,F(xiàn)象。因此訓(xùn)練時應(yīng)該根據(jù)輸入樣本的數(shù)量有變化地選

13、擇收斂的精度,這樣才能在逼近效果和迭代次數(shù)上達到一個平衡。當訓(xùn)練集為2:4:100時,效果同1:4:100近似,這說明要想達到較好的訓(xùn)練效果,訓(xùn)練集的選擇并不是唯一的,只要進行合理的選取使之能較好的表現(xiàn)其中的規(guī)律,就能完成較好的訓(xùn)練效果。而當訓(xùn)練集為1:10:100時,逼近效果如下:可以看出,此時由于訓(xùn)練樣本選擇較少,不足以表現(xiàn)訓(xùn)練規(guī)律,因此最后的逼近效果較差。而當訓(xùn)練集為1:20:100時,訓(xùn)練效果更差,也證明了這一點。效果圖不再貼出。b. RBF網(wǎng)絡(luò)RBF網(wǎng)絡(luò)的參數(shù)設(shè)計一般需考慮三種參數(shù):各基函數(shù)的數(shù)據(jù)中心和擴展常數(shù),以及輸出節(jié)點的權(quán)值。各個參數(shù)的確定都可以有不同的方法,下面是我嘗試的幾種

14、方法:聚類法確定數(shù)據(jù)中心和擴展常數(shù),偽逆法求解權(quán)值矩陣Matlab代碼如下:xtrain = 1:3:100; %訓(xùn)練集xtest = .9:100; %測試集TrainNum = length(xtrain); %訓(xùn)練集個數(shù)TestNum = length(xtest); %測試集個數(shù)InDim = 1; %輸入樣本維數(shù)Nv = 10; %隱節(jié)點數(shù),即聚類樣本數(shù)u = 1.0; %聚類系數(shù)ytrain = 1./xtrain; %訓(xùn)練集目標輸出ytest = 1./xtest; %測試集目標輸出 Centers = xtrain(:,1:Nv); %初始聚類中心% 聚類法確定各徑向基函數(shù)的數(shù)

15、據(jù)中心和擴展常數(shù)即寬度while 1, NumberInClusters = zeros(Nv,1); %各類中的樣本數(shù),初始化為0 IndexInClusters = zeros(Nv,TrainNum); %各類所含樣本的索引號 %按最小距離原則對所有樣本進行分類 for i = 1:TrainNum AllDistance = dist(Centers',xtrain(:,i); MinDist,Pos = min(AllDistance); NumberInClusters(Pos) = NumberInClusters(Pos) + 1; IndexInClusters(Po

16、s,NumberInClusters(Pos) = i; end %保存舊中心用于后面比較 OldCenters = Centers; %對各聚類域中的樣本取均值,更新各聚類中心 for i = 1:Nv Index = IndexInClusters(i,1:NumberInClusters(i); Centers(:,i) = mean(xtrain(:,Index)')' end %判斷新舊聚類中心是否一致,是則結(jié)束聚類 EqualNum = sum(sum(Centers=OldCenters); if EqualNum = InDim*Nv, break, enden

17、d %計算各隱節(jié)點的擴展常數(shù)AllDistances = dist(Centers',Centers); %計算隱節(jié)點數(shù)據(jù)中心間的距離Maximum = max(max(AllDistances); %找出其中最大的一個距離for i = 1:Nv %將對角線上的0替換為最大距離 AllDistances(i,i) = Maximum+1;endSpreads = u*min(AllDistances)' %以隱節(jié)點間的最小距離作為擴展常數(shù) %計算各隱節(jié)點輸出權(quán)值矩陣Distance = dist(Centers',xtrain); %計算各樣本輸入離各中心歐式距離Sp

18、readsMat = repmat(Spreads,1,TrainNum);HiddenUnitOut = radbas(Distance./SpreadsMat); %計算隱節(jié)點輸出矩陣HiddenUnitOutEx = HiddenUnitOut' ones(TrainNum,1)' %考慮偏移W2Ex = ytrain*pinv(HiddenUnitOutEx); %偽逆法求廣義輸出矩陣W2 = W2Ex(:,1:Nv); %輸出權(quán)值 %測試及顯示TestDistance = dist(Centers',xtest);TestSpreadsMat = repmat

19、(Spreads,1,TestNum);TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat);TestNNOut = W2*TestHiddenUnitOutfiguresubplot(1,2,1),plot(xtest,TestNNOut,'ro',xtest,ytest);legend('y=1/x', 'RBF network output');subplot(1,2,2),plot(xtest,ytest-TestNNOut);程序運行了0.148820s,逼近效果圖及逼近誤差曲

20、線如下:可以看到在拐點處逼近效果不太好,其他地方逼近效果不錯。梯度法我就只貼出訓(xùn)練過程的Matlab代碼,其他的由于相差不大就不再貼出。while(J>err)&&(N<100000) for i=1:length(xtrain) y(i)=exp(-1*(xtrain(i)-t).2)./(delta.2)/2)*wk' end for i=1:length(xtrain) wk=wk+lr*(dtrain(i)-y(i)*exp(-1*(xtrain(i)-t).2)./(delta.2)/2); t=t+lr*(dtrain(i)-y(i)*(dtra

21、in(i)-y(i)*exp(-1*(xtrain(i)-t).2)./(delta.2)/2).*wk./(delta.2).*(xtrain(i)-t); delta=delta+lr*(dtrain(i)-y(i)*(dtrain(i)-y(i)*exp(-1*(xtrain(i)-t).2)./(delta.2)/2).*wk./(delta.3).*(xtrain(i)-t).2); end J=0.5*sum(dtrain-y).2); j(N)=J; N=N+1; end上面就是使用梯度法進行迭代時的數(shù)據(jù)中心、擴展寬度和權(quán)值的調(diào)整方式。訓(xùn)練集為1:3:100,測試集為1:1:10

22、0,學(xué)習(xí)率為0.2,神經(jīng)元個數(shù)為30個。此時的逼近效果如下:而迭代誤差曲線如下圖所示:程序運行了1.333995s,只迭代了21次就達到了誤差閾值,完成了迭代??梢钥吹?,此時的逼近效果也不錯。雖然有些微起伏,但是在可接受范圍內(nèi)。c. SVM網(wǎng)絡(luò)使用的LS-SVMlab1.5aw工具包。由于沒有添加自己的算法,所以SVM函數(shù)逼近部分不再貼出Matlab代碼。只給出逼近的效果圖。使用的是高斯核函數(shù),正則化參數(shù)取為50,取為0.2。訓(xùn)練集為xtrain=1:100,測試集為隨機賦值的100*rand(100,0).下面是函數(shù)逼近的效果圖:可以看到,逼近效果相當不錯。下面稍稍測試了下高斯核函數(shù)中取值對

23、逼近效果的影響。將取值為0.0001,下面是相應(yīng)的逼近效果:可以看到,相對于=0.2時,前一段的逼近效果差了很多。相應(yīng)的,將取值為2時,也出現(xiàn)了相同的狀況。這說明我們在使用高斯核函數(shù)來實現(xiàn)SVM函數(shù)逼近時,需要合理的調(diào)整和測試的取值,以確保最佳的逼近效果。(2)a. BP網(wǎng)絡(luò)Matlab代碼類似上面第一題,就不再貼出。測試條件為:10個神經(jīng)元,學(xué)習(xí)率為0.1,測試集為1:2:100,訓(xùn)練集為1:1:100.迭代了6423次后結(jié)束,運行了0.541292s.測試的結(jié)果如下:下面是迭代誤差曲線:可以看到,逼近效果不盡如人意。到了后面一段逼近線維持在目標線的上方而不能下來。導(dǎo)致擬合誤差曲線不能像上一

24、題那樣漸進到0附近。因此我嘗試了下面一些方法來改善此種情況。首先我嘗試改變了上一題中嘗試的一些動態(tài)量值例如神經(jīng)元個數(shù),學(xué)習(xí)率的大小,訓(xùn)練集的選擇等等,但是發(fā)現(xiàn)結(jié)果并沒有多少改觀。因此通過查閱相關(guān)書籍,找到了下面的一些針對BP算法的改進方法。增加動量項在權(quán)值調(diào)整公式中增加一動量項,即從前一次權(quán)值量中取出一部分疊加到本次權(quán)值調(diào)整量中。具體代碼不再貼出。動量系數(shù)使用的是0.25.迭代了4570次,運行時間為0.533672s。下面是逼近效果圖:以及下面的迭代誤差圖:可以發(fā)現(xiàn)逼近效果同上面相比其實并沒有多大改觀。自適應(yīng)學(xué)習(xí)率法調(diào)整部分的Matlab代碼如下:%根據(jù)誤差函數(shù)改變自適應(yīng)調(diào)節(jié)學(xué)習(xí)率 if(N

25、>1) if(j(N)>1.04*j(N-1) u = 0.75*u; elseif(j(N)<j(N-1) u = 1.05*u; end; end; 迭代超過100 000次,運行了23.567133s.逼近效果如下:迭代誤差曲線變化不大,就不再貼出。此時可以看到,后面一段確實逼近效果變得很好,但是前面一段卻又逼近失敗。而將兩種優(yōu)化方法結(jié)合后變化依舊不大。至此又發(fā)現(xiàn)了另一個問題,后來了解到增加動量項以及自適應(yīng)學(xué)習(xí)率法都是針對BP網(wǎng)絡(luò)收斂慢的特點提出的,目的是減小迭代次數(shù),但是從實驗的結(jié)果來看卻沒有起到相應(yīng)的效果,反而迭代次數(shù)有所增加。這個問題一直沒有弄清楚。至此沒有再優(yōu)化

26、下去,回到最初的逼近效果,發(fā)現(xiàn)是后面一段誤差較大,猜測是由于逼近對極小的值的精度不夠高所致。b. RBF網(wǎng)絡(luò)最初使用聚類法,訓(xùn)練集均勻分布,1:3:100。測試集為0.9:100,15個隱層神經(jīng)元。此時的逼近效果如下所示:可以發(fā)現(xiàn)同第一題一樣,同樣是拐點處的逼近效果不太好。此時忽然想到會不會是由于訓(xùn)練集選取引起的問題呢?逼近函數(shù)在前一段下降較快,而在后面一段逐漸逼近于0,變化不大,因此可以考慮在前面一段下降較快的一段取更多的訓(xùn)練集?;谌绱讼敕?,我對訓(xùn)練集做了如下改動:xtrain1 = 1:20;xtrain2 = 21:5:100;xtrain = xtrain1 xtrain2;而經(jīng)過改

27、進后的逼近效果圖如下:程序運行時間為0.170005s??梢悦黠@看到,此時的逼近效果同上面相比改善很多,即使在拐點處的逼近也很好,而右面的誤差曲線除了最初幾個測試點有些微誤差外,其他都是逼近到0附近,也證實了良好的逼近效果。證實了是由于訓(xùn)練集的影響后,我又返回第一題針對其RBF的聚類算法做了同樣的改進,結(jié)果發(fā)現(xiàn)逼近效果也相應(yīng)得到改進,消除了拐點處逼近效果不好的問題。這里就不再將效果圖貼出了。梯度法程序運行1.301157s,迭代1101次,逼近效果如下:迭代誤差曲線如下:c. SVM網(wǎng)絡(luò)使用高斯核函數(shù),正則化因子為50,取值0.2.訓(xùn)練集為xtrian=1:100;測試集為99*rand(10

28、0,1)+1.下面是逼近效果圖:逼近效果比較差,并且發(fā)現(xiàn)無論怎么調(diào)節(jié)都無法達到令人滿意的效果。由于本題曲線走勢跟上一題類似,區(qū)別在于前一段下降比較快,所以猜測高斯核函數(shù)SVM在逼近走勢變化比較劇烈的函數(shù)時就有點力不從心了。(3)本題與前兩題的不同之處在于y(x)的值域(-1,1.而BP網(wǎng)絡(luò)轉(zhuǎn)移函數(shù)sigmoid的值域為(-1,1)。因此必須對其輸出進行變換,使其落在sigmoid函數(shù)的值域內(nèi)。這里采用的變換方式是將其加1后除以2.到后面逼近的值再乘以2后減去1即可恢復(fù)其實際值。隱層神經(jīng)元數(shù)目為10,學(xué)習(xí)率為0.3. 訓(xùn)練集為1/15*pi : 1/15*pi : 4*pi,測試集為1/30*p

29、i : 1/30*pi : 4*pi.迭代次數(shù)超過100 000次,運行了22.869918s.最后的誤差減小到0.0492。逼近效果圖如下:下面是迭代誤差曲線:可以看出逼近效果并不好。經(jīng)過查閱相關(guān)資料,了解到為了模擬神經(jīng)元的閾值,通常會在每一層輸出之前增加一個偏置。即每一層的輸出可以表示為。其中w為權(quán)值,p為輸入,b即為增加的偏置。f為轉(zhuǎn)移函數(shù),a即為相應(yīng)輸出。基于此,為了改善上面的逼近狀況,嘗試著在隱層神經(jīng)元添加了偏置。實現(xiàn)代碼介紹如下:偏置矩陣的隨機初始化等同于權(quán)值矩陣:wpz=rand(1,Nv); 此時隱層整合了偏置矩陣后:uj=wj'*xtrain+repmat(wpz&#

30、39;,1,Ntrain); %Ntrain為測試集個數(shù)而偏置矩陣在每次迭代時隨權(quán)值一起調(diào)整,相應(yīng)調(diào)整方式為:delta_wpz = u*wk.*(dtrain-y).*y.*(1-y)*(h.*(1-h)');wpz=wpz+delta_wpz;由于只找到了輸入層到隱層神經(jīng)元的偏置的調(diào)整方式,所以沒有在隱層神經(jīng)元到隱層神經(jīng)元到輸出層也添加偏置。神經(jīng)元數(shù)目為10個,學(xué)習(xí)率為0.3,訓(xùn)練集為1/15*pi : 1/15*pi : 4*pi,測試集為1/30*pi : 1/30*pi : 4*pi.迭代次數(shù)超過100 000次,誤差調(diào)整到0.0018,已經(jīng)接近到設(shè)定閾值0.001.程序運行

31、了27.093362s。下面是改進后的逼近效果:以及下面的迭代誤差曲線:可以看到,此時的逼近效果比起上面未有添加偏置時已經(jīng)好了很多。后面一小段的逼近誤差有呈增大趨勢,猜測在隱層神經(jīng)元到輸出層也添加偏置后起到相應(yīng)的改善,但是由于沒有找到次數(shù)偏置的迭代調(diào)整算法,所以沒有再測試下去。b.RBF算法聚類法逼近效果圖如下所示:逼近效果顯然不錯。梯度法梯度法的逼近效果較差,就不再貼出了。c.SVM網(wǎng)絡(luò)使用高斯核函數(shù),正則化參數(shù)為50,取為0.2.訓(xùn)練集為1/15*pi : 1/15*pi : 4*pi,測試集為1/30*pi : 1/30*pi : 4*pi.逼近效果如下:顯然,此時的逼近效果不錯。(4)

32、a.BP網(wǎng)絡(luò)同上一題一樣,欲逼近函數(shù)的值域落在(-1,1)之間,因此也要對其做出處理使之落在sigmoid函數(shù)的值域(0,1)之間。仍舊采用上面一題的方法。不再贅述。神經(jīng)元數(shù)目為20個,學(xué)習(xí)率為0.2,測試集為0 : 0.02*pi * 2*pi,測試集為0 : 0.01*pi : 2*pi.共迭代了35211次結(jié)束循環(huán)迭代,程序運行8.772137s.下面是逼近效果圖:以及迭代誤差曲線:可以看到在限定的迭代次數(shù)內(nèi)達到了誤差閾值跳出迭代,并且逼近效果相當不錯。b.RBF網(wǎng)絡(luò) 聚類法同BP網(wǎng)絡(luò)一樣,訓(xùn)練集仍為0 : 0.02*pi : 2*pi,測試集仍為0 : 0.01*pi : 2*pi,程

33、序運行了0.405374s,下面是逼近效果圖可以看到逼近效果不錯,包括在拐點處和下降較快的地方也都能實現(xiàn)良好逼近。梯度法逼近效果很差,發(fā)現(xiàn)無論怎么調(diào)節(jié)各種參數(shù),都不能使誤差減小。逼近效果圖不再貼出。c.SVM網(wǎng)絡(luò)使用高斯核函數(shù),正則化參數(shù)為50,取為0.2,訓(xùn)練集仍為0 : 0.02*pi : 2*pi,測試集仍為0 : 0.01*pi : 2*pi。下面是逼近效果圖:可以看出,此時的逼近效果也不錯。前段有些誤差,也再次證實了剛才關(guān)于SVM高斯核函數(shù)在逼近走勢很陡峭的函數(shù)時效果不太好的猜測。下面是通過上面的一些測試總結(jié)出來各網(wǎng)絡(luò)的一些規(guī)律和特點。分析與比較:使用BP網(wǎng)絡(luò)進行函數(shù)逼近一般都能達到

34、良好的逼近效果,缺點是相對于RBF和SVM網(wǎng)絡(luò)來說,收斂的時間較長。隱層神經(jīng)元個數(shù)的選擇對最終的逼近結(jié)果影響也比較大,神經(jīng)元過少會難以逼近,而過多又會造成過擬合。一般而言函數(shù)越復(fù)雜,所需的神經(jīng)元個數(shù)也越多。學(xué)習(xí)率和訓(xùn)練集等的選擇對逼近效果也有一定的影響,這在上面都做了一定的闡述,就不再詳述了。后兩題題的擬合效果沒有好,我認為這是由于后兩題中的函數(shù)都是非單調(diào)的,存在著幾個拐點,而使用的傳遞函數(shù)(sigmoid函數(shù))是一個單調(diào)的函數(shù),故在擬合時存在一定的困難;而前兩題中的函數(shù)都是單調(diào)下降型的,故擬合起來較容易,效果也就相對好些。實驗中,有時得到的測試誤差曲線在結(jié)尾處的值較大,比較后發(fā)現(xiàn)這都是在對很

35、小的近似為0的值的逼近中出現(xiàn)的,由于真值較小,較小的絕對誤差就會造成很大的相對誤差,故實際的擬合效果還是要與擬合曲線結(jié)合起來看。另外,我一開始編寫程序時沒有考慮神經(jīng)元的偏置(模擬神經(jīng)的傳遞閾值),結(jié)果發(fā)現(xiàn)雖然也能實現(xiàn)函數(shù)的逼近,但訓(xùn)練時需要更多的迭代次數(shù),收斂的時間很長,甚至在第三題中不能完成逼近,而在添加了從輸入層到隱層神經(jīng)元的偏置后效果改善就很多了。 而相對于BP網(wǎng)絡(luò)來說,RBF網(wǎng)絡(luò)聚類法的逼近效果要好很多,但是需要的神經(jīng)元數(shù)量相對多些,而梯度法的逼近效果相對差很多,原因不是很明白。另外,RBF網(wǎng)絡(luò)方法的速度相對BP來說有很大提升,完成下降到誤差閾值所需的迭代次數(shù)大大減少,個人感覺這是相對

36、與BP網(wǎng)絡(luò)最明顯的優(yōu)勢。而對于SVM網(wǎng)絡(luò),由于是直接使用的別人的工具包來做的,所以可供分析的地方不多。此處都是采用的高斯核函數(shù)來實現(xiàn)逼近的,其值的選取需要不斷測試,過大或過小都會導(dǎo)致擬合失真。另外,第二題的逼近效果相對不如第一題,但其實兩條曲線的走勢大致一致,都是單調(diào)下降的,區(qū)別在于第二題的曲線下降走勢要快得多,因此對于曲線變化很劇烈的函數(shù)段,擬合難度會相應(yīng)加大。這一點在第四題的擬合效果不如第三題也可以得到印證。相對于BP網(wǎng)絡(luò),SVM由于不需要進行繁復(fù)迭代,所以運行時間有很大優(yōu)勢。而相對于RBF網(wǎng)絡(luò),雖然SVM不需要迭代,但是由于矩陣計算同樣繁復(fù),所以速度優(yōu)勢相對不明顯。而就擬合效果來說,個人

37、感覺除了變化劇烈的函數(shù)段外,SVM同RBF的擬合效果相差不大。2. 分類:分別用BP,RBF,SVM對下列函數(shù)進行分類(i=1,2500).要求:(1)畫出樣本在二維空間中的分布。(不少于1000個點)(2)畫出分類結(jié)果。解:首先畫出樣本在二維空間中的分布。取i=1:1:500.即各500個樣本。當=0時,相當于沒有噪聲。此時的分布圖如下所示:當時,存在噪聲信號。利用awgn函數(shù)在原來的信號基礎(chǔ)上添加高斯白噪聲。SNR = 15;x1 = awgn(x1,SNR);y1 = awgn(y1,SNR);x2 = awgn(x2,SNR);y2 = awgn(y2,SNR);得到的二維分布圖如下:

38、從上面的分類圖可以發(fā)現(xiàn),在沒有添加噪聲時兩類樣本結(jié)合得就已經(jīng)比較緊密了,只是相互的間隔隨i的變化也比較有規(guī)律地變化。加入一定高斯白噪聲后,兩類樣本間的間隔也變得不穩(wěn)定,變得更加不規(guī)律,有的地方間隔更小了,這無疑增加了分類的難度。下面針對兩類樣本分別使用BP,RBF,SVM網(wǎng)絡(luò)嘗試進行分類。(1) BP網(wǎng)絡(luò) 程序中的設(shè)置如下:net=newff(minmax(X),1);net.trainParam.lr=0.04; %學(xué)習(xí)率net.trainParam.epochs=100;%最大訓(xùn)練次數(shù)net.trainParam.goal=1e-5;%訓(xùn)練要求精度訓(xùn)練集使用i=1:0.5:500,測試集使

39、用i=500*rand(1,999)。即測試集和訓(xùn)練集在SA和SB中各有999個點。訓(xùn)練集均勻選取,而測試集隨機選取。由于測試集為隨機選取,所以訓(xùn)練結(jié)果也不能保持穩(wěn)定,只是在一個大致的范圍內(nèi)波動,下面選取其中一次的結(jié)果進行展示。當沒有在測試集中添加高斯白噪聲時,分類成功率為100%。下面圖分別顯示了隨機賦值的測試集在二維空間的分布狀況以及最后的分類結(jié)果三維顯示。可見在沒有添加噪聲時,分類效果是不錯的。下面看一下添加高斯白噪聲后的分類效果圖:此時的分類成功率為84.03%,較之沒有添加噪聲時下降了很多。RBF網(wǎng)絡(luò)試驗了兩種網(wǎng)絡(luò)來進行分類,廣義回歸神經(jīng)網(wǎng)絡(luò)和概率神經(jīng)網(wǎng)絡(luò)。廣義回歸神經(jīng)網(wǎng)絡(luò)(GRNN

40、網(wǎng)絡(luò))訓(xùn)練集使用i=1:0.5:500,測試集使用i=500*rand(1,999).即測試集和訓(xùn)練集在SA和SB中各有999個點。訓(xùn)練集均勻選取,而測試集隨機選取。在沒有添加高斯白噪聲時,分類成功率為80.10%,下面圖分別顯示了隨機挑選的測試集在二維空間的分布狀況以及最后的分類結(jié)果三維顯示。而在添加了SNR為15的高斯白噪聲后,分類成功率下降到69.45%,下面是測試集二維分布圖及三維分類效果圖:可以看到此時的分類效果已經(jīng)是比較差的了。下面是我針對有噪聲的情況進行的一些調(diào)試:調(diào)整其徑向基函數(shù)的分類密度即神經(jīng)網(wǎng)絡(luò)建立函數(shù)newgrnn()的第三個參數(shù)SPREAD。上面都是使用的默認值1,下面

41、隨機調(diào)整了幾個值觀察了下其對分類成功率的影響。分類密度SPREAD分類成功率0.20.83850.40.82850.60.79850.80.76001.00.708020.507550.5180下面圖反應(yīng)的是整體的變動趨勢:可以看到,分類成功率是隨著分布密度SPREAD的值的增大而降低的,在小于1的一段變化尤為明顯。而在后面一段曲線有所上升是由于數(shù)據(jù)的隨機性問題,實際上仍是呈下降趨勢的。具體的分類效果圖則不再一一給出。概率徑向基神經(jīng)網(wǎng)絡(luò)(PNN)訓(xùn)練集和測試集的選取都同上面保持一致,不再詳述。在沒有添加高斯白噪聲時,分類成功率達100%。下面是訓(xùn)練集的二維分布圖以及三維分類顯示:分類效果顯然不

42、錯。下面看看添加噪聲后的分類效果。此時的分類成功率為85.15%。分類效果圖如下:添加噪聲后,分類效果明顯下降,但是相對于廣義回歸神經(jīng)網(wǎng)絡(luò)卻比其沒有添加噪聲信號的成功率還要高,因此我們可以得出結(jié)論:即在用于模式分類時,概率神經(jīng)網(wǎng)絡(luò)(PNN)的效果比廣義回歸神經(jīng)網(wǎng)絡(luò)(GRNN)的分類效果要好。下面看一下概率神經(jīng)網(wǎng)絡(luò)建立函數(shù)newpnn()的參數(shù)分布密度SPREAD對分類效果的影響。SPREAD0.20.40.60.811.52成功率0.82300.83850.80800.76700.72700.55050.4880或許是由于選取的數(shù)據(jù)特征不明顯吧,細節(jié)方面的變化倒是不太明顯,但是可以確定的是,當

43、分布密度選取過大時,同樣會導(dǎo)致分類成功率的降低。SVM網(wǎng)絡(luò)分別使用高斯核函數(shù)和多項式核函數(shù)兩種來完成分類。a. 多項式核函數(shù)下面是Matlab代碼實現(xiàn):i=1:.5:500; xtrain1=1/25.*(i+8).*cos(2*pi/25.*(i+8)-0.25*pi);ytrain1=1/25.*(i+8).*sin(2*pi/25.*(i+8)-0.25*pi)-0.25;xtrain2=-1/25.*(i+8).*sin(2*pi/25.*(i+8)+0.25*pi);ytrain2=-1/25.*(i+8).*cos(2*pi/25.*(i+8)+0.25*pi)-0.25;trai

44、n=xtrain1' ytrain1'xtrain2' ytrain2' %訓(xùn)練集dtrain=ones(length(xtrain1),1);-ones(length(xtrain1),1); dm=dtrain*dtrain' ker=(1+train*train').2; %多項式核矩陣ker1=ker.*dm;a=inv(ker1)*ones(length(xtrain1)*2,1);f=find(a>0); %尋找支撐向量b0=1/dtrain(f(1)-ker(f(1),:)*(a.*dtrain); y=ker*(a.*dtr

45、ain)+b0; y=sign(y);subplot(1,2,1),plot3(xtrain1,ytrain1,y(1:length(xtrain1),'r+',xtrain2,ytrain2,y(length(xtrain1)+1:length(xtrain1)*2),'bo');legend('SA', 'SB'); %訓(xùn)練集分類結(jié)果i = 500*rand(1,999);NItest = length(i);xtest1 = 1/25 * (i+8) .* cos(2*pi/25*(i+8) - 0.25*pi);ytest

46、1 = 1/25 * (i+8) .* sin(2*pi/25*(i+8) - 0.25*pi) - 0.25;xtest2 = -1/25 * (i+8) .* sin(2*pi/25*(i+8) + 0.25*pi);ytest2 = 1/25 * (i+8) .* cos(2*pi/25*(i+8) + 0.25*pi) - 0.25;%SNR = 15;%xtest1 = awgn(xtest1,SNR);%ytest1 = awgn(ytest1,SNR);%xtest2 = awgn(xtest2,SNR);%ytest2 = awgn(ytest2,SNR);test=xtest

47、1' ytest1'xtest2' ytest2' %測試集dtest=ones(length(xtest1),1);-ones(length(xtest1),1); tker=(1+test*test').2;yt=tker*(a.*dtest)+b0;yt=sign(yt);subplot(1,2,2),plot3(xtest1,ytest1,yt(1:length(xtest1),'r+',xtest2,ytest2,yt(length(xtest1)+1:length(xtest1)*2),'bo');legend

48、('SA', 'SB'); %測試集分類結(jié)果同RBF一樣,訓(xùn)練集采用i=1:0.5:500,測試集使用隨機值i=500*rand(1,999).都各有999個點,共1998個點。使用的核函數(shù)為下面是分類結(jié)果顯示,左邊圖為訓(xùn)練集,右邊圖為測試集,都未加噪聲。可以看到,使用多項式核函數(shù)在本題中不能完成分類工作,因此就沒有再測試添加噪聲的情況。Matlab代碼不再貼出。b高斯核函數(shù)Matlab代碼如下:i = 1:.5:500;NI = length(i);xtrain1=1/25.*(i+8).*cos(2*pi/25.*(i+8)-0.25*pi);ytrain1

49、=1/25.*(i+8).*sin(2*pi/25.*(i+8)-0.25*pi)-0.25;xtrain2=-1/25.*(i+8).*sin(2*pi/25.*(i+8)+0.25*pi);ytrain2=-1/25.*(i+8).*cos(2*pi/25.*(i+8)+0.25*pi)-0.25;train=xtrain1' ytrain1'xtrain2' ytrain2' %訓(xùn)練集dtrain=ones(NI, 1);-ones(NI, 1); dm=dtrain*dtrain' delta=0.005;for j=1:2*NI for k=1

50、:2*NI ker(j,k)=exp(-(norm(train(j,:)-train(k,:)2/2/delta2); endend %高斯核函數(shù)矩陣ker1=ker.*dm;a=inv(ker1)*ones(2*NI,1);f=find(a>0); %支撐向量b0=1/dtrain(f(1)-ker(f(1),:)*(a.*dtrain); y=ker*(a.*dtrain)+b0; y=sign(y); subplot(1,2,1),grid onplot3(xtrain1,ytrain1,y(1:NI),'r+',xtrain2,ytrain2,y(NI+1:2*NI),'bo');legend('SA', 'SB'); %訓(xùn)練集結(jié)果輸出i = 500*rand(1,NI);xtest1 = 1/25 * (i+8) .* cos(2*pi/25*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論