错误在R中绘制Kohonen地图?

时间:2014-09-22 00:17:31

标签: r plot som

我正在阅读关于R-bloggers的博客文章,我对代码的最后一部分感到困惑,无法弄清楚。

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里面有很多重复的数字,这就是它减小尺寸的原因。

问题是,我是否担心警告?它是否产生了准确的图表?在plot命令中寻找的&#34; Property&#34;部分究竟是什么?有没有不同的方式可以&#34;聚合&#34;数据?

3 个答案:

答案 0 :(得分:9)

我认为您必须创建调色板颜色。如果你把论点

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

然后尝试获取一个情节,例如

plot(som_model, type = "count", palette.name = coolBlueHotRed)

结束是成功的。

此链接可以帮助您:http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=kohonen/man/plot.kohonen.Rd&d=R_CC

答案 1 :(得分:0)

我认为并非地图上的所有单元格都有内部点。 你有30乘30的地图和大约2700点。平均而言,每个细胞约3个点。一些细胞很可能有超过3个点,有些细胞是空的。

当所有单元格内部都有点时,R-blogger上的帖子中的代码效果很好。

要使其适用于您的数据,请尝试更改此部分:

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)

希望它有所帮助。

答案 2 :(得分: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")