python如何实现SOM算法

  介绍

这篇文章将为大家详细讲解有关python如何实现SOM算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>算法简介

SOM网络是一种竞争学习型的无监督神经网络,将高维空间中相似的样本点映射到网络输出层中的邻近神经元。

训练过程简述:在接收到训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元,然后最佳匹配单元及其邻近的神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小。这个过程不断迭代,直至收敛。

<李>

网络结构:输入层和输出层(或竞争层),如下图所示。

<李>

输入层:假设一个输入样本为X=(x1, x2, x3,…, xn),是一个n维向量,则输入层神经元个数为n个。

<李>

输出层(竞争层):通常输出层的神经元以矩阵方式排列在二维空间中,每个神经元都有一个权值向量。

<李>

假设输出层有m个神经元,则有m个权值向量,Wi=[wi1、wi2 ....,赢得],1 & lt;=i<=m。

 python如何实现SOM算法

算法流程:

1。初始化:权值使用较小的随机值进行初始化,并对输入向量和权值做归一化处理
,,,,,,,,,x # 39;X=X/| | | |
,,,,,,,,,ω& # 39;i=ωi/| |ωi | |, 1 & lt;=i<=m
,,,,,,,,,| | X | |和| |ωi | |分别为输入的样本向量和权值向量的欧几里得范数。

2。将样本输入网络:样本与权值向量做点积、点积值最大的输出神经元赢得竞争,
(或者计算样本与权值向量的欧几里得距离,距离最小的神经元赢得竞争)记为获胜神经元。

3。更新权值:对获胜的神经元拓扑邻域内的神经元进行更新,并对学习后的权值重新归一化。
,,,,,,,ω(t + 1)=ω(t) +η的(t, n) * (x-ω(t)
,,,,,,,η的(t, n):η为学习率是关于训练时间t和与获胜神经元的拓扑距离n的函数。
,,,,,,,η的(t, n)=ηe (t) ^ (- n)
,,,,,,,η(t)的几种函数图像如下图所示。

4。更新学习速率η及拓扑邻域N, N随时间增大距离变小,如下图所示。

5。判断是否收敛。如果学习率η<=ηmin或达到预设的迭代次数,结束算法。

 python如何实现SOM算法”> <img src=

python代码实现SOM

import  numpy  as  np   import  pylab  as  pl      class  SOM(对象):   def 才能;__init__(自我,,X,,输出,迭代,,batch_size):   ,,,,,,   ,,,:param  X:,形状是N * D,输入样本有N个,每个D维   ,,,:param 输出:,(n, m)一个元组,为输出层的形状是一个n * m的二维矩阵   ,,,:param 迭代:迭代次数   ,,,:param  batch_size:每次迭代时的样本数量   ,,,初始化一个权值矩阵,形状为D * (n * m),即有n * m权值向量,每个D维   ,,,,,,   ,,,self.X =, X   ,,,self.output =,输出   ,,,self.iteration =,迭代   ,,,self.batch_size =batch_size   ,,,self.W =, np.random.rand (X.shape[1],[0]输出,*,输出[1])   ,,,print  (self.W.shape)      def 才能GetN(自我,,t):   ,,,,,,   ,,,:param  t:时间t,这里用迭代次数来表示时间   ,,,::返回,返回一个整数,表示拓扑距离,时间越大,拓扑邻域越小   ,,,,,,   ,,,a =, min (self.output)   ,,,return  int(一个浮点数(a) * t/self.iteration)      def 才能;Geteta(自我,,t,, n):   ,,,,,,   ,,,:param  t:,时间t,这里用迭代次数来表示时间   ,,,:param  n:,拓扑距离   ,,,::返回,返回学习率,   ,,,,,,   ,,,return  np.power (np.e, - n)/(t + 2)      def 才能;updata_W(自我,,X,, t,赢家):   ,,,N =, self.GetN (t)   ,,,for  x,,小姐:拷贝列举(冠军):   ,,,,,to_update =, self.getneighbor(我[0],,N)   ,,,,,for  j 拷贝范围(N + 1):   ,,,,,,,e =, self.Geteta (t), j)   ,,,,,,,for  w 拷贝to_update [j]:   ,,,,,,,,,self.W (:,, w),=, np.add (self.W (: w), e * (X (X):),安康;self.W [: w]))      def 才能;getneighbor(自我,,指数,N):   ,,,,,,   ,,,:param 指数:获胜神经元的下标   ,,,:param  N:,邻域半径   ,,,:return 答:,返回一个集合列表,分别是不同邻域半径内需要更新的神经元坐标   ,,,,,,   ,,,,,b =self.output   ,,,length  a * b=,   ,,,def 距(index1, index2):   ,,,,,,,i1_a i1_b =, index1 //,,, index1  %, b   ,,,,,,,i2_a i2_b =, index2 //,,, index2  %, b   ,,,,,return  np.abs (i1_a 作用;i2_a), np.abs (i1_b 作用;i2_b)      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

python如何实现SOM算法