Kohonen自组织映射:确定神经元的数量和网格大小

时间:2013-10-03 15:31:32

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

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

谢谢!

5 个答案:

答案 0 :(得分:6)

从som工具箱的som_make function documentation引用

  

它使用启发式公式'munits = 5 * dlen ^ 0.54321'。该   'mapsize'参数会影响地图单元的最终数量:'大'   map有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

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

答案 1 :(得分:2)

我没有它的参考,但我建议首先在数据集中每个预期的类使用大约10个SOM神经元。例如,如果您认为您的数据集由8个独立的组件组成,请选择具有9x9神经元的地图。这完全只是一个球场启发式。

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

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

答案 2 :(得分:2)

我编写了一个函数,以数据集作为输入,返回网格大小。我将它从Matlab的Self Organizing Maps Toolbox的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))) 
}
希望它有所帮助...

IvánVallés-Pérez

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我的建议如下:

  1. SOM与对应分析有很大关系。在统计中,他们使用5 * r ^ 2作为经验法则,其中r是方形设置中的行数/列数
  2. 通常,应该使用一些基于数据本身的标准,这意味着您需要一些标准来估计同质性。如果违反某个阈值,则需要更多节点。为了检查同质性,每个节点需要一些记录。 Agai,根据统计数据,您可以了解到,对于简单测试(少量变量),您需要大约20条记录,对某些变量进行更高级的测试,至少8条记录。
  3. 请记住,SOM代表一种预测模型。因此验证是关键,绝对是强制性的。然而,预测模型的验证(参见Wiki中的typeI / II错误输入)本身就是一个主题。可接受的风险以及风险结构也完全取决于您的目的。
  4. 您可以通过越来越多地缩小模型的大小来测试模型错误率的动态。然后采用可接受错误的最小的一个。
  5. 允许空节点是SOM的强项。然而,它们应该不会太多。让我说,不到5%。
  6. 总而言之,根据经验,我建议以下标准至少为绝对数量的8..10记录,但这些记录不应超过所有集群的5%。 那些5%的规则当然是一种启发式方法,然而这可以通过统计测试中置信水平的一般用法来证明。您可以选择1%到5%之间的任何百分比。