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(WijXi)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)=e2σ2d2
其中, σ \sigma σ 是神经元影响范围的时间依赖半径, d d d 是它与获胜神经元的距离,函数图像如下所示。

函数图像

邻域函数的另一个重要特性是其半径会随着时间减少。因此,在开始时,许多邻近神经元的权重会修改,但随着网络的学习,最终只有少数神经元的权重(有时是一个或没有)在学习过程中修改。
权重的变化根据以下方程:
d W = η ∧ ( X − W ) dW=\eta \wedge(X-W) dW=η(XW)
对所有输入重复迭代以上过程。随着迭代的进行,根据迭代次数逐渐降低学习率和半径。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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)‌…