6

私は R-bloggers に関するこのブログ投稿を読んでいましたが、コードの最後のセクションに混乱しており、理解できません。

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

これを独自のデータで再現しようとしました。2755 ポイントの指数分布に従う 5 つの変数があります。

私は問題なく、それが生成するマップをプロットできます:

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)

私が理解しているように、コードのこのセクションは、マップ上に変数の 1 つをプロットして、それがどのように見えるかを確認していると思われますが、ここで問題が発生します。コードのこのセクションを実行すると、次の警告が表示されます。

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 には多くの繰り返し数値が含まれているため、これが行われたと思います。そのため、サイズが縮小されています。

問題は、警告について心配するかどうかです。正確なグラフを作成していますか?プロットコマンドで探している「プロパティ」のセクションは正確には何ですか? データを「集計」する別の方法はありますか?

4

3 に答える 3

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 に答える
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 に答える