龍君蛋君
2015年5月24日
1.背景介紹
最近公司在用R 建模,老板要求用shiny 展示結果,建模的過程中用到諸如kmean聚類,時間序列分析等方法。由於之前看過一篇討論kmenas聚類針對某一特定數據類型,聚類結果非常不靠譜的文章,於是這個周末突發奇想,用shiny可交互的展示kmeans聚類中的坑。。。這篇博文就當是記錄學習shiny和加深對kmeans、層次聚類的理解吧。
2.知識引用與學習
2)Shiny Gallery-This gallery contains useful examples to learn from
3.代碼與圖形展示
一個完整的shiny app 包含兩個.R文件,ui.R和server.R。園主大人的這篇文章Shiny的架構淺析解釋的很詳細,可幫助理解shiny。
part 1 : ui.R
library(shiny)
library(dplyr)
library(broom)
shinyUI(
pageWithSidebar(
# Application title
headerPanel("kmeans VS hclust"),
sidebarPanel(
numericInput('n', 'Number of obs', 500 ,min=200 ,max=1000),
selectInput("type", "Select a clust approach:",c("kmeans","hclust"),"kmeans")
),
mainPanel(plotOutput("plot"))
)
)
part 2 : server.R
library(shiny)
library(dplyr)
library(broom)
shinyServer(function(input, output,session) {
#----data 1 for kmeans clust----
set.seed(500)
selectedData <- reactive({
rbind(
data_frame(x = rnorm(input$n), y = rnorm(input$n)),
data_frame(r = rnorm(input$n, 5, .25), theta = runif(input$n, 0, 2 * pi),
x = r * cos(theta), y = r * sin(theta)) %>%
dplyr::select(x, y)
)
})
#----data2 for hclust use----
selectedData_clust <- reactive({
cbind(selectedData(),hclust_assignments=selectedData() %>%
dist() %>% hclust(method = "single") %>%
cutree(2) %>% factor()%>%as.data.frame()
)
})
#-----plot-----
output$plot <- renderPlot({
switch(input$type,
"kmeans" =( plot(selectedData(),
col = kmeans(selectedData(),2)$cluster,
pch = 20, cex = 1)
),
"hclust" = (plot(selectedData_clust()[,1:2],
col = selectedData_clust()[,3],
pch = 20, cex = 1)
)
)
})
#----end---
})
先解釋下,用k-means進行聚類,常常假定數據是球狀的,code中生成的數據集是非球狀的,以便證明kmeans針對這種非球狀數據集,會給出坑爹的結果。參考大數據分析之——k-means聚類中的坑。
part 3 :看圖,也就是shiny的展示。
圖1-kmeans聚類:

圖2-hclust聚類(Hierarchical Clustering):

明顯這種數據集,用層次聚類得出的結果才是正確的。
4.總結
1)要勤寫博客,不能太懶!
2)Shiny Gallery-This gallery contains useful examples to learn from 這里有很多shiny 的例子,學習shiny的絕佳之地。
3)再推薦一個博客,r-bloggers 最前沿的R資訊分享,hadley都在上面寫文章的哦!
4)Rstudio 真是個偉大的公司,開發了那么多好用,好玩的東西。
以上。
