r-如何将新数据映射/绘制到经过训练的SOM映射上



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

最新更新