【问题标题】:How to map/plot new data onto a trained SOM map?如何将新数据映射/绘制到训练有素的 SOM 地图上?
【发布时间】:2018-12-24 13:08:10
【问题描述】:

训练 SOM 后,如何将新数据绘制到 SOM 上并可视化它如何映射到 SOM?理想情况下,我希望用相应的分类颜色和节点位置来绘制它。 identify() 能够根据 SOM 地图上的选择来精确定位数据,但它非常有限,一次只能做一个。我想映射整个(新)数据集并将其可视化。我可以使用map() 和组关联获取节点位置,但如何手动将新点绘制到 SOM 上?在互联网或 kohonen R 文档上找不到任何相关内容。感谢任何帮助。

library(kohonen)
data(wines)
wines.train<-wines[1:150,]
wines.test<-wines[151:nrow(wines),]
wines.sc <- scale(wines.train)

set.seed(7)
wines.som<-som(wines.sc, grid = somgrid(5, 4, "hexagonal"),rlen=150,alpha=c(0.05,0.01))
wines.hc<-cutree(hclust(dist(wines.som$codes[[1]])),6) 
plot(wines.som,type="mapping",bgcol=rainbow(6)[wines.hc])
add.cluster.boundaries(wines.som,wines.hc)

可用于手动检查 SOM 上的特定节点

identify(wines.som$grid$pts,labels=as.vector(wines.hc),plot=T,pos=T) 

将新数据映射到经过训练的 SOM

wines.map<-map(wines.som,scale(wines.test))
wines.test.grp<-sapply(wines.map$unit.classif,function(x) wines.hc[[x]])

【问题讨论】:

  • 它是 kohonen 包的一部分。它是一个像 iris 数据集一样的公开数据集。只要您在加载 kohonen 包后运行library(kohonen)data(wines)。我忘了把这行代码放进去。抱歉。
  • 感谢您的澄清。
  • 运气好吗?
  • 不难发现每个新点都在哪个簇。但是,我不明白点在集群中的位置。
  • 是的,我在同一条船上。

标签: r neural-network cluster-analysis som self-organizing-maps


【解决方案1】:

在我看来,需要注意的一件事是,您不应使用其中的值来缩放测试数据。 您应该使用训练数据的缩放参数来缩放测试数据。 因为模型是使用来自训练数据的信息进行训练的。它还没有看到测试数据。

所以你的缩放测试数据会是这样的:

wines.test.scale <- scale(wines.test, center = attr(wines.sc, 'scaled:center'), scale = attr(wines.sc, 'scaled:scale'))

现在您可以为模型分配新成员。这是每个数据到每个模型节点的距离测量。 因为您将数据拆分为训练和测试,所以可以在模型中添加两​​个新成员,即训练距离和测试距离。 我给它们命名为train.map和test.map,因为这个过程可以看作是输入数据到模型映射的映射过程。

wines.som$train.map <- apply(
  wines.sc, 1, function(input1) {
    apply(
      wines.som$codes[[1]], 1, function(input2) dist(rbind(input1, input2))
    )
  }
)

wines.som$test.map <- apply(
  wines.test.scale, 1, function(input1) {
    apply(
      wines.som$codes[[1]], 1, function(input2) dist(rbind(input1, input2))
    )
  }
)

我认为必须将变量放入模型中,因为一旦内核附加了库,它就会用包的基本绘图函数覆盖基础绘图函数,直到分离包。 新的绘图函数必须识别正在处理的变量具有适当的类。

现在您可以将个人输入数据映射到模型的网络。您可以在这里放置两个阶段:训练数据映射和测试数据映射。

par(mfrow = c(5,5))
for (a in 1:ncol(wines.som$train.map)) {
  plot(
    wines.som, type = 'property', property = wines.som$train.map[,a],
    main = paste('train',a) 
  )
}

par(mfrow = c(5,5))
for (a in 1:ncol(wines.som$test.map)) {
  plot(
    wines.som, type = 'property', property = wines.som$test.map[,a],
    main = paste('test',a) 
  )
}

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2018-05-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多