【问题标题】:Error plotting Kohonen maps in R?在 R 中绘制 Kohonen 地图时出错?
【发布时间】:2014-11-15 21:26:00
【问题描述】:

我正在阅读 R-bloggers 上的这篇博文,但我对代码的最后一部分感到困惑,无法弄清楚。

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

我试图用我自己的数据重新创建它。我有 5 个变量遵循 2755 个点的指数分布。

我很好,可以绘制它生成的地图:

plot(som_model, type="codes")

我不明白的代码部分是:

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

它会产生情节:

这只是一些看起来不正确...

现在我认为归结为聚合函数重新排序数据的方式。 var_unscaled 的长度是 789,som_model$data、training[,var] 和 unit.classif 的长度都是 2755。我尝试绘制聚合数据,结果没有警告,而是一个难以理解的图形(如预期的那样)。

现在我认为它已经这样做了,因为 unit.classif 里面有很多重复的数字,这就是它减小大小的原因。

问题是,我担心警告吗?它是否产生了准确的图表?在 plot 命令中寻找的“属性”部分到底是什么?有没有其他方法可以“聚合”数据?

【问题讨论】:

  • 如果情节不正确,那么是的,请担心警告。实际上,您应该始终关注收到警告的原因。我还没有完全检查出来,但我注意到你在aggregate 的末尾有一个子集。有必要吗?
  • 您应该提供reproducible example,以便我们可以运行与您相同的代码并得到相同的错误。否则我们真的无法知道您的数据是如何存储在每个对象中的,或者它们应该如何在 plot 语句中组合。
  • 调色板coolBlueHotRed 来自哪里,它的长度是多少?它很可能被配置为匹配示例数据,而不是您的数据。
  • coolBlueHotRed 托盘是:coolBlueHotRed

标签: r plot som


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为并非地图上的所有单元格内部都有点。 你有 30 x 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)
    

    希望对你有帮助。

    【讨论】:

    • 我同意。如果您的任何单元格为空,这就是您的代码不起作用的原因。我也有同样的问题
    【解决方案3】:

    只需将这些函数添加到您的脚本中:

    coolBlueHotRed <- function(n, alpha = 1) {rainbow(n, end=4/6, alpha=alpha)[n:1]}
    
    pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2015-05-03
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多