SOM模型

姓名:閆偉? 學(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ù)中山涡,均取得不俗的成績堤结。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸭丛,隨后出現(xiàn)的幾起案子竞穷,更是在濱河造成了極大的恐慌,老刑警劉巖鳞溉,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘾带,死亡現(xiàn)場離奇詭異,居然都是意外死亡穿挨,警方通過查閱死者的電腦和手機月弛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來科盛,“玉大人帽衙,你說我怎么就攤上這事≌昝啵” “怎么了厉萝?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我谴垫,道長章母,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任翩剪,我火速辦了婚禮乳怎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘前弯。我一直安慰自己蚪缀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布恕出。 她就那樣靜靜地躺著询枚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浙巫。 梳的紋絲不亂的頭發(fā)上金蜀,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音的畴,去河邊找鬼渊抄。 笑死,一個胖子當(dāng)著我的面吹牛苗傅,可吹牛的內(nèi)容都是我干的抒线。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼渣慕,長吁一口氣:“原來是場噩夢啊……” “哼嘶炭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逊桦,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤眨猎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后强经,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睡陪,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年匿情,在試婚紗的時候發(fā)現(xiàn)自己被綠了兰迫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡炬称,死狀恐怖汁果,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玲躯,我是刑警寧澤据德,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布鳄乏,位于F島的核電站,受9級特大地震影響棘利,放射性物質(zhì)發(fā)生泄漏橱野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一善玫、第九天 我趴在偏房一處隱蔽的房頂上張望水援。 院中可真熱鬧,春花似錦茅郎、人聲如沸裹唆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劳坑,卻和暖如春毕谴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背距芬。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工涝开, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人框仔。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓舀武,卻偏偏與公主長得像,于是被迫代替她去往敵國和親离斩。 傳聞我的和親對象是個殘疾皇子银舱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容