6

我正在阅读 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 命令中寻找的“属性”部分到底是什么?有没有不同的方法可以“聚合”数据?

4

3 回答 3

11

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

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

于 2015-08-21T06:21:07.580 回答
1

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

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

pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2")
于 2017-05-05T05:54:46.697 回答
1

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

希望能帮助到你。

于 2016-01-27T13:25:00.890 回答