2014-09-22 17 views
5

Tôi đã đọc qua bài đăng trên blog này trên R-blogger và tôi bị nhầm lẫn bởi phần cuối của mã và không thể tìm ra.Lỗi vẽ bản đồ Kohonen trong R?

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

Tôi đã cố gắng tạo lại dữ liệu này với dữ liệu của riêng tôi. Tôi có 5 biến theo phân phối mũ với 2755 điểm.

Tôi tốt với và có thể vẽ bản đồ mà nó tạo ra:

plot(som_model, type="codes") 

enter image description here

Các phần của mã Tôi không hiểu là:

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) 

Như Tôi hiểu điều đó, phần này của đoạn mã được giả định là vẽ một trong các biến trên bản đồ để xem nó trông như thế nào nhưng đây là nơi tôi gặp phải vấn đề. Khi tôi chạy phần này của mã tôi nhận được cảnh báo:

Warning message: 
In bgcolors[!is.na(showcolors)] <- bgcol[showcolors[!is.na(showcolors)]] : 
number of items to replace is not a multiple of replacement length 

và nó tạo ra những âm mưu:

enter image description here

Mà chỉ là một số cách không nhìn bên phải ...

Bây giờ những gì tôi nghĩ rằng nó đã đi xuống là cách chức năng tổng hợp đã đặt hàng lại dữ liệu. Chiều dài của var_unscaled là 789 và chiều dài của dữ liệu som_model $, đào tạo [, var] và unit.classif là tất cả độ dài 2755. Tôi đã thử vẽ dữ liệu tổng hợp, kết quả không có cảnh báo mà là một đồ thị khó hiểu (như mong đợi).

Bây giờ tôi nghĩ rằng nó đã làm điều này bởi vì unit.classif có rất nhiều số lặp lại bên trong nó và đó là lý do tại sao nó đã giảm kích thước.

Câu hỏi là, tôi có lo lắng về cảnh báo không? Nó có tạo ra một đồ thị chính xác không? Điều gì chính xác là phần "tài sản" của tìm kiếm trong lệnh cốt truyện? Có cách nào khác tôi có thể "tổng hợp" dữ liệu không?

+0

Nếu cốt truyện nếu không đúng thì có, lo lắng về các cảnh báo. Trong thực tế, bạn nên luôn luôn quan tâm đến lý do tại sao bạn đang nhận được một cảnh báo. Tôi đã không kiểm tra đầy đủ nó, nhưng tôi nhận thấy bạn có một tập hợp con vào cuối 'aggregate'. Điều đó có cần thiết không? –

+2

Bạn nên cung cấp [ví dụ có thể tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) để chúng tôi có thể chạy cùng mã với bạn và nhận được cùng một lỗi. Nếu không, chúng tôi thực sự không có cách nào để biết dữ liệu của bạn được lưu trữ như thế nào trong mỗi đối tượng đó hoặc cách chúng được kết hợp trong câu lệnh lôgic. – MrFlick

+0

Bảng màu 'coolBlueHotRed' đến từ đâu và chiều dài của nó là bao nhiêu? Nó cũng có thể được cấu hình để phù hợp với dữ liệu ví dụ, không phải dữ liệu của bạn. –

Trả lời

8

Tôi nghĩ rằng bạn phải tạo màu bảng màu. Nếu bạn đặt các tham số

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

và sau đó cố gắng để có được một âm mưu, ví dụ

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

cuối cùng là thành công.

Liên kết này có thể giúp bạn: http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=kohonen/man/plot.kohonen.Rd&d=R_CC

0

Tôi nghĩ rằng không phải tất cả các tế bào trên bản đồ của bạn có điểm bên trong. Bạn có 30 bản đồ 30 và khoảng 2700 điểm. Trung bình khoảng 3 điểm cho mỗi ô. Với xác suất cao, một số ô có nhiều hơn 3 điểm và một số ô trống.

Mã trong bài đăng trên R-blogger hoạt động tốt khi tất cả các ô có điểm bên trong.

Để làm cho nó làm việc trên dữ liệu của bạn cố gắng thay đổi phần này:

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) 

với một này:

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) 

Hy vọng nó giúp.

0

Chỉ cần thêm các chức năng này để kịch bản của bạn:

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

pretty_palette <- c("#1f77b4","#ff7f0e","#2ca02c", "#d62728","#9467bd","#8c564b","#e377c2") 
Các vấn đề liên quan