姓名:閆偉? 學(xué)號:15020150038
轉(zhuǎn)載自:https://www.zhihu.com/question/28046923/answer/499882606
【嵌牛導(dǎo)讀】:SOM 即自組織映射,是一種用于特征檢測的無監(jiān)督學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)。它模擬人腦中處于不同區(qū)域的神經(jīng)細胞分工不同的特點胀糜,即不同區(qū)域具有不同的響應(yīng)特征,而且這一過程是自動完成的。SOM 用于生成訓(xùn)練樣本的低維空間鳍烁,可以將高維數(shù)據(jù)間復(fù)雜的非線性統(tǒng)計關(guān)系轉(zhuǎn)化為簡單的幾何關(guān)系,且以低維的方式展現(xiàn)愉舔,因此通常在降維問題中會使用它个曙。
【嵌牛鼻子】:SOM 特征檢測 無監(jiān)督學(xué)習(xí)
【嵌牛提問】:SOM是怎樣一種模型(對于初學(xué)者如何操作,算法等)待逞?
【嵌牛正文】:
SOM 與其它人工神經(jīng)網(wǎng)絡(luò)不同甥角,因為它們使用的是競爭性學(xué)習(xí)而不是錯誤相關(guān)的學(xué)習(xí),后者涉及到反向傳播和梯度下降识樱。在競爭性學(xué)習(xí)中嗤无,各個節(jié)點會相互競爭響應(yīng)輸入數(shù)據(jù)子集的權(quán)利震束。訓(xùn)練數(shù)據(jù)通常沒有標簽,映射會學(xué)習(xí)根據(jù)相似度來區(qū)分各個特征当犯。
SOM 的工作原理
下圖展示了 SOM 的訓(xùn)練過程垢村。紫色區(qū)域表示訓(xùn)練數(shù)據(jù)的分布狀況,白色網(wǎng)格表示從該分布中提取的當(dāng)前訓(xùn)練數(shù)據(jù)嚎卫。首先嘉栓,SOM 節(jié)點位于數(shù)據(jù)空間的任意位置。最接近訓(xùn)練數(shù)據(jù)的節(jié)點(黃色高亮部分)會被選中拓诸。它和網(wǎng)格中的鄰近節(jié)點一樣侵佃,朝訓(xùn)練數(shù)據(jù)移動。在多次迭代之后奠支,網(wǎng)格傾向于近似該種數(shù)據(jù)分布(下圖最右)馋辈。
當(dāng)我們將訓(xùn)練數(shù)據(jù)輸入到網(wǎng)絡(luò)中時,會計算出所有權(quán)重向量的歐幾里德距離倍谜。權(quán)重向量與輸入最相似的神經(jīng)元稱為最佳匹配單元(BMU)迈螟。BMU 的權(quán)重和 SOM 網(wǎng)格中靠近它的神經(jīng)元會朝著輸入矢量的方向調(diào)整。一旦確定了 BMU枢劝,下一步就是計算其它哪些節(jié)點在 BMU 的鄰域內(nèi)井联。
自組織的組成部分
初始化:將所有連接權(quán)重初始化為隨機值。
競爭:輸出節(jié)點相互競爭激活的機會您旁,每次只有一個被激活烙常。激活的神經(jīng)元就叫做“贏家通吃”神經(jīng)元。由于存在這種競爭鹤盒,神經(jīng)元被迫自我組織蚕脏,形成自組織映射(SOM)。
合作:在競爭中獲勝的神經(jīng)元會決定活躍神經(jīng)元拓撲鄰域的空間位置侦锯,為相鄰神經(jīng)元之間的合作提供了基礎(chǔ)驼鞭。
適應(yīng):活躍神經(jīng)元會降低判別函數(shù)的個體值,通過適當(dāng)調(diào)整相關(guān)連接權(quán)重來完成(和輸入模式相關(guān))尺碰。這樣挣棕,獲勝神經(jīng)元對隨后應(yīng)用同樣輸入模式的響應(yīng)就會得到增強。判別函數(shù)定義為每個神經(jīng)元j的輸入向量x和權(quán)重向量wj之間的平方歐幾里德距離:
訓(xùn)練 SOM 的步驟
訓(xùn)練 SOM 涉及以下幾步:
初始化每個節(jié)點的權(quán)重亲桥。權(quán)重設(shè)置為標準化小型隨機值洛心。
從訓(xùn)練集中隨機選擇一個向量并呈現(xiàn)給網(wǎng)格。
檢查每個節(jié)點來計算哪一個的權(quán)重最像輸入向量题篷。這會讓你獲得最佳匹配單元(BMU)词身。我們通過迭代所有節(jié)點并計算每個節(jié)點的權(quán)重與當(dāng)前輸入向量之間的歐幾里德距離來計算BMU。權(quán)重向量和輸入向量最接近的節(jié)點則被標記為BMU番枚。
計算BMU鄰域的半徑法严。在半徑范圍內(nèi)找到的節(jié)點則認為處于BMU鄰域內(nèi)损敷。
調(diào)整在步驟4中發(fā)現(xiàn)的節(jié)點的權(quán)重,讓它們更像輸入向量深啤。節(jié)點和BMU越近拗馒,權(quán)重調(diào)整的越多。
重復(fù)步驟2墓塌,迭代N次瘟忱。
SOM 的應(yīng)用
SOM 通常用在可視化中。比如下圖苫幢,世界各國貧困數(shù)據(jù)的可視化访诱。生活質(zhì)量較高的國家聚集在左上方,而貧困最嚴重的國家聚集在右下方韩肝。
SOM 的其它一些應(yīng)用還包括:
數(shù)據(jù)壓縮
語音識別
分離音源
欺詐檢測
MiniSom 簡介
MiniSom 基于 Numpy触菜,以簡約的風(fēng)格實現(xiàn)了 SOM。通過 pip 就可以下載 MiniSom:
pip install minisom
如何使用 MiniSom哀峻?
如果想使用 MiniSom涡相,你的數(shù)據(jù)必須組織為 Numpy 數(shù)組的形式,用行表示一個觀察值剩蟀。
data = [[ 0.80, 0.55, 0.22, 0.03],[ 0.82, 0.50, 0.23, 0.03],[ 0.80, 0.54, 0.22, 0.03],[ 0.80, 0.53, 0.26, 0.03],[ 0.79, 0.56, 0.22, 0.03],[ 0.75, 0.60, 0.25, 0.03],[ 0.77, 0.59, 0.22, 0.03]]
待數(shù)據(jù)集設(shè)置好后催蝗,就可以按照如下方式實現(xiàn) MiniSom。第一步是在安裝 MiniSom 后導(dǎo)入 MiniSom 類育特。
from minisom import MiniSom
接著丙号,我們可以以 0.5 的學(xué)習(xí)率來初始化一個 6*6 的 SOM。
som = MiniSom(6, 6, 4, sigma=0.3, learning_rate=0.5)Then we train the SOM on 100 iterations.som.train_random(data, 100)
MiniSom 實現(xiàn)了兩類訓(xùn)練:train_random 和 train_batch缰冤。在 train_random 中犬缨,我們通過從數(shù)據(jù)中選擇隨機樣本來訓(xùn)練模型。在 train_batch 中棉浸,按照樣本的存儲順序來選擇它們怀薛。使用 random_weights_init 方法,通過從數(shù)據(jù)中選擇隨機樣本來初始化權(quán)重迷郑。
用 MiniSom 創(chuàng)建一個簡單的 SOM
現(xiàn)在我們使用所學(xué)的知識來創(chuàng)建一個簡單的顏色量化模型枝恋。顏色量化就是減少圖像中所用的特殊顏色,并且讓得到的新圖像盡可能地從視覺上和原圖像相似嗡害。當(dāng)我們在只能顯示有限數(shù)量的顏色的設(shè)備上展示具有更多顏色的圖像時鼓择,顏色量化就有很大的用途。如果內(nèi)存有限就漾,難度就更大了。我們下面就搭建一個模型念搬,可以學(xué)習(xí)一張房屋圖像中的顏色抑堡,然后用學(xué)到的知識來重構(gòu)原圖像摆出。
第一步是從 MiniSom 中導(dǎo)入 MiniSom 類,以及 Numpy 和 matplotlib首妖。如果你用的是 Jupyter偎漫,需要在代碼行中包含 %matplotlib 來查看 notebook 中的圖像。
from minisom import MiniSomimport numpy as npimport matplotlib.pyplot as plt%matplotlib inline
加載圖像
之前提到過有缆,MiniSom 是基于 Numpy 實現(xiàn)的 SOM象踊,因此我們必須將圖像加載為一個數(shù)組∨锉冢可以使用 matplotlib 的 imread 實用程序來完成杯矩。
img = plt.imread('house.jpg')
可以用 matplotlib 中的 imshow 函數(shù)來查看加載后的圖像。
plt.imshow(img)
我們檢查一下加載后的圖像形狀袖外。
可以看到它是一個 3D 矩陣史隆,我們需要乘以 730 和 1368 將數(shù)組轉(zhuǎn)換為一個 2D 數(shù)組,如下所示曼验。在這之后泌射,我們用 Numpy 的 shape 屬性來檢查它的形狀。
pixels = np.reshape(img, (img.shape[0]*img.shape[1], 3))
SOM 初始化和訓(xùn)練
我們初始化 MiniSom 對象并將其分配給變量 som鬓照。它采用的第一個參數(shù)是 SOM 的維度熔酷。在我們的例子中,我們將構(gòu)建一個 3*3 的 SOM豺裆。這意味著我們得到的最終顏色將是 3 * 3拒秘,即 9。這里的數(shù)字可以隨意嘗試留储,看看你會得到哪些不同的結(jié)果翼抠。顯然,SOM 越大获讳,訓(xùn)練所需的時間就越長阴颖。
第二個參數(shù)是 input_len,它是我們數(shù)據(jù)集中的特征數(shù)量丐膝。在我們的例子中量愧,我們使用 3,對應(yīng)了像素數(shù)組的形狀帅矗。如果你使用其它數(shù)字偎肃,會得到一個值錯誤異常,指示 MiniSom 無法將形狀(3)中的輸入數(shù)組發(fā)送到你選擇的數(shù)字中浑此。
下一個參數(shù)是 sigma累颂,它是 SOM 中不同相鄰節(jié)點的半徑,默認值為 1.0。
最后一個參數(shù)是 learning_rate紊馏,它確定每次迭代期間權(quán)重的調(diào)整幅度料饥。經(jīng)過幾次實驗,發(fā)現(xiàn) sigma 為 0.1朱监,學(xué)習(xí)率為 0.2岸啡,會得到一些不錯的結(jié)果。
som = MiniSom(x= 3, y = 3, input_len = 3, sigma=0.1, learning_rate=0.2)
下一步是將SOM的權(quán)重初始化為小的標準化隨機值赫编。我們使用random_weights_init函數(shù)并傳入我們的數(shù)據(jù)(像素)來實現(xiàn)這一點巡蘸。
som.random_weights_init(pixels)
我們現(xiàn)在需要保存起始權(quán)重,它們代表圖像的初始顏色擂送。稍后會將它們可視化悦荒。我們保存這些權(quán)重的方法是使用 get_weights 函數(shù)和 Python 的副本來確保在權(quán)重更新之前得到它們。
starting_weights = som.get_weights().copy()
然后我們通過運行 train_random 函數(shù)來訓(xùn)練像素团甲。它需要兩個參數(shù)逾冬,第一個參數(shù)是需要訓(xùn)練的數(shù)據(jù)集,第二個參數(shù)是迭代次數(shù)躺苦。
som.train_random(pixels, 100)
向量量化
下一步是量化圖像的每個像素身腻。在此過程中,我們將減少圖像中的顏色數(shù)量匹厘。我們使用 MiniSom 中的 quantization 實用程序來完成這一步嘀趟。
qnt = som.quantization(pixels)
創(chuàng)建新圖像
如果你還記得,在這個過程的開始我們必須將圖像轉(zhuǎn)換成 2D 數(shù)組愈诚。但是她按,現(xiàn)在我們需要將圖像構(gòu)建為 3D 圖像】蝗幔可以用我們在開頭加載的圖像維度創(chuàng)建一個只有零的矩陣來完成這項工作酌泰。借助 Numpy 的 zero 實用程序,我們可以輕松完成這項工作匕累。
clustered = np.zeros(img.shape)
接下來我們需要做的是將量化后的值放入新圖像中陵刹。為此,我們使用 Numpy 的 unravel_index 功能欢嘿。這個函數(shù)有三個參數(shù):
indices:array_like
一個整數(shù)數(shù)組衰琐,其元素是維度變暗數(shù)組的平鋪版本的索引。
dims:整數(shù)元組
用于解開 indices.dex 值的數(shù)組的形狀:
Order:{'C'炼蹦,'F'}羡宙,可選
確定是否應(yīng)將索引視為以行主(C樣式)或列主(Fortran樣式)順序編制索引。
for i, q in enumerate(qnt):? clustered[np.unravel_index(i, dims=(img.shape[0], img.shape[1]))] = q
顯示結(jié)果
Matplotlib 能讓我們用 imshow 在軸上繪制圖像掐隐。我們使用一個 Matplotlib 圖和 4 個子圖來完成繪圖狗热。第一個和第二個子圖將顯示原始圖像和新圖像。第三和第四個子圖將顯示初始圖像顏色和 SOM 學(xué)習(xí)的顏色。
我們創(chuàng)建一個 12*6 的圖像匿刮。然后我們創(chuàng)建子圖指攒,它有 3 個參數(shù):行數(shù),列數(shù)和圖索引僻焚。當(dāng)這些數(shù)字小于 10 時,可以作為三位數(shù)傳遞膝擂,如下所示虑啤。然后我們使用 Matplotlib 的 imshow 來繪制圖像。
plt.figure(figsize=(12, 6))plt.subplot(221)plt.title('Original')plt.imshow(img)plt.subplot(222)plt.title('Result')plt.imshow(clustered)
我們以類似的方式創(chuàng)建第三和第四個子圖架馋。
plt.subplot(223)plt.title('Initial Colors')plt.imshow(starting_weights)plt.subplot(224)plt.title('Learnt Colors')plt.imshow(som.get_weights())
我們使用 tight_layout 功能來確保我們的繪圖不會擠在一起狞山。最后,我們使用 plt.show()繪制它們叉寂。
plt.tight_layout()plt.show()
就這樣我們搭建了一個 SOM 網(wǎng)絡(luò)萍启,能夠完成顏色量化任務(wù),重構(gòu)原圖像屏鳍。
結(jié)語
本文我們討論了 SOM 的含義及其工作原理勘纯,并用 MiniSom 實現(xiàn)了一個簡單 SOM 模型。值得一提的是钓瞭,在我們涉及 SOM 的工作中驳遵,MiniSom 是個不錯的工具,可用于基于 SOM 的欺詐檢測和機器人開發(fā)的任務(wù)中山涡,均取得不俗的成績堤结。