生物學研究表明,在人腦的感覺通道上,神經元的組織原理是有序排列的。當外界的特定時空信息輸入時,大腦皮層的特定區域興奮,而且類似的外界信息在對應的區域是連續映像的。生物視網膜中有許多特定的細胞對特定的圖形比較敏感,當視網膜中有若干個接收單元同時受特定模式刺激時,就使大腦皮層中的特定神經元開始興奮,輸入模式接近,與之對應的興奮神經元也接近;在聽覺通道上,神經元在結構排列上與頻率的關系十分密切,對於某個頻率,特定的神經元具有最大的響應,位置相鄰的神經元具有相近的頻率特征,而遠離的神經元具有的頻率特征差別也較大。大腦皮層中神經元的這種響應特點不是先天安排好的,而是通過后天的學習自組織形成的。
據此芬蘭Helsinki大學的Kohonen T.教授提出了一種自組織特征映射網絡(Self-organizing feature Map,SOM),又稱Kohonen網絡[1-5]。Kohonen認為,一個神經網絡接受外界輸入模式時,將會分為不同的對應區域,各區域對輸入模式有不同的響應特征,而這個過程是自動完成的。SOM網絡正是根據這一看法提出的,其特點與人腦的自組織特性相類似。
一、競爭學習算法基礎:
1、自組織神經網絡結構
(1)定義
自組織神經網絡是無導師學習網絡。它通過自動尋找樣本中的內在規律和本質屬性,自組織、自適應地改變網絡參數與結構。
(2)結構
層次型結構,具有競爭層。典型結構:輸入層+競爭層。如圖1所示。

a. 輸入層:接受外界信息,將輸入模式向競爭層傳遞,起“觀察”作用。
b.競爭層:負責對輸入模式進行“分析比較”,尋找規律,並歸類。
二、自組織神經網絡的原理
1.分類與輸入模式的相似性
分類是在類別知識等導師信號的指導下,將待識別的輸入模式分配到各自的模式類中,無導師指導的分類稱為聚類,聚類的目的是將相似的模式樣本划歸一類,而將不相似的分離開來,實現模式樣本的類內相似性和類間分離性。由於無導師學習的訓練樣本中不含期望輸出,因此對於某一輸入模式樣本應屬於哪一類並沒有任何先驗知識。對於一組輸入模式,只能根據它們之間的相似程度來分為若干類,因此,相似性是輸入模式的聚類依據。
2、相似性測量
神經網絡的輸入模式向量的相似性測量可用向量之間的距離來衡量。常用的方法有歐氏距離法和余弦法兩種。
(1)歐式距離法
設X,Xi為兩行向量,其間的歐式距離
d越小,X與Xi越接近,兩者越相似,當d=0時,X=Xi 以d=T(常數)為判據,可對輸入向量模式進行聚類分析:由於d12d23d31均小於T,d45d56d46均小於T,而d1i>T (i=4,5,6);d2i>T(i=4,5,6),d3i>T(i=4,5,6),
故將輸入模式 Xi按如下分類:

(2)余弦法:
設X,Xi為兩向量,其間的夾角余弦
cosΨ=
舉例:
鷲尾屬植物數據集含有三類樣本,前 50 個樣本為一類,中間 50 個樣本為一類,后 50 個樣本為一類。每個樣本有四維特征。用SOM對這些樣本分類。
1)、數據處理
訓練集:取每個樣本的前25個作為訓練數據集,總共有75個數據;
測試集:每個樣本的后25個構成測試數據集。總共75個數據。
2)、結構
輸入層:每個樣本有四維特征,所以輸入層有4個神經元。
輸出層:輸入層神經元經過一個四維的權連接分別至三個輸出神經元。
3)、參數的初始化
a.神經元節點總數:3*1
b.神經元權值初始化:[0,1]之間的隨機數
c. 學習率:0.6;
迭代次數7000;
鄰域初始值:2
d、鄰域函數:
e、權值調整公式:
4)代碼:
%som實現
%2016-11-12
%by wangbaojia
% som原理及參數說明
% 1.競爭:匹配最佳神經元---------->計算每個樣本和初始神經網絡的距離,距離最近神經元作為獲勝神經元
%
% 2.合作:在權值更新過程中,不僅獲勝神經元的權
%值向量得到更新,而且其近鄰神經元的權值向量也按照某個“近鄰函數”進行更新。這樣在開
%始時移動量很大,權值向量大致地可按它們的最終位置來排序;
%獲勝神經元決定興奮神經元的拓撲鄰域的空間位置,從而提供了相鄰神經元合作的基礎
% 拓撲鄰域:規則多邊形一般都可以作為鄰域形狀,常用的主要有正方形或六邊形,正方形更為普遍
%
%權重向量的調整就發生在獲勝神經元的鄰域內。在訓練的剛開始階段,這個鄰域比較大,
%隨着訓練的進行,這個鄰域開始不斷減小
%
% 3.自適應:權值更新過程
% 算法:
% 1.初始化
% 1)迭代次數:時間步長iter
% 2)輸出結點權值向量初始值,向量各元素可選區間(0,1)上的隨機值,這里選擇正方形鄰域
% 3)學習率初始值
% 4)鄰域半徑的設置應盡量包含較多的鄰神經元,整個輸出平面的一半
% 2.求競爭獲勝神經元;歐拉距離函數求解
% 3.權值更新:
% 獲勝節點和鄰域范圍內神經元集合的m個節點更新權值,j=1:m;
% wj(t+1)=wj(t)+learnfun(t)*neighborfun(t)*(x-wj);
% 4.更新學習率,更新鄰域函數
% neighborfun(t)=neighbor0*exp(-dij/t1); t1=iter/log(neighbor0)
% learnfun(t)=learn0*exp(-t/t2); t2=iter
% 5.當特征映射不再發生明顯變化時或達到最大網絡訓練次數時退出,否則轉入第2步
%載入數據,data數據每一行為一個用空格區分的多維數據樣本
tic;
%樣本數據的位置
file_path='E:\machine learning\神經網絡第二次作業\SOM\';
path=strcat(file_path,'data.txt');
%加載所有數據
full_data=load(path);
%數據處理:訓練集和測試集各占一半
data=zeros(75,4);%訓練數據集
test_data=zeros(75,4);%測試數據集
n=0;m=0;
for j=1:6
if rem(j,2)==1
data(25*n+1:25*(n+1),:)=full_data(25*(j-1)+1:25*j,:);
n=n+1;
else
test_data(25*m+1:25*(m+1),:)=full_data(25*(j-1)+1:25*j,:);
m=m+1;
end
end
[data_row,data_clown]=size(data);
%自組織映射網絡m*n
m=3;
n=1;
%神經元節點總數som_sum
som_sum=m*n;
%權值初始化,隨機初始化
w = rand(som_sum, data_clown);
%初始化學習率
learn0 = 0.6;
learn_rate = learn0;
%學習率參數
learn_para=1000;
%設置迭代次數
iter =700;
%神經元位置
[I,J] = ind2sub([m, n], 1:som_sum);
%鄰域初始化
neighbor0 =2;
neighbor_redius = neighbor0;
%鄰域參數
neighbor_para = 1000/log(neighbor0);
%迭代次數
for t=1:iter
% 樣本點遍歷
for j=1:data_row
%獲取樣本點值
data_x = data(j,:);
%找到獲勝神經元
[win_row, win_som_index]=min(dist(data_x,w'));
%獲勝神經元的拓撲位置
[win_som_row,win_som_cloumn] = ind2sub([m, n],win_som_index);
win_som=[win_som_row,win_som_cloumn];
%計算其他神經元和獲勝神經元的距離,鄰域函數
%distance_som = sum(( ([I( : ), J( : )] - repmat(win_som, som_sum,1)) .^2) ,2);
distance_som = exp( sum(( ([I( : ), J( : )] - repmat(win_som, som_sum,1)) .^2) ,2)/(-2*neighbor_redius*neighbor_redius)) ;
%權值更新
for i = 1:som_sum
% if distance_som(i)<neighbor_redius*neighbor_redius
w(i,:) = w(i,:) + learn_rate.*distance_som(i).*( data_x - w(i,:));
end
end
%更新學習率
learn_rate = learn0 * exp(-t/learn_para);
%更新鄰域半徑
neighbor_redius = neighbor0*exp(-t/neighbor_para);
end
%data數據在神經元的映射
%神經元數組som_num存儲圖像編號
som_num=cell(1,size(w,1));
for i=1:size(w,1)
som_num{1,i}=[];
end
%每個神經元節點對應的data樣本編號
for num=1:data_row
[som_row,clown]= min(sum(( (w - repmat(test_data(num,:), som_sum,1)) .^2) ,2));
som_num{1,clown}= [som_num{1,clown},num];
end
%存儲神經元數組,.mat格式
path1=strcat(file_path,'som_num.mat');
save(path1,'som_num');
toc;
實驗結果:
分為三類:
第一類:51 54 55 56 57 58 61 62 63 65 66 67 69 70 71 73 74
第二類: 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 52 53 59 60 64 68 72 75
第三類:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
分類正確率:89.33%
