2014-09-22 68 views
5

我正在閱讀關於R-bloggers的這篇博客文章,我對代碼的最後部分感到困惑,無法弄清楚。在R中繪製Kohonen地圖的錯誤?

http://www.r-bloggers.com/self-organising-maps-for-customer-segmentation-using-r/

我試圖用我自己的數據來重新創建。我有5個變量遵循2755點的指數分佈。

我很好,可以繪製它生成的地圖:

plot(som_model, type="codes") 

enter image description here

的代碼我不明白的部分是:

var <- 1 
var_unscaled <- aggregate(as.numeric(training[,var]),by=list(som_model$unit.classif),FUN = mean, simplify=TRUE)[,2] 
plot(som_model, type = "property", property=var_unscaled, main = names(training)[var], palette.name=coolBlueHotRed) 

由於我明白了,代碼的這一部分假設要繪製地圖上的一個變量來查看它的外觀,但這是我遇到問題的地方。當我運行代碼的這一部分,我得到警告:

Warning message: 
In bgcolors[!is.na(showcolors)] <- bgcol[showcolors[!is.na(showcolors)]] : 
number of items to replace is not a multiple of replacement length 

和它產生的情節:

enter image description here

這只是一些怎麼不看的權利...

現在我認爲它已經歸結爲聚合函數重新排序數據的方式。 var_unscaled的長度是789,som_model $ data,training [,var]和unit.classif的長度都是2755.我嘗試繪製聚合數據,結果沒有任何警告,而是一個無法理解的圖形(如預期的那樣)。

現在我認爲它做到了這一點,因爲unit.classif裏面有很多重複的數字,這就是爲什麼它的大小減小了。

問題是,我擔心警告嗎?它是否產生了一個精確的圖表? 「屬性」的部分究竟是在繪圖命令中尋找的部分?有什麼不同的方式可以「彙總」數據?

+0

如果情節如不正確則是,擔心警告。實際上,你應該始終關注你爲什麼會收到警告。我還沒有完全檢查出來,但是我發現你在'aggregate'結尾有一個子集。這是必要的嗎? – 2014-09-22 01:19:08

+2

您應該提供[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),以便我們可以運行與您相同的代碼並獲得同樣的錯誤。否則,我們實際上無法知道您的數據如何存儲在每個對象中,或者它們應該如何在plot語句中組合。 – MrFlick 2014-09-22 03:00:14

+0

調色板'coolBlueHotRed'從哪裏來,它的長度是多少?它可能被配置爲匹配示例數據,而不是您的數據。 – 2014-09-22 11:37:18

回答

0

我認爲,並非所有的地圖上的細胞有內點。 你有30乘30地圖和約2700點。平均每個細胞約3點。很有可能一些細胞有3個以上的點,有些細胞是空的。

當R-bloggers中的代碼在所有單元格都有內部點時運行良好。

爲了讓您的數據工作,嘗試改變這一部分:

var <- 1 
var_unscaled <- aggregate(as.numeric(training[, var]), by = list(som_model$unit.classif), FUN = mean, simplify = TRUE)[, 2] 
plot(som_model, type = "property", property = var_unscaled, main = names(training)[var], palette.name = coolBlueHotRed) 

這一個:

var <- 1 
var_unscaled <- aggregate(as.numeric(data.temp[, data.classes][, var]), 
          by = list(som_model$unit.classif), 
          FUN = mean, 
          simplify = T) 
v_u <- rep(0, max(var_unscaled$Group.1)) 
v_u[var_unscaled$Group.1] <- var_unscaled$x 
plot(som_model, 
    type = "property", 
    property = v_u, 
    main = colnames(data.temp[, data.classes])[var], 
    palette.name = coolBlueHotRed) 

希望它能幫助。

0

只需添加這些功能給你的腳本:

coolBlueHotRed <- function(n, alpha = 1) {rainbow(n, end=4/6, alpha=alpha)[n:1]} 

pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2")