训练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]])
答案 0 :(得分:0)
我认为需要注意的一件事是,您不应使用其内部的值来扩展测试数据。 您应该使用火车数据的缩放参数来缩放测试数据。 因为模型是使用火车数据中的信息进行训练的。它没有看到测试数据。
因此,按比例缩放的测试数据将如下所示:
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)
)
}