zoukankan      html  css  js  c++  java
  • SOM聚类算法

    1. 算法简介

    SOM神经网络[11]是由芬兰神经网络专家Kohonen教授提出的,该算法假设在输入对象中存在一些拓扑结构或顺序,可以实现从输入空间(n维)到输出平面(2维)的降维映射,其映射具有拓扑特征保持性质,与实际的大脑处理有很强的理论联系。自组织映射神经网络, 即Self Organizing Maps (SOM), 可以对数据进行无监督学习聚类。它的思想很简单,本质上是一种只有输入层--隐藏层的神经网络。隐藏层中的一个节点代表一个需要聚成的类。训练时采用“竞争学习”的方式,每个输入的样例在隐藏层中找到一个和它最匹配的节点,称为它的激活节点,也叫“winning neuron”。 紧接着用随机梯度下降法更新激活节点的参数。同时,和激活节点临近的点也根据它们距离激活节点的远近而适当地更新参数。

      SOM的一个特点是,隐藏层的节点是有拓扑关系的。这个拓扑关系需要我们确定,如果想要一维的模型,那么隐藏节点依次连成一条线;如果想要二维的拓扑关系,那么就行成一个平面,如下图所示(也叫Kohonen Network):

      SOM网络包含输入层和输出层。输入层对应一个高维的输入向量,输出层由一系列组织在2维网格上的有序节点构成,输入节点与输出节点通过权重向量连接。学习过程中,找到与之距离最短的输出层单元,即获胜单元,对其更新。同时,将邻近区域的权值更新,使输出节点保持输入向量的拓扑特征。

      既然隐藏层是有拓扑关系的,所以我们也可以说,SOM可以把任意维度的输入离散化到一维或者二维(更高维度的不常见)的离散空间上。 Computation layer里面的节点与Input layer的节点是全连接的。

    拓扑关系确定后,开始计算过程,大体分成几个部分:

        (1)初始化:每个节点随机初始化自己的参数。每个节点的参数个数与Input的维度相同。

        (2)对于每一个输入数据,找到与它最相配的节点。假设输入时D维的, 即 X={x_i, i=1,...,D},那么判别函数可以为欧几里得距离:

        (3)找到激活节点I(x)之后,我们也希望更新和它临近的节点。令S_ij表示节点i和j之间的距离,对于I(x)临近的节点,分配给它们一个更新权重(简单地说,临近的节点根据距离的远近,更新程度要打折扣):

         (4)接着就是更新节点的参数了。按照梯度下降法更新(循环迭代,直到收敛);

    2. 算法流程:

      (1) 网络初始化,对输出层每个节点权重赋初值;

      (2) 将输入样本中随机选取输入向量,找到与输入向量距离最小的权重向量;

      (3) 定义获胜单元,在获胜单元的邻近区域调整权重使其向输入向量靠拢;

      (4) 提供新样本、进行训练;

      (5) 收缩邻域半径、减小学习率、重复,直到小于允许值,输出聚类结果。

    与K-Means的比较

    同样是无监督的聚类方法,SOM与K-Means有什么不同呢?

    (1)K-Means需要事先定下类的个数,也就是K的值。 SOM则不用,隐藏层中的某些节点可以没有任何输入数据属于它。所以,K-Means受初始化的影响要比较大。

    (2)K-means为每个输入数据找到一个最相似的类后,只更新这个类的参数。SOM则会更新临近的节点。所以K-mean受noise data的影响比较大,SOM的准确性可能会比k-means低(因为也更新了临近节点)。

    (3) SOM的可视化比较好。优雅的拓扑关系图 。

    参考文献:https://www.cnblogs.com/sylvanas2012/p/5117056.html

  • 相关阅读:
    python3 类方法的约束
    python3 最简单的网络编程udp(socket数据包datagram)
    python3 最简单的网络编程tcp(socket数据流)
    python3 初识面向对象
    python3 包的导入和使用
    python3 模块的导入和使用
    python3 logging模块
    python 逻辑运算
    python3 datetime模块
    python 面试题
  • 原文地址:https://www.cnblogs.com/carreyBlog/p/11984336.html
Copyright © 2011-2022 走看看