译者|朱宪忠审稿人|SunShujuan自组织图进化迭代示意图gif动画一、简介自组织图(SOM)是芬兰赫尔辛基理工大学的TeuvoKohonen开发的一种无监督机器学习算法,于1980年代提出(参考文献1).顾名思义,地图无需其他人的指导即可自行组织。这是一种受大脑神经网络活动启发而发明的模型。大脑皮层的另一个区域负责特定的活动。视觉、听觉、嗅觉和味觉等感觉输入通过突触以自组织方式映射到相应皮层区域的神经元。众所周知,具有相似输出的神经元是邻居。SOM是用竞争性神经网络训练的,这是一种类似于这些大脑机制的单层前馈神经网络。SOM算法相对简单,但乍一看可能会造成混淆,并且很难确定如何在实践中应用它。这可能是因为可以从多个角度理解SOM。它类似于主成分分析(PCA:一种统计方法,通过正交变换将一组潜在相关的变量转换为一组线性不相关的变量)进行降维和可视化。自组织映射也可以看作是一种处理非线性降维的流形学习。由于SOM的矢量量化特性(参考文献2),SOM也用于数据挖掘。该序列可以将高维可观察数据表示为低维潜在空间,通常在二维方形网格上,同时保留原始输入空间的拓扑结构。但是地图也可以用来投射新的数据点,看看哪些集群属于地图。本文将努力解释自组织映射的基本架构及其算法,重点关注其自组织方面。我们将使用基于Python的UCI机器学习库(参考文献3)中可用的数据集来开发SOM模型来解决聚类问题。然后我们将看到地图在在线(连续)训练期间如何自组织。最后,我们评估训练有素的自组织映射并讨论它们的优点和局限性。尽管SOM不是当今最流行的ML技术,在学术文献之外也不常见;但是,它并没有得出SOM不是解决所有问题的有效工具的结论。训练模型相对简单,训练模型的可视化有助于对审计人员等非技术人员进行更直观有效的解释。正如我们将看到的,该算法面临的问题通常在无监督方法的其他领域也很常见。2.体系结构和学习算法设计自组织映射神经网络有一个输入层和一个输出层。第二层通常由mxn神经元的二维网格组成。映射层的每个神经元都以不同的权重值与输入层的所有神经元紧密相连。在竞争性学习中,输出层的神经元相互竞争被激活。赢得比赛的神经元是唯一一个被激活的神经元;因此,它被称为“赢者通吃”的神经元。在自组织映射中,竞争过程是寻找与输入模式最相似的神经元;获胜者称为最佳匹配单元(BMU)。作为获胜标准的相似性可以通过多种方式来衡量。最常用的度量是欧氏距离;与输入信号距离最短的神经元成为BMU。在SOM中,学习不仅针对获胜者,还根据映射针对物理上靠近它的神经元进行学习。BMU享有与邻近神经元共同学习的特权。邻域的定义由网络设计者决定,最佳邻近度取决于其他超参数。如果邻域大小太小,经过训练的模型将遭受过度拟合,并且存在一些死神经元永远没有机会改变的风险。在适应阶段,BMU及其邻近的神经元调整它们的权重。学习的效果是使获胜神经元和相邻神经元的权重更接近输入模式。例如输入信号为蓝色,BMU神经元为浅蓝色,则胜者的蓝色略高于浅蓝色。如果邻居是黄色的,则在当前颜色中添加一点蓝色。简而言之,自组织地图学习算法(在线学习)可以描述为以下4个步骤:初始化初始地图层中神经元的权重。竞争过程选择一个输入样本并使用距离度量在nxm网格中的所有神经元中搜索最佳匹配单元。协作过程通过邻域函数找到BMU的相邻神经元。适应过程通过向输入模式迁移值来更新BMU和邻居的权重。如果达到最大训练迭代次数则退出;如果不是,则将迭代计数增加1,并从2开始重复上述过程。3.实战练习在本文中,我们开发的SOM将使用UCIMLStorage网站上提供的钞票验证数据集进行训练。数据文件总共包含1372行,每行有4个特征和1个标签。其中所有4个特征都是没有空值的数值;标签是二进制整数值。首先,我们将数据随机分成训练数据和测试数据。我们使用所有4个特征和在线训练算法来训练自组织映射。然后,我们通过使用训练数据的标签可视化地图来评估经过训练的自组织地图。最后,我们可以使用测试数据根据训练好的地图预测标签。通过这样的实践练习,我们可以证明以无监督方式训练的自组织图可以用于使用标记数据集进行分类。(1)导入库importnumpyasnpfromnumpy.ma.coreimportceilfromscipy.spatialimportdistance#Distancecalculationfromsklearn.preprocessingimportMinMaxScaler#Standardizationfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score#immetricskport.immetricskfromconfusion_matriximportmatplotlib.pyplotaspltfrommatplotlibimportanimation,colors(2)导入数据集(dataset)#领印证划Dataset#https://archive.ics.uci.edu/ml/datasets/banknote+authentication#Dua,D.andGraff,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)注意这里的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)#形状检查数据按0.8:0.2划分,方便训练和测试。因此,我们将看到分别有1097和275个观测值。(4)编写辅助函数#辅助函数#数据归一化defminmax_scaler(data):scaler=MinMaxScaler()scaled=scaler.fit_transform(data)returnscaled#Euclideandistancedefe_distance(x,y):returndistance.euclidean(x,y)#曼哈顿距离defm_distance(x,y):returndistance.cityblock(x,y)#最佳匹配单元搜索defwinning_neuron(data,t,som,num_rows,num_cols):winner=[0,0]shortest_distance=np.sqrt(data.shape[1])#用最大距离初始化input_data=data[t]forrowinrange(num_rows):forcolinrange(num_cols):distance=e_distance(som[row][col],data[t])ifdistance
