[英]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.