標籤:神經網路 機器學習 matlab 演算法
上節在
《機器學習之從logistic到神經網路演算法》
中,我們已經從原理上介紹了神經網路演算法的來源與構造,並編程實戰了簡單神經網路對於線性與非線性資料的分類測試實驗。看過上節的可能會發現,上節實現的演算法對於非線性資料的分類效果並不是非常完美,有許多值得最佳化的地方。而matlab作為一個科學計算軟體,本身整合了非常多的最佳化演算法,其中的神經網路工具箱就是其中一個優秀的工具箱,本節將以工具箱中的函數重新實驗上節中的分類實驗。
首先來瞭解這個工具箱。我們說,一個簡單的神經網路就如所示:
這是我們上節用過的網路,含有兩層,每層3個節點的網路。然而已經證明,其實只含有一個隱含層的網路是可以擬合出任意有限的輸入輸出映射問題的。基於此,在matlab整合的工具箱中我們只能看到只含有一個隱含層的網路,而網路的節點個數卻是我們可以需要改變與設計的。簡單來工具箱的一個簡單神經網路可以表示如下:
通過輸入然後映射到輸出,輸出在映射到最終輸出。整個網路包含權值w、v和常數b。網路需要設計的就是確定隱含層的節點個數(matlab預設10),同時映射函數需要注意,上節我們預設的都是採用sigmod函數,然而matlab預設的是隱含層輸出採用sigmod,而輸出後的映射採用的是線性映射,像中的在輸出部分的紅色所示。其實除了這兩種映射函數外,還有正切等等函數,可以作為映射函數的共同點就是他們都是可導的(這是原理推導上所必須的)。那麼matlab預設輸出映射為什麼是線性而不是sigmod的呢?我們知道sigmod函數會把資料對應到0-1之間,然而我們實際應用中獲得的資料的目標值(分類標籤)並不一定都在0-1之間,那麼如果用sigmod函數,那麼我們需要把未經處理資料的目標輸出轉化到0-1之間,而線性映射就沒有這個問題(因為它映射後的資料沒有上下限)。
好了下面說說關於幾個重要的函數:
網路建立函數:feedforwardnet(hiddenSizes,trainFcn) ,(matlab2012後較新的版本),在老版本的matlab,這個函數是newff。這個函數就是建立一個上述的(前饋)網路,包括兩個參數,第一個hiddenSizes隱藏層的大小(實際就是節點數的多少,預設10),trainFcn是網路訓練所採取的方法,這個方法包括:梯度下降演算法、動量梯度下降演算法、變學習率梯度下降演算法等等數10種方法,各種方法各有優缺點,而有代表性的方法是有代表性的五種演算法為:’traingdx’,’trainrp’,’trainscg’,’trainoss’,’trainlm’,預設的是’trainlm’。其實不需要瞭解的太詳細,一般的資料預設的方法就非常的好了,所以這個參數可以不用管。給一個詳細介紹這個函數的連結:
matlab神經網路函數(feedforwardnet,fitnet,patternet)
關於MATLAB神經網路命令feedforwardnet的一些記錄
好了網路建立完以後,下面就是訓練網路的參數了,這裡的參數就是權值矩陣w,v,以及常數矩陣b。函數是train,關於這個函數其實可以有很多參數,也可以只有幾個參數,因為好多參數都是有預設,而採用預設值就可以得到很好的效果,比如迭代次數,訓練最小的允許誤差等等。這裡只說幾個重要的參數,
1.第一個參數,上述建立的網路net,
2.第二個,訓練資料,
3.第三個,與訓練資料對應的資料目標值(分類標籤或者輸出值等),這個輸出值不光可以是一維的,還可以是多維的。
部分詳細參考如下:bp神經網路及matlab實現
而train函數出來的就是訓練好的網路net,matlab出來的net是一個結構體資料,裡麵包括了網路的所有資訊(訓練方法,誤差,包括我們熟悉的權值矩陣w,b等等),那麼我們是否需要把w與b在提取出來呢?並不需要,在實際應用中,我們可以直接把需要測試的資料輸入到net中就可以了。比如說現在網路訓練好了就是net,那麼來了一個測試樣本sample,那麼它的輸出值就是net(sample),這樣就可以達到預測的目的了。
好了,瞭解這些就可以實驗了,還有許多詳細的細節部分也可以改變,用不到的說多了可能也沒有用就不說了。
下面同樣實驗上一節的兩組人造樣本集,線性集與非線性集,畫出來如下:
代碼如下:
%% % * matlab內建神經網路工具箱的分類設計% * 線性與非線性分類% %% clcclearclose all%% Load data% * 資料預先處理--分兩類情況data = load(‘data_test1.mat‘);data = data.data‘;% 將標籤設定為0,1data(:,3) = data(:,3) - 1;%選擇訓練樣本個數num_train = 80;%構造隨機播放序列choose = randperm(length(data));train_data = data(choose(1:num_train),:);gscatter(train_data(:,1),train_data(:,2),train_data(:,3));label_train = train_data(:,end);test_data = data(choose(num_train+1:end),:);label_test = test_data(:,end);%% 神經網路的構建與訓練% 構造神經網路(包含10個隱藏層的節點)net = feedforwardnet(10);% net.layers{2}.transferFcn = ‘tansig‘;% 輸出的映射方法,預設purelin--線性映射% 訓練網路net = train(net,train_data(:,1:end-1)‘,label_train‘);% 顯示構造的網路view(net);% 用這個網路來預測測試集的分類y_test = net(test_data(:,1:end-1)‘);%輸出的值四捨五入,認為大於0.5的屬於類‘1’,其他的屬於類‘0’predict = round(abs(y_test));%% 顯示結果--測試訓figure;index1 = find(predict==0);data1 = (test_data(index1,:))‘;plot(data1(1,:),data1(2,:),‘or‘);hold onindex2 = find(predict==1);data2 = (test_data(index2,:))‘;plot(data2(1,:),data2(2,:),‘*‘);hold onindexw = find(predict‘~=(label_test));dataw = (test_data(indexw,:))‘;plot(dataw(1,:),dataw(2,:),‘+g‘,‘LineWidth‘,3);accuracy = length(find(predict‘==label_test))/length(test_data);title([‘predict the training data and the accuracy is :‘,num2str(accuracy)]);
首先載入線性資料集:
綠色為錯分的點,程式中我們採用的是10個隱含層節點,同時輸出採用的預設的映射—線性映射。程式中也有sigmod映射(對應的注釋掉的地方)。
下面進行非線性資料的測試:
同樣,綠色為錯分的點。可以看到,準確率終於上升到80%以上(與上節對比,基本上不可能)。這裡我們再把輸出映射也改為sigmod映射,因為我們的輸出標籤已經改到了0、1標籤,輸入就在0-1之間,所以可以直接用。將上述對應的注釋去掉,改完後的結果如下:
可以看到輸出採用sigmod函數效果似乎更好些。同時再來看看畫出來的網路結構:
看這個結果和上面那個結構,你發現了什嗎?是不是輸出層的映射關係變化了。
這就是matlab下基本神經網路的訓練與預測實驗,其神經網路工具箱功能遠遠不止這。同時我這是採用函數命令實現的,matlab對於神經網路整合了GUI功能,可以直接在圖形介面操作。在命令視窗輸入:nnstart就會出現下面GUI介面:
可以看到matlab下神經網路主要有四個方向用途:擬合資料,模式識別與分類資料,聚類資料,時間序列模型的資料處理,可以看到,我們這篇的這個問題其實是輸入模式分類資料這部分的,考慮篇幅有限,感興趣自己可以去詳細研究其他用途,異常的強大。
總結一下該部分,matlab內建神經網路工具箱相比上節自己編的,對於線性資料準確率大概差不多,但是對於非線性資料的劃分,工具箱的函數效果最佳化的非常好,同時用法也簡單,運算速度快,可以說是一個非常好的一個分類方法。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
機器學習之實戰matlab神經網路工具箱