机器学习算法——神经网络6(SOM网络)
SOM(Self-Organizing Map,自組織映射)網絡也是一種競爭學習型的無監督神經網絡。
它能將高維數據映射到低維空間(通常為二維),同時保持輸入數據在高維空間的拓撲結構,即將高維數據中相似的樣本點映射到網絡輸出層中的鄰近神經元。
SOM網絡結構為:
輸入層神經元的數量是由輸入向量的維度決定的,一個神經元對應一個特征。
輸出層中的一個節點代表一個需要聚成的類。
SOM網絡結構的區別主要在競爭層:可以有1維、2維(最常見)。競爭層也可以有更高的維度,不過處于可視化的目的,高維競爭層用的比較少。輸出層中的節點與輸入層的節點是全連接的。
其中二維平面有2種平面結構,即
? ? ? ?
?競爭層SOM神經元的數量決定了最終模型的粒度與規模,這對最終模型的準確性與泛化能力影響很大。
?根據查找的資料,有人得出一條經驗公式:競爭層最少節點數量=,N是訓練樣本的個數。如果是正方形輸出,邊長等于競爭層節點數再開一次根號,并向上取整即可。
SOM網絡中的輸出層神經元以矩陣方式排列在二維空間中,每個神經元都擁有一個權向量,網絡在接收輸入向量后,將會確定輸出層獲勝神經元,它決定了該輸入向量在低維空間中的位置。
SOM的訓練過程:在接收到一個訓練樣本后,每個輸出層神經元會計算該樣本與自身攜帶的權向量之間的距離,距離最近的神經元成為競爭獲勝者,稱為最佳匹配單元。然后最佳匹配單元及其鄰近神經元的權向量將被調整,以使這些權向量與當前輸入樣本的距離縮小。這個過程不斷迭代,直至收斂。
SOM的主要目標是將任意維度的輸入信號模式轉換為一維或二維離散映射,并以拓撲有序的方式自適應地執行這種變換。
SOM網采用的算法稱為Kohonen算法,在“勝者通吃”(Winner-Talk-All,WTA)學習規則上加以改進的,主要區別是調整權向量與側抑制的方式不同:
WTA:側抑制是封殺式的,只有獲勝神經元可以調整其權值,其他神經元都無權調整。
Kohonen算法:獲勝的神經元對其鄰近神經元的影響是由近及遠,由興奮逐漸變為抑制。即,不僅獲勝神經元要調整權值,它周圍的神經元也要不同程度調整權向量。
常見的調整方式有:
①墨西哥草帽函數:獲勝節點有最大的權值調整量,鄰近的節點有稍小的調整量,離獲勝節點距離越大,權值調整量越小。直到某一距離d0時,權值調整為零。當距離再遠一些時,權值調整量稍負,更遠又回到零。如圖a所示。
②大禮帽函數:他是墨西哥草帽函數的一種簡化。如圖b所示。
③廚師帽函數:它是大禮帽函數的一種簡化,如圖c所示。
?以獲勝神經元為中心設定一個鄰域半徑R,該半徑固定的范圍稱為優勝鄰域。在SOM網學習方法中,優勝鄰域內的所有神經元,均按其與獲勝神經元距離的遠近不同程度調整權值。優勝鄰域開始定的較大,但其大小隨著訓練次數的增加不斷收縮,最終收縮到半徑為零。
SOM算法學習的過程為:
(1)初始化:對輸出層各權向量賦小隨機數并進行歸一化處理,得到(j=1,2,...,m),m為輸出層神經元數目。建立初始優勝鄰域和學習率初值。
(2)接受輸入:從訓練集中隨機取一個輸入模式并進行歸一化處理,得到(p=1,2,...,n),n為輸入層神經元數目。
(3)尋找獲勝節點
計算與的點積,從而找到點積最大的獲勝節點j*
(4)定義優勝鄰域
?以j*為中心確定t時刻的權值調整域。
(5)調整權值
對優勝鄰域內的所有節點調整權值
, i=1,2,...,n,
是訓練時間t和鄰域內第j個神經元與獲勝神經元j*之間的拓撲距離N的函數。該函數一般有以下規律:t??η?,N??η?,可以選擇指數衰減,即
(6)結束判定
當學習率α(t)≤αmin時,訓練結束;不滿足結束條件時,轉到步驟(2)繼續。(結束條件其實為學習率衰減為0。)
SOM與KMeans算法相似,所不同的是,SOM網絡不需要預先提供聚類數量,類別的數據由網絡自動識別出來。
講完理論,然后講Python代碼實現SOM算法,用到的數據集為Iris數據集。
首先導入所需要的庫:
# coding=utf-8 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from minisom import MiniSomfrom sklearn.metrics import classification_report import numpy as np import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import math主函數:
if __name__ == '__main__':# 數據準備iris = load_iris()X = iris.datay = iris.targetfeature_names = iris.feature_namestarget_names = iris.target_names#劃分數據集X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.3, random_state=100)#訓練Som模型#樣本數量N = X_train.shape[0]#維度/特征數量M = X_train.shape[1]#設置超參數size = math.ceil(np.sqrt(5*np.sqrt(N))) #向上取整,經驗公式,決定輸出層尺寸print("訓練樣本個數:{} 測試樣本個數:{}".format(N, X_test.shape[0]))print("輸出網格最佳邊長:", size)max_iter = 400som = MiniSom(size, size, M, sigma=3, learning_rate=0.5, neighborhood_function='bubble')#初始化權值,有2個API# som.random_weights_init(X_train)#帶有一定的隨機性som.pca_weights_init(X_train)#pca初始化的結果是固定的,也就是說網絡初始狀態是固定的。som.train_batch(X_train, max_iter, verbose=False)#每次按順序取一個樣本,用過最后一個樣本后跳回第一個樣本,#循環直到迭代次數滿足max_iter#som.train_random(X_train, max_iter, verbose=False)每次迭代隨機挑選一個樣本來更新權重,直到迭代次數滿足max_iter#分類winmap = som.labels_map(X_train, Y_train)#返回一個雙層字典,反映每個神經元收集到的標簽種類,及每個標簽下的樣本個數print(winmap)#一個是神經元的坐標,一個是列表中每個元素出現的次數。y_pred = classify(som, X_test, winmap)print(classification_report(Y_test, np.array(y_pred), target_names=target_names))#第一種可視化#根據權重矩陣w,可以計算每個神經元距離他最近的鄰近神經元的距離,計算好的矩陣就是U-Matrix# heatmap = som.distance_map()#生成U-Matrix# plt.imshow(heatmap, cmap='bone_r')# plt.colorbar()# plt.show()#第二種可視化方案label_name_map_number = {"setosa": 0, "versicolor": 1, "virginica": 2}the_grid = GridSpec(size, size)for position in winmap.keys():label_fracs = [winmap[position][label] for label in [0, 1, 2]]plt.subplot(the_grid[position[1],position[0]],aspect=1)patches, texts = plt.pie(label_fracs)plt.text(position[0]/100, position[1]/100, str(len(list(winmap[position].elements()))),color='black', va='center', ha='center')plt.legend(patches, target_names, loc='center right', bbox_to_anchor=(-1,8), ncol=3)plt.show()主函數中用到了分類函數classify,具體實現如下:
#分類函數 def classify(som, data, winmap):default_class = np.sum(list(winmap.values())).most_common()[0][0]print(np.sum(list(winmap.values())))result = []for d in data:win_position = som.winner(d)if win_position in winmap:result.append(winmap[win_position].most_common()[0][0])else:result.append(default_class)return result最后得到som算法的可視化結果,第一種可視化結果為(a),第二種可視化結果為(b)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (a)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (b)
(a)是權重矩陣可視化。
(b)中在每個格子里畫餅圖,且用顏色表示類別,用數字表示總樣本數量。
?
?
總結
以上是生活随笔為你收集整理的机器学习算法——神经网络6(SOM网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qpOASES使用笔记
- 下一篇: Pak文件