簡體   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