TensorFlow深度學習實戰(20)——自組織映射詳解

TensorFlow深度學習實戰(20)——自組織映射詳解

    • 0. 前言
    • 1. 自組織映射原理
    • 2. 自組織映射的優缺點
    • 3. 使用自組織映射實現顏色映射
    • 小結
    • 系列鏈接

0. 前言

自組織映射 (Self-Organizing Map, SOM) 是一種無監督學習算法,主要用于高維數據的降維、可視化和聚類分析,廣泛應用于數據挖掘、模式識別、圖像處理等領域。

1. 自組織映射原理

K-means 和主成分分析 (Principal Component Analysis, PCA) 都可以對輸入數據進行聚類,但它們不保持拓撲關系。在本節中,我們將介紹自組織映射 (Self-Organizing Map, SOM),也稱 Kohonen 網絡,或 WTU (Winner-Take-All Unit),由 Teuvo Kohonen1982 年提出,這類方法能夠保持拓撲關系。SOM 是一種非常特殊的神經網絡,受到人腦一個獨特特征的啟發,在人類大腦中,不同的感官輸入以拓撲順序的方式表示。與其他神經網絡不同,神經元之間不是通過權重連接在一起,而是相互影響學習。SOM 最重要的是,神經元以拓撲方式表示學習到的輸入。
SOM 中,神經元通常放置在( 1D2D )網格的節點上。雖然也可以使用更高維度,但在實踐中很少使用。網格中的每個神經元通過權重矩陣連接到所有輸入單元。下圖展示了一個具有 6 × 8 (48 個)神經元和 5 個輸入的 SOM。在這種情況下,每個神經元將有 5 個元素,從而形成一個大小為 48 × 5 的權重矩陣:

SOM

自組織映射 (Self-Organizing Map, SOM) 通過競爭學習來學習,可以視為 PCA 的非線性推廣,因此,像主成分分析 (Principal Component Analysis, PCA) 一樣,也可以用于降維。
為了實現 SOM,首先需要了解它的工作原理。第一步是將網絡的權重初始化為隨機值或從輸入中隨機抽樣。每個占據網格空間的神經元將被分配特定的位置,與輸入距離最小的神經元稱為獲勝神經元 (Best Matching Unit, BMU),通過測量所有神經元的權重向量 W W W 與輸入向量 X X X 之間的距離實現:
d j = ∑ i = 1 N ( W i j ? X i ) 2 d_j=\sqrt{\sum_{i=1}^N(W_{ij}-X_i)^2} dj?=i=1N?(Wij??Xi?)2 ?
其中, d j d_j dj? 是神經元 j j j 的權重與輸入 X X X 之間的距離,具有最低 d d d 值的神經元是獲勝神經元。
接下來,調整勝者神經元及其鄰近神經元的權重,以確保如果下一次輸入相同,同一神經元仍然是獲勝神經元。
為了決定哪些鄰近神經元需要修改,網絡使用鄰域函數 ∨ ) ( r ) \vee )(r) )(r),通常使用以下鄰域函數:
∨ ( r ) = e ? d 2 2 σ 2 \vee (r)=e^{-\frac {d^2}{2\sigma^2}} (r)=e?2σ2d2?
其中, σ \sigma σ 是神經元影響范圍的時間依賴半徑, d d d 是它與獲勝神經元的距離,函數圖像如下所示。

函數圖像

鄰域函數的另一個重要特性是其半徑會隨著時間減少。因此,在開始時,許多鄰近神經元的權重會修改,但隨著網絡的學習,最終只有少數神經元的權重(有時是一個或沒有)在學習過程中修改。
權重的變化根據以下方程:
d W = η ∧ ( X ? W ) dW=\eta \wedge(X-W) dW=η(X?W)
對所有輸入重復迭代以上過程。隨著迭代的進行,根據迭代次數逐漸降低學習率和半徑。

2. 自組織映射的優缺點

自組織映射 (Self-Organizing Map, SOM) 的計算成本較高,因此對于較大的數據集并不實用。但它們易于理解,并且能夠很好地發現輸入數據之間的相似性。因此,SOM 被廣泛應用于圖像分割和在自然語言處理中確定詞匯相似性映射。
具體而言,SOM 具有以下優勢

  • 無監督學習:SOM 是一種無監督學習算法,可以在沒有標簽的情況下進行數據分析和模式識別
  • 能夠處理高維數據:SOM 能夠將高維數據映射到低維空間,從而幫助我們更好地理解和可視化高維數據
  • 數據聚類與模式識別:SOM 可以將相似的數據點映射到網格中相鄰的位置,從而實現數據的聚類。由于 SOM 保持了輸入數據的拓撲結構,相似的輸入數據會被映射到網格中相鄰的節點,這使得它在模式識別、異常檢測等任務中有著較好的表現
  • 自適應性:SOM 在訓練過程中能夠根據輸入數據的分布情況自適應地調整模型結構,能夠有效地識別出數據中的重要模式

SOM 的缺點如下:

  • 計算復雜度高:SOM 的訓練過程需要對每一個輸入數據點計算與所有神經元的距離,這使得它在大規模數據集上訓練時計算量較大,訓練時間較長,尤其是對于高維數據
  • 對初始化敏感:SOM 的性能對初始化有一定的依賴,如果初始化的權重分布不合理,可能導致訓練結果不理想
  • 容易陷入局部最優:SOM 的訓練算法具有局部更新的特性,容易陷入局部最優解,尤其是在數據特征復雜或者維度較高時,可能會導致學習過程無法收斂到最優解
  • 對噪聲敏感:SOM 對數據中的噪聲較為敏感,噪聲數據可能會導致訓練結果失真,從而影響映射效果

3. 使用自組織映射實現顏色映射

自組織映射 (Self-Organizing Map, SOM) 生成的輸入空間特征圖具有一些有趣的屬性:

  • 特征圖提供了輸入空間的良好表示,這一屬性可以用于向量量化,從而可以將一個連續的輸入空間用SOM表示為一個離散的輸出空間
  • 特征圖是拓撲有序的,即輸出網格中神經元的空間位置對應于輸入的特定特征
  • 特征圖還反映了輸入空間的統計分布;具有最多輸入樣本的區域在特征圖中占據較大的面積

SOM 的這些特性使其具有許多有趣的應用。在本節中,使用 SOM 將給定的紅 (Red, R)、綠 (Green, G) 和藍 (Blue, B) 像素值聚類到相應的顏色圖中。

(1) 首先導入所需的模塊:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import time

(2) 定義 WTU 類。__init__ 函數初始化了 SOM 的各種超參數,包括 2D 網格的維度 (m, n)、輸入特征的數量 dim、鄰域半徑 sigma、初始權重以及拓撲信息:

# Define the Winner Take All units
class WTU(object):def __init__(self, m, n, dim, num_iterations, eta = 0.5, sigma = None):self._m = mself._n = nself._neighbourhood = []self._topography = []self._num_iterations = int(num_iterations) self._learned = Falseself.dim = dimself.eta = float(eta)if sigma is None:sigma = max(m,n)/2.0    # Constant radiuselse:sigma = float(sigma)self.sigma = sigmaprint('Network created with dimensions',m,n)# Weight Matrix and the topography of neuronsself._W = tf.random.normal([m*n, dim], seed = 0)self._topography = np.array(list(self._neuron_location(m, n)))

WTU 類最重要的函數是 training() 函數,使用 Kohonen 算法找到獲勝神經元,并根據鄰域函數更新權重:

    def training(self,x, i):m = self._mn= self._n # Finding the Winner and its locationd = tf.sqrt(tf.reduce_sum(tf.pow(self._W - tf.stack([x for i in range(m*n)]),2),1))self.WTU_idx = tf.argmin(d,0)slice_start = tf.pad(tf.reshape(self.WTU_idx, [1]),np.array([[0,1]]))self.WTU_loc = tf.reshape(tf.slice(self._topography, slice_start,[1,2]), [2])# Change learning rate and radius as a function of iterationslearning_rate = 1 - i/self._num_iterations_eta_new = self.eta * learning_rate_sigma_new = self.sigma * learning_rate# Calculating Neighbourhood functiondistance_square = tf.reduce_sum(tf.pow(tf.subtract(self._topography, tf.stack([self.WTU_loc for i in range(m * n)])), 2), 1)neighbourhood_func = tf.exp(tf.negative(tf.math.divide(tf.cast(distance_square, "float32"), tf.pow(_sigma_new, 2))))# multiply learning rate with neighbourhood funceta_into_Gamma = tf.multiply(_eta_new, neighbourhood_func)# Shape it so that it can be multiplied to calculate dWweight_multiplier = tf.stack([tf.tile(tf.slice(eta_into_Gamma, np.array([i]), np.array([1])), [self.dim])for i in range(m * n)])delta_W = tf.multiply(weight_multiplier,tf.subtract(tf.stack([x for i in range(m * n)]),self._W))new_W = self._W + delta_Wself._W = new_W

fit() 函數是一個輔助函數,調用 training() 函數并存儲質心網格以便于檢索:

    def fit(self, X):for i in range(self._num_iterations):for x in X:self.training(x,i)# Store a centroid grid for easy retrievalcentroid_grid = [[] for i in range(self._m)]self._Wts = list(self._W)self._locations = list(self._topography)for i, loc in enumerate(self._locations):centroid_grid[loc[0]].append(self._Wts[i])self._centroid_grid = centroid_gridself._learned = True

然后,定義一些輔助函數用于找到獲勝神經元并生成 2D 神經元網格,以及一個將輸入向量映射到 2D 網格中相應神經元的函數:

    def winner(self, x):idx = self.WTU_idx,self.WTU_locreturn idxdef _neuron_location(self,m,n):for i in range(m):for j in range(n):yield np.array([i,j])def get_centroids(self):if not self._learned:raise ValueError("SOM not trained yet")return self._centroid_griddef map_vects(self, X):if not self._learned:raise ValueError("SOM not trained yet")to_return = []for vect in X:min_index = min([i for i in range(len(self._Wts))],key=lambda x: np.linalg.norm(vect - self._Wts[x]))to_return.append(self._locations[min_index])return to_return

(3) 定義函數 normalize() 用于對輸入數據進行歸一化:

def normalize(df):result = df.copy()for feature_name in df.columns:max_value = df[feature_name].max()min_value = df[feature_name].min()result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value)return result.astype(np.float32)

(4) 讀取數據 colors.csv,對其進行歸一化,數據包含不同顏色的紅、綠和藍通道值:

import pandas as pddf = pd.read_csv('colors.csv')  # The last column of data file is a label
data = normalize(df[['R', 'G', 'B']]).values
name = df['Color-Name'].values
n_dim = len(df.columns) - 1# Data for Training
colors = data
color_names = name

(5) 接下來,創建 SOM 并進行訓練:

t = time.time()
som = WTU(30, 30, n_dim, 400, sigma=10.0)
som.fit(colors)
s = time.time() - t
print(s)
# 3820.9206821918488

(6) fit() 函數運行時間稍長,訓練完成后,查看模型訓練結果:

# Get output grid
image_grid = som.get_centroids()# Map colours to their closest neurons
mapped = som.map_vects(colors)# Plot
plt.imshow(image_grid)
plt.title('Color Grid SOM')
for i, m in enumerate(mapped):plt.text(m[1], m[0], color_names[i], ha='center', va='center',bbox=dict(facecolor='white', alpha=0.5, lw=0))
plt.show()idx, loc = som.winner([0.5, 0.5, 0.5])
print(idx, loc)

可以在 2D 神經元網格中看到顏色映射:

請添加圖片描述

可以看到,類似顏色的獲勝神經元彼此靠近。

小結

自組織映射 (Self-Organizing Map, SOM) 是一種無監督學習算法,廣泛用于數據的降維、聚類、模式識別等任務。它通過將高維數據映射到低維的網格上,使得相似的樣本數據在網格中相鄰。

系列鏈接

TensorFlow深度學習實戰(1)——神經網絡與模型訓練過程詳解
TensorFlow深度學習實戰(2)——使用TensorFlow構建神經網絡
TensorFlow深度學習實戰(3)——深度學習中常用激活函數詳解
TensorFlow深度學習實戰(4)——正則化技術詳解
TensorFlow深度學習實戰(5)——神經網絡性能優化技術詳解
TensorFlow深度學習實戰(6)——回歸分析詳解
TensorFlow深度學習實戰(7)——分類任務詳解
TensorFlow深度學習實戰(8)——卷積神經網絡
TensorFlow深度學習實戰(9)——構建VGG模型實現圖像分類
TensorFlow深度學習實戰(10)——遷移學習詳解
TensorFlow深度學習實戰(11)——風格遷移詳解
TensorFlow深度學習實戰(12)——詞嵌入技術詳解
TensorFlow深度學習實戰(13)——神經嵌入詳解
TensorFlow深度學習實戰(14)——循環神經網絡詳解
TensorFlow深度學習實戰(15)——編碼器-解碼器架構
TensorFlow深度學習實戰(16)——注意力機制詳解
TensorFlow深度學習實戰(17)——主成分分析詳解
TensorFlow深度學習實戰(18)——K-means 聚類詳解
TensorFlow深度學習實戰(19)——受限玻爾茲曼機

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82832.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go內存泄漏排查與修復最佳實踐

一、引言 即使Go語言擁有強大的垃圾回收機制,內存泄漏仍然是我們在生產環境中經常面臨的挑戰。與傳統印象不同,垃圾回收并不是萬能的"記憶清道夫",它只能處理那些不再被引用的內存,而無法識別那些仍被引用但實際上不再…

LeetCode刷題 -- 542. 01矩陣 基于 DFS 更新優化的多源最短路徑實現

LeetCode刷題 – 542. 01矩陣 基于 DFS 更新優化的多源最短路徑實現 題目描述簡述 給定一個 m x n 的二進制矩陣 mat,其中: 每個元素為 0 或 1返回一個同樣大小的矩陣 ans,其中 ans[i][j] 表示 mat[i][j] 到最近 0 的最短曼哈頓距離 算法思…

MySQL用戶遠程訪問權限設置

mysql相關指令 一. MySQL給用戶添加遠程訪問權限1. 創建或者修改用戶權限方法一:創建用戶并授予遠程訪問權限方法二:修改現有用戶的訪問限制方法三:授予特定數據庫的特定權限 2. 修改 MySQL 配置文件3. 安全最佳實踐4. 測試遠程連接5. 撤銷權…

如何使用 BPF 分析 Linux 內存泄漏,Linux 性能調優之 BPF 分析內核態、用戶態內存泄漏

寫在前面 博文內容為 通過 BCC 工具集 memleak 進行內存泄漏分析的簡單認知包括 memleak 腳本簡單認知,內核態(內核模塊)、用戶態(Java,Python,C)內存跟蹤泄漏分析 Demo理解不足小伙伴幫忙指正 ??,生活加油知其不可奈何而安之若命,德之至也。----《莊子內篇人間世》 …

谷歌Sign Gemma: AI手語翻譯,溝通從此無界!

嘿,朋友們!想象一下,語言不再是交流的障礙,每個人都能順暢表達與理解。這聽起來是不是很酷?谷歌最新發布的Sign Gemma AI模型,正朝著這個激動人心的未來邁出了一大步!它就像一位隨身的、不知疲倦…

全生命周期的智慧城市管理

前言 全生命周期的智慧城市管理。未來,城市將在 實現從基礎設施建設、日常運營到數據管理的 全生命周期統籌。這將避免過去智慧城市建設 中出現的“碎片化”問題,實現資源的高效配 置和項目的協調發展。城市管理者將運用先進 的信息技術,如物…

最新Spring Security實戰教程(十七)企業級安全方案設計 - 多因素認證(MFA)實現

🌷 古之立大事者,不惟有超世之才,亦必有堅忍不拔之志 🎐 個人CSND主頁——Micro麥可樂的博客 🐥《Docker實操教程》專欄以最新的Centos版本為基礎進行Docker實操教程,入門到實戰 🌺《RabbitMQ》…

logstash拉取redisStream的流數據,并存儲ES

先說結論, window驗證logstash截至2025-06-06 是沒有原生支持的。 為啥考慮用redisStream呢?因為不想引入三方的kafka等組件, 讓服務部署輕量化, 所以使用現有的redis來實現, 為啥不用list呢? 已經用strea…

IEC 61347-1:2015 燈控制裝置安全通用要求詳解

IEC 61347-1:2015 燈控制裝置安全通用要求詳解 IEC 61347-1:2015《燈控制裝置 第1部分:一般要求和安全要求》是國際電工委員會(IEC)制定的關于燈控制裝置安全性能的核心基礎標準。它為各類用于啟動和穩定工作電流的燈控制裝置(如…

26、跳表

在C標準庫中,std::map 和 std::set 是使用紅黑樹作為底層數據結構的容器。 紅黑樹是一種自平衡二叉搜索樹,能夠保證插入、刪除和查找操作的時間復雜度為O(log n)。 以下是一些使用紅黑樹的C標準庫容器: std::map:一種關聯容器&a…

LabVIEW音頻測試分析

LabVIEW通過讀取指定WAV 文件,實現對音頻信號的播放、多維度測量分析功能,為音頻設備研發、聲學研究及質量檢測提供專業工具支持。 主要功能 文件讀取與播放:支持持續讀取示例數據文件夾內的 WAV 文件,可實時播放音頻以監聽被測信…

JUC并發編程(二)Monitor/自旋/輕量級/鎖膨脹/wait/notify/鎖消除

目錄 一 基礎 1 概念 2 賣票問題 3 轉賬問題 二 鎖機制與優化策略 0 Monitor 1 輕量級鎖 2 鎖膨脹 3 自旋 4 偏向鎖 5 鎖消除 6 wait /notify 7 sleep與wait的對比 8 join原理 一 基礎 1 概念 臨界區 一段代碼塊內如果存在對共享資源的多線程讀寫操作&#xf…

Doris 與 Elasticsearch:誰更適合你的數據分析需求?

一、Doris 和 Elasticsearch 的基本概念 (一)Doris 是什么? Doris 是一個用于數據分析的分布式 MPP(大規模并行處理)數據庫。它主要用于存儲和分析大量的結構化數據(比如表格數據)&#xff0c…

使用Virtual Serial Port Driver+com2tcp(tcp2com)進行兩臺電腦的串口通訊

使用Virtual Serial Port Drivercom2tcp或tcp2com進行兩臺電腦的串口通訊 問題說明解決方案方案三具體操作流程網上教程軟件安裝拓撲圖準備工作com2tcp和tcp2com操作使用串口助手進行驗證 方案三存在的問題數據錯誤通訊延時 問題說明 最近想進行串口通訊的一個測試&#xff0c…

transformer和 RNN以及他的幾個變體區別 改進

Transformer、RNN 及其變體(LSTM/GRU)是深度學習中處理序列數據的核心模型,但它們的架構設計和應用場景有顯著差異。以下從技術原理、優缺點和適用場景三個維度進行對比分析: 核心架構對比 模型核心機制并行計算能力長序列依賴處…

CSS6404L 在物聯網設備中的應用優勢:低功耗高可靠的存儲革新與競品對比

物聯網設備對存儲芯片的需求聚焦于低功耗、小尺寸、高可靠性與傳輸效率,Cascadeteq 的 CSS6404L 64Mb Quad-SPI Pseudo-SRAM 憑借差異化技術特性,在同類產品中展現顯著優勢。以下從核心特性及競品對比兩方面解析其應用價值。 一、CSS6404L 核心產品特性…

go語言map擴容

map是什么? ?在Go語言中,map是一種內置的無序key/value鍵值對的集合,可以根據key在O(1)的時間復雜度內取到value,有點類似于數組或者切片結構,可以把數組看作是一種特殊的map,數組的key為數組的下標&…

2025年SDK游戲盾實戰深度解析:防御T級攻擊與AI反作弊的終極方案

一、引言:游戲安全的“生死防線” 2025年,全球游戲行業因DDoS攻擊日均損失3.2億元,攻擊峰值突破8Tbps,且70% 的攻擊為混合型(DDoSCC)。傳統高防IP因延遲高、成本貴、協議兼容性差,已無法滿足實…

【Linux】LInux下第一個程序:進度條

前言: 在前面的文章中我們學習了LInux的基礎指令 【Linux】初見,基礎指令-CSDN博客【Linux】初見,基礎指令(續)-CSDN博客 學習了vim編輯器【Linux】vim編輯器_linux vim insert-CSDN博客 學習了gcc/g【Linux】編譯器gc…

Web前端基礎

### 一、瀏覽器 火狐瀏覽器、谷歌瀏覽器(推薦)、IE瀏覽器 推薦谷歌瀏覽器原因: 1、簡潔大方,打開速度快 2、開發者調試工具(右鍵空白處->檢查,打開調試模式) ### 二、開發工具 核心IDE工具 1. Visual Studio Code (VS Code)?…