自组织映射神经网络实战
发布时间:2022-07-30 11:41:50 所属栏目:大数据 来源:互联网
导读:1. 简介 自组织映射(SOM)是由芬兰赫尔辛基理工大学的Teuvo Kohonen在20世纪80年代提出的一种无监督机器学习算法(参考文献1)。顾名思义,映射是在没有他人指示的情况下自行组织的。这是一个受大脑神经网络活动启发而发明的模型。大脑皮层的另一个区域负责
|
1. 简介 自组织映射(SOM)是由芬兰赫尔辛基理工大学的Teuvo Kohonen在20世纪80年代提出的一种无监督机器学习算法(参考文献1)。顾名思义,映射是在没有他人指示的情况下自行组织的。这是一个受大脑神经网络活动启发而发明的模型。大脑皮层的另一个区域负责特定的活动。视觉、听觉、嗅觉和味觉等感觉输入通过突触以自组织方式映射到相应皮层区域的神经元。众所周知,输出相似的神经元是邻近的。SOM通过竞争性神经网络进行训练,这是一种类似于这些大脑机制的单层前馈神经网络。 SOM算法相对简单,但乍一看可能会有一些混乱,并且难以确定如何在实践中应用它。这可能是因为SOM可以从多个角度理解的缘故吧。它类似于用于降维和可视化的主成分分析(PCA:一种通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量的统计方法)。自组织映射也可以被视为一种处理非线性降维的流形学习。SOM还因其矢量量化特性而应用于数据挖掘领域(参考文献2)。该序列可以将高维可观察数据表示到低维潜在空间,通常在二维正方形网格上,同时保留原始输入空间的拓扑结构。但映射也可以用于投影新的数据点,并查看哪个簇属于映射。 本文将努力解释自组织映射的基本架构及其算法,并重点介绍其自组织方面。我们将使用基于Python的UCI机器学习库(参考文献3)中可用的数据集来开发一个SOM模型以解决聚类问题。然后,我们将看到映射在在线(连续)培训期间是如何自组织的。最后,我们还会评估经过训练的自组织映射,并讨论其优点和局限性。尽管SOM不是当下最流行的ML技术,在学术文献之外也不太常见;然而,并没有结论说,SOM不是解决所有问题的有效工具。训练模型相对容易,训练模型的可视化有助于向非技术类人员,例如审计师们,作出更直观有效的解释。我们将看到,该算法面临的问题通常也完全可以在其他无监督方法领域中共享。 2. 架构和学习算法设计 自组织映射的神经网络有一个输入层和一个输出层。第二层通常由m x n个神经元的二维网格组成。映射层的每个神经元与输入层的所有神经元紧密连接,具有不同的权重值。 在竞争学习中,输出层的神经元相互竞争以便被激活。比赛中获胜的神经元是唯一可以激发的神经元;因此,它被称为“赢家通吃”神经元。在自组织映射中,竞争过程是搜索与输入模式最相似的神经元;获胜者被称为最佳匹配单元(BMU)。 作为获胜标准的相似性可以通过几种方式衡量。最常用的度量指标是欧几里德距离;距离输入信号最短的神经元成为BMU。 在SOM中,学习不仅适用于获胜者,也适用于基于映射的物理上接近它的神经元。BMU享有与其邻近神经元共同学习的特权。邻域的定义由网络设计者确定,最佳接近度取决于其他超参数。如果邻域范围太小,经过训练的模型将遭受过度拟合,并且存在一些死亡神经元的风险,这些神经元永远没有机会改变。 在适应阶段,BMU及其邻近神经元调整其权重。学习的效果是使获胜神经元和相邻神经元的权重更接近输入模式。例如,如果输入信号为蓝色,BMU神经元为浅蓝色,则获胜者的蓝色略高于浅蓝色。如果邻居是黄色的,则会在当前颜色中添加一点蓝色。 概括地讲,自组织映射学习算法(在线学习)可以通过以下4个步骤来描述: 初始化 初始化映射层中神经元的权重。 竞争过程 选择一个输入样本,并使用距离度量指标在n x m网格中的所有神经元中搜索最佳匹配单元。 合作过程 通过邻域函数寻找BMU的邻近神经元。 适应过程 通过将数值向输入模式迁移来更新BMU和邻居的权重。 如果达到最大训练迭代次数,则退出;如果还没有,则将迭代计数增加1,并从2开始重复上述过程。 3. 实战演练 在本文中,我们开发的SOM将使用UCI ML存储网站上可用的银行票据认证数据集进行训练。该数据文件共包含1372行,每行有4个特征和1个标签。其中,所有4个特征都是不带null的数值;标签是二进制整数值。 首先,我们将数据随机分为训练数据和测试数据。我们使用所有4个特征和在线训练算法来训练自组织映射。然后,我们通过使用训练数据的标签可视化映射来评估经过训练的自组织映射。最后,我们可以基于训练后的映射并使用测试数据来预测标签。 通过这样的实战性演练,我们就可以证明:以无监督方式训练的自组织映射可以用于使用标记数据集的分类。 (1)导入库 复制 import numpy as np from numpy.ma.core import ceil from scipy.spatial import distance #距离计算 from sklearn.preprocessing import MinMaxScaler #标准化 from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score #评分 from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt from matplotlib import animation, colors 1. 2. 3. 4. 5. 6. 7. 8. 9. (2)导入数据集(dataset) 复制 #钞票认证数据集 # https://archive.ics.uci.edu/ml/datasets/banknote+authentication # Dua, D. and Graff, C. (2019). UCI机器学习库 [http://archive.ics.uci.edu/ml]. # 加州欧文:加利福尼亚大学信息与计算机科学学院。 data_file = "data_banknote_authentication.txt" data_x = np.loadtxt(data_file, delimiter=",", skiprows=0, usecols=range(0,4) ,dtype=np.float64) data_y = np.loadtxt(data_file, delimiter=",", skiprows=0, usecols=(4,),dtype=np.int64) 1. 2. 3. 4. 5. 6. 7. 8. 注意,这里的CSV文件需要从网站下载并存储在本地目录中。我们将使用文件中的前4列表示x,最后一列表示y。 (3)训练和测试数据分割 复制 # 训练和测试数据分割 train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2, random_state=42) print(train_x.shape, train_y.shape, test_x.shape, test_y.shape) #形状检查 1. 2. 3. 数据按0.8:0.2进行分割,以方便进行训练和测试。因此,我们会看到,分别有1097个和275个观测值。 (4)编写帮助函数 复制 # 帮助函数 # 数据归一化 def minmax_scaler(data): scaler = MinMaxScaler() scaled = scaler.fit_transform(data) return scaled # 欧几里德距离 def e_distance(x,y): return distance.euclidean(x,y) #曼哈顿距离 def m_distance(x,y): return distance.cityblock(x,y) # 最佳匹配单元搜索 def winning_neuron(data, t, som, num_rows, num_cols): winner = [0,0] shortest_distance = np.sqrt(data.shape[1]) #用最大距离初始化 input_data = data[t] for row in range(num_rows): for col in range(num_cols): distance = e_distance(som[row][col], data[t]) if distance < shortest_distance: shortest_distance = distance winner = [row,col] return winner (编辑:呼伦贝尔站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
