【问题标题】:Kohonen Self Organizing Maps: Determining the number of neurons and grid sizeKohonen 自组织图:确定神经元数量和网格大小
【发布时间】:2013-10-03 15:31:31
【问题描述】:

我有一个大型数据集,我正在尝试使用 SOM 进行聚类分析。数据集是 HUGE(约数十亿条记录),我不确定神经元的数量和 SOM 网格的大小应该是多少。任何关于估计神经元数量和网格大小的材料的指针将不胜感激。

谢谢!

【问题讨论】:

    标签: machine-learning neural-network self-organizing-maps


    【解决方案1】:

    我编写了一个函数,它以数据集作为输入,返回网格大小。我将它从 Matlab 的自组织地图工具箱的 som_topol_struct() 函数重写为 R 函数。

    topology=function(data)
    {
      #Determina, para lattice hexagonal, el número de neuronas (munits) y su disposición (msize)
      D=data
      # munits: número de hexágonos
      # dlen: número de sujetos
      dlen=dim(data)[1]
      dim=dim(data)[2]
      munits=ceiling(5*dlen^0.5) # Formula Heurística matlab
      #munits=100
      #size=c(round(sqrt(munits)),round(munits/(round(sqrt(munits)))))
      A=matrix(Inf,nrow=dim,ncol=dim)
      for (i in 1:dim)
      {
        D[,i]=D[,i]-mean(D[is.finite(D[,i]),i])
      }
    
      for (i in 1:dim){
        for (j in i:dim){
          c=D[,i]*D[,j]
          c=c[is.finite(c)];
          A[i,j]=sum(c)/length(c)
          A[j,i]=A[i,j]
        }
      }
    
      VS=eigen(A)
      eigval=sort(VS$values)
    
      if (eigval[length(eigval)]==0 | eigval[length(eigval)-1]*munits<eigval[length(eigval)]){
        ratio=1
      }else{
        ratio=sqrt(eigval[length(eigval)]/eigval[length(eigval)-1])}
    
      size1=min(munits,round(sqrt(munits/ratio*sqrt(0.75))))
      size2=round(munits/size1)
    
      return(list(munits=munits,msize=sort(c(size1,size2),decreasing=TRUE))) 
    }
    

    希望对你有帮助……

    伊万·瓦莱斯-佩雷斯

    【讨论】:

      【解决方案2】:

      引用 som 工具箱的som_make function documentation

      它使用启发式公式“munits = 5*dlen^0.54321”。这 “mapsize”参数影响地图单元的最终数量:“大” 地图具有 x4 的默认地图单位数量,并且“小”地图具有 x0.25 默认地图单位数。

      dlen 是数据集中的记录数

      您还可以阅读解决大型数据集问题的经典 WEBSOM http://www.cs.indiana.edu/~bmarkine/oral/self-organization-of-a.pdf http://websom.hut.fi/websom/doc/ps/Lagus04Infosci.pdf

      请记住,地图大小也是一个特定于应用程序的参数。也就是说,这取决于您要对生成的集群做什么。大地图产生大量小但“紧凑”的集群(分配给每个集群的记录非常相似)。小地图产生更少但更通用的集群。不存在“正确数量的集群”,尤其是在现实世界的数据集中。这完全取决于您要检查数据集的细节。

      【讨论】:

      • 感谢您的回复!我已经通过了WEBSOM。那很有帮助。我想我会更多地阅读有关不断增长的 SOM 的内容,看看情况如何。
      • 关于大地图/特定集群和小地图/广义集群之间的权衡的好评论。
      【解决方案3】:

      我没有它的参考资料,但我建议您从数据集中每个预期类别使用大约 10 个 SOM 神经元开始。例如,如果您认为您的数据集由 8 个独立的组件组成,请使用 9x9 神经元的地图。不过,这完全只是一个试探法。

      如果您希望数据更直接地驱动 SOM 的拓扑,请尝试在训练期间更改拓扑的 SOM 变体之一:

      不幸的是,这些算法比普通 SOM 涉及更多的参数调整,但它们可能适用于您的应用程序。

      【讨论】:

      • 感谢您指出越来越多的 SOM 和神经毒气主题。我认为增长 SOM 是我所关注的(增长 SOM 的算法可能是神经气体或任何其他算法。我遇到了一个 paper,关于增长 SOM 并使用遗传算法控制增长)
      【解决方案4】:

      Kohenon 在他的书"MATLAB Implementations and Applications of the Self-Organizing Map" 中写了关于为 SOM 选择参数和映射大小的问题。在某些情况下,他建议可以在测试几种尺寸的 SOM 后得出初始值,以检查集群结构是否具有足够的分辨率和统计准确性。

      【讨论】:

        【解决方案5】:

        我的建议如下

        1. SOM 与对应分析密切相关。在统计学中,他们使用 5*r^2 作为经验法则,其中 r 是正方形设置中的行数/列数
        2. 通常,应该使用一些基于数据本身的标准,这意味着您需要一些标准来估计同质性。如果违反某个阈值,您将需要更多节点。为了检查同质性,每个节点都需要一些记录。 Agai,从统计数据中您可以了解到,对于简单测试(少量变量),您需要大约 20 条记录,对于某些变量的更高级测试,至少需要 8 条记录。
        3. 请记住,SOM 代表一个预测模型。所以验证是关键,绝对是强制性的。然而,预测模型的验证(参见 Wiki 中的 typeI/II 错误条目)本身就是一个主题。可接受的风险以及风险结构也完全取决于您的目的。
        4. 您可以通过越来越多地减小模型的大小来测试模型的错误率动态。然后取误差可接受的最小的一个。
        5. 允许空节点是 SOM 的一项优势。然而,它们不应该太多。让我说,不到 5%。

        综合起来,根据经验,我建议以下标准至少有 8..10 条记录的绝对数量,但这些记录不应超过所有集群的 5%。 那些 5% 规则当然是一种启发式方法,但是可以通过统计测试中置信水平的一般用法来证明这一点。您可以选择从 1% 到 5% 的任何百分比。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-06
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-08
          • 2021-01-07
          • 2013-07-01
          相关资源
          最近更新 更多