R 如何将新数据映射/绘制到经过培训的SOM图上?

R 如何将新数据映射/绘制到经过培训的SOM图上?,r,neural-network,cluster-analysis,som,self-organizing-maps,R,Neural Network,Cluster Analysis,Som,Self Organizing Maps,培训SOM后,如何将新数据绘制到SOM上,并可视化它如何映射到SOM上?理想情况下,我希望它被绘制相应的分类颜色和节点位置identify()具有根据SOM映射上的选择精确定位数据的功能,但它非常有限,一次只能定位一个数据。我想映射一个完整的(新的)数据集并将其可视化。我可以通过使用map()和组关联获取节点位置,但是如何在SOM上手动绘制新点?在internet或kohonen R文档中找不到任何相关内容。谢谢你的帮助 library(kohonen) data(wines) wines.tr

培训SOM后,如何将新数据绘制到SOM上,并可视化它如何映射到SOM上?理想情况下,我希望它被绘制相应的分类颜色和节点位置
identify()
具有根据SOM映射上的选择精确定位数据的功能,但它非常有限,一次只能定位一个数据。我想映射一个完整的(新的)数据集并将其可视化。我可以通过使用
map()
和组关联获取节点位置,但是如何在SOM上手动绘制新点?在internet或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

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

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

因此,您的缩放测试数据如下所示:

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

它是kohonen软件包的一部分。它与iris数据集一样是一个公开可用的数据集。只要在加载kohonen包后运行
库(kohonen)
数据(wines)
。我忘了把这行代码放进去。抱歉。感谢您的澄清。运气好吗?不难找到每个新点都指向哪个群集。然而,我不明白这些点在集群中的位置。是的,我在同一条船上。
wines.test.scale <- scale(wines.test, center = attr(wines.sc, 'scaled:center'), scale = attr(wines.sc, 'scaled:scale'))
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) 
  )
}