我有一个大型数据集,我正在尝试使用 SOM 进行聚类分析。数据集是巨大的(约数十亿条记录),我不确定神经元的数量和 SOM 网格大小应该从什么开始。任何关于估计神经元数量和网格大小的材料的指针将不胜感激。
谢谢!
我有一个大型数据集,我正在尝试使用 SOM 进行聚类分析。数据集是巨大的(约数十亿条记录),我不确定神经元的数量和 SOM 网格大小应该从什么开始。任何关于估计神经元数量和网格大小的材料的指针将不胜感激。
谢谢!
引用som 工具箱的som_make 函数文档
它使用“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
请记住,地图大小也是一个特定于应用程序的参数。也就是说,这取决于您要对生成的集群做什么。大地图产生大量小但“紧凑”的集群(分配给每个集群的记录非常相似)。小地图产生更少但更通用的集群。不存在“正确数量的集群”,尤其是在现实世界的数据集中。这完全取决于您要检查数据集的细节。
我编写了一个函数,它以数据集作为输入,返回网格大小。我将它从 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)))
}
希望能帮助到你...
伊万·瓦莱斯-佩雷斯
Kohenon 在他的《自组织映射的 MATLAB 实现和应用》一书中就为 SOM 选择参数和映射大小的问题撰写了文章。在某些情况下,他建议可以在测试几种 SOM 大小后得出初始值,以检查集群结构是否具有足够的分辨率和统计准确性。
我的建议如下
综上所述,根据经验,我建议以下标准至少为 8..10 条记录的绝对数量,但这些记录不应超过所有集群的 5%。那些 5% 规则当然是一种启发式方法,但是可以通过统计测试中置信水平的一般用法来证明这一点。您可以选择从 1% 到 5% 的任何百分比。