梅林網(wǎng)站建設(shè)網(wǎng)站診斷工具
本站原創(chuàng)文章,轉(zhuǎn)載請說明來自《老餅講解-BP神經(jīng)網(wǎng)絡(luò)》bp.bbbdata.com
本文展示如何用matlab工具箱訓(xùn)練一個SOM神經(jīng)網(wǎng)絡(luò)的DEMO
并講解其中的代碼含義和相關(guān)使用說明
- 01.SOM神經(jīng)網(wǎng)絡(luò)DEMO代碼 -
- 本文說明 -
下面,我們先隨機初始化一些樣本點,
然后調(diào)用matlab的神經(jīng)網(wǎng)絡(luò)工具箱訓(xùn)練一個SOM神經(jīng)網(wǎng)絡(luò)
并借此DEMO講解如何用matlab工具箱SOM神經(jīng)網(wǎng)絡(luò)的使用
- SOM神經(jīng)網(wǎng)絡(luò)DEMO代碼 -
% 本demo展示用matlab工具箱訓(xùn)練一個SOM神經(jīng)網(wǎng)絡(luò)% 生成用于聚類的數(shù)據(jù)rand('seed',70);% 隨機種子,設(shè)定隨機種子是為了每次的結(jié)果一樣
dataC =[2.5,2.5;7.5,2.5;2.5,7.5;7.5,7.5]';% 生成四個樣本中心
sn =80;% 樣本個數(shù)
X =rand(2,sn)+dataC(:,mod(1:sn,4)+1);% 隨機生成樣本點% 調(diào)用工具箱訓(xùn)練一個SOM網(wǎng)絡(luò)
net =selforgmap([35]);% 建立一個SOM神經(jīng)網(wǎng)絡(luò)
net =train(net,X);% 訓(xùn)練網(wǎng)絡(luò)
W = net.IW{1};% 網(wǎng)絡(luò)的權(quán)重,也即各個聚類中心的位置
y =net(X);% 用訓(xùn)練好的網(wǎng)絡(luò)進(jìn)行預(yù)測
classes =vec2ind(y);% 將預(yù)測結(jié)果由one-hot格式轉(zhuǎn)為類別索引% 繪圖plot(X(1,:),X(2,:),'*');% 原始樣本
hold on
plot(W(:,1),W(:,2),'or','MarkerFaceColor','g');% 網(wǎng)絡(luò)訓(xùn)練好的聚類中心
- 運行結(jié)果 -
運行結(jié)果如下
綠色的隱神經(jīng)元(聚類中心),紅色的是樣本

- 02. matlab的SOM神經(jīng)網(wǎng)絡(luò)使用解說 -
本節(jié)講解matlab工具箱如何訓(xùn)練一個SOM神經(jīng)網(wǎng)絡(luò),及一些常用的問題
- 如何訓(xùn)練一個SOM神經(jīng)網(wǎng)絡(luò) -
從上面的例子我們可以看到,
使用selforgmap函數(shù)就可以建立一個SOM神經(jīng)網(wǎng)絡(luò),
然后用train函數(shù)對網(wǎng)絡(luò)進(jìn)行訓(xùn)練(需要傳入訓(xùn)練的數(shù)據(jù)),
最后把要預(yù)測的樣本傳入訓(xùn)練好的net中,就可以得到預(yù)測結(jié)果
如下
net = selforgmap([3 5]);
net = train(net,X);
y = net(X);
PASS:selforgmap中的[3 5]用于指定隱節(jié)點拓?fù)錇?*5,即15個隱節(jié)點
??關(guān)于selforgmap的入?yún)⒄f明
selforgmap共有5個入?yún)?#xff1a;
dimensions :行向量,它定義了隱層神經(jīng)元尺寸
例如[8 3]定義了2維(8*3)的隱層
coverSteps :在該步數(shù)之后,領(lǐng)域距離<=1,即不再更新鄰域神經(jīng)元
initNeighbor :初始的鄰域閾值
topologyFcn :隱層拓?fù)浣Y(jié)構(gòu)函數(shù)
distanceFcn :拓?fù)渚嚯x計算函數(shù)
默認(rèn)參數(shù)為:selforgmap([8 8],100,3,'hextop',linkdist')
- 如何預(yù)測類別 -
如果要預(yù)測樣本X的類別,
只需使用net(X)就可以得到樣本的分類類別
如果net(X)輸出[0,0,1],則代表類別是第3類
如何將one-hot形式的判別結(jié)果轉(zhuǎn)為類別序號
net(X)得到分類結(jié)果的是one-hot形式,
即得到的結(jié)果是[0 ,0 ,1]這種形式
為了直接得到類別的序號3,而不是[0 ,0 ,1],
可以通過vec2ind函數(shù)將[0 ,0 ,1]轉(zhuǎn)為3
如下

- 如何查看類別中心 -
SOM神經(jīng)網(wǎng)絡(luò)的權(quán)重W就是各個類別中心
用net.IW{1}就可以提取出來
如下,就是15個聚類中心的位置

- 相關(guān)的繪圖函數(shù) -
另外,工具箱還附帶了相關(guān)的繪圖函數(shù)
可以畫出較好看的SOM相關(guān)圖片
👉plotsomhits
👉plotsomnc
👉plotsomnd
👉plotsomplanes
👉plotsompos
👉plotsomtop
但基本都是只有數(shù)據(jù)是二維時才能使用/或才具有意義
因此老餅不再講解,需要了解的自行在matlab里help一下
相關(guān)文章
《BP神經(jīng)網(wǎng)絡(luò)梯度推導(dǎo)》
《BP神經(jīng)網(wǎng)絡(luò)提取的數(shù)學(xué)表達(dá)式》
《一個BP的完整建模流程》