繁体   English   中英

如何将新数据映射/绘制到训练有素的SOM映射上?

[英]How to map/plot new data onto a trained SOM map?

训练了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]])

我认为要注意的一件事是,您不应使用其内部的值来扩展测试数据。 您应该使用火车数据的缩放参数来缩放测试数据。 因为模型是使用火车数据中的信息进行训练的。 尚未看到测试数据。

因此,按比例缩放的测试数据将如下所示:

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) 
  )
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM