我正在阅读关于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命令中寻找的&#34; Property&#34;部分究竟是什么?有没有不同的方式可以&#34;聚合&#34;数据?
答案 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")