2017-08-23 13 views
2

私はちょうどピークがあるべき場所、それが判断するほとんど不可能ですが、ggplotで2D密度平滑で描かれた場合、私はこれらを取得するだけで、データポイントでデータ/プロットの次のタイプ多くの異常値を含む2Dデータのクラスタリングのための最適化されたK平均の最適化?より良いアプローチ?

enter image description here

探しています本当に素敵な山々。私が目にするのは、〜10点のグループを見つけたいと思っています。 「有効なグループ」の正確な数は、もちろん議論のために上がっています。ここ

データ: https://pastebin.com/5wquw7UF

library(ggplot2) 
library(colorRamps) 
library(tclust) 

ggplot(data = df, aes(x = x, y = y)) + 
    stat_density2d(geom = "raster", 
        aes(fill = ..density..), 
        contour = FALSE) + 
    geom_point(col = "white", alpha = 0.1) + 
    scale_x_continuous(expand = c(0,0), 
         limits = c(0,1)) + 
    scale_y_continuous(expand = c(0,0), 
         limits = c(0,1)) + 
    theme_tufte(base_size = 11, base_family = "Helvetica") + 
    theme(axis.text = element_text(color = "black"), 
      panel.border = element_rect(colour = "black", fill=NA, size=0.7), 
      legend.key.height = unit(2.5,"line"), 
      legend.key.width = unit(1, "line")) + 
    scale_fill_gradientn(name = "Density", 
         colours = matlab.like(1000)) 

私はパッケージtclustで、トリミングされたクラスタリングに見てきました。データを手書きして、私は以下を考え出すことができました。しかし、私がどれほど多くのパラメータを使っていても、視覚的に感じるような「タイト」なグループは得られないようです。特にグループ5は所属していない場所に侵入しているようだ。グループ10もちょっと奇妙ですが、後で破棄するのに十分に隔離されています。

これに対して、より良い方法がありますか、それともパラメータを正しく設定する方法がわからないのですか?

set.seed(2) 

trimmed_cluster <- tclust(
    x = df, 
    k = 10, # 9 
    alpha = 0.1, # 0.1 
    drop.empty.clust = FALSE, 
    equal.weights = TRUE, 
    restr = c("sigma", "eigen"), # sigma 
    restr.fact = 1 
) 

df$cluster <- trimmed_cluster$cluster 

trimmed_cluster_centers <- data.frame(t(trimmed_cluster$centers)) 

df_clustered <- subset(df, cluster != 0) 

ggplot(data = df, aes(x = x, y = y)) + 
    stat_density2d(geom = "raster", 
        aes(fill = ..density..), 
        contour = FALSE) + 
    geom_point(data = df_clustered, aes(x = x, y = y, col = as.factor(cluster))) + 
    geom_text(data = trimmed_cluster_centers, 
       aes(x = x, y = y, label = as.character(1:length(trimmed_cluster_centers$x))), 
       size = 5, 
       fontface = "bold", 
       col = "yellow2") + 
    scale_x_continuous(expand = c(0,0), 
         limits = c(0,1)) + 
    scale_y_continuous(expand = c(0,0), 
         limits = c(0,1)) + 
    theme_tufte(base_size = 11, base_family = "Helvetica") + 
    theme(axis.text = element_text(color = "black"), 
      panel.border = element_rect(colour = "black", fill=NA, size=0.7), 
      legend.key.height = unit(0.8,"line"), 
      legend.key.width = unit(0.5, "line")) + 
    scale_fill_gradientn(name = "Density", 
         colours = matlab.like(1000)) + 
     scale_color_brewer(name = "cluster ID", 
        type = "qual", 
        palette = "Spectral") 

enter image description here

+1

**密度ベース**クラスタリングの古典的なDBSCANアルゴリズムはどうですか? –

+0

これは完璧です*と私はほとんど今尋ねて愚かな感じ! –

答えて

1

、私はあなたがDBSCAN density-based clusteringを使用することを示唆しています。

これはよく調べられ、頻繁に使用されるクラスタリングアルゴリズムであり、任意の形状のの密度接続されたコンポーネントを検索します。

名前のNは、アルゴリズムが低密度のためにどのクラスタにも属していない点を「無視」できるため、ノイズの略です。それはノイズにかなり強く、あなたを助けるかもしれません。

0

あなたは密度のピークを探しているなら、手段シフトアルゴリズムは役に立つかもしれません。他のクラスタリングアルゴリズムと同様に、パラメータのチューニングに時間を費やしたいかもしれませんが、かなり素早くそのように思えるものがあります。代わりにK-手段の

library(LPCM) 
MS7 = ms(df, 0.07) 
MS7$cluster.center 
     [,1]  [,2] 
1 0.55790817 0.46878846 
2 0.42916901 0.60982702 
3 0.04142821 0.63190748 
4 0.58098385 0.03693459 
5 0.01561478 0.19987934 
6 0.18271326 0.01630580 
7 0.80381893 0.65499869 
8 0.59797721 0.88041362 
9 0.86784436 0.95078057 

Results of Mean shift

関連する問題