6

Rのkmeansを使用してクラスター化したデータのセット(4次元で5000ポイント)があります。

各クラスター内のポイントを、そのクラスターの中心までの距離で並べ替えたいと思います。

非常に簡単に言えば、データは次のようになります(サブセットを使用してさまざまなアプローチをテストしています)。

id  Ans Acc Que Kudos
1   100 100 100 100
2   85  83  80  75
3   69  65  30  29
4   41  45  30  22 
5   10  12  18  16
6   10  13  10  9
7   10  16  16  19
8   65  68  100 100
9   36  30  35  29
10  36  30  26  22

まず、次の方法を使用して、データセットを2つのクラスターにクラスター化しました。

(result <- kmeans(data, 2))

これにより、cluster、centersなどのメソッドを持つkmeansオブジェクトが返されます。

しかし、各ポイントを比較して順序付きリストを作成する方法がわかりません。

次に、別のSOユーザーが提案したセリエーションアプローチをここで試しました

私はこれらのコマンドを使用します:

clus <- kmeans(scale(x, scale = FALSE), centers = 3, iter.max = 50, nstart = 10)
mns <- sapply(split(x, clus$cluster), function(x) mean(unlist(x)))
result <- dat[order(order(mns)[clus$cluster]), ]

これは順序付きリストを生成するようですが、ラベル付きクラスターにバインドすると(次のcbindコマンドを使用して):

result <- cbind(x[order(order(mns)[clus$cluster]), ],clus$cluster)

次の結果が得られましたが、正しく注文されていないようです。

id  Ans Acc Que Kudos   clus
1   3   69  65  30  29  1
2   4   41  45  30  22  1
3   5   10  12  18  16  2
4   6   10  13  10  9   2
5   7   10  16  16  19  2
6   9   36  30  35  29  2
7   10  36  30  26  22  2
8   1   100 100 100 100 1
9   2   85  83  80  75  2
10  8   65  68  100 100 2

私は意地悪なコマンドを書きたくありませんが、アプローチがどのように機能するかを理解しています。誰かがこれを手伝ったり、光を広めたりすることができれば、それは本当に素晴らしいことです。

編集:::::::::::

クラスターは簡単にプロットできるので、ポイントと中心の間の距離を取得してランク付けするためのより簡単な方法があると思います。

上記のクラスターの中心(k = 2を使用する場合)は次のとおりです。しかし、これを取得して個々のポイントと比較する方法がわかりません。

     Ans    Accep     Que      Kudos
1 83.33333 83.66667 93.33333 91.66667
2 30.28571 30.14286 23.57143 20.85714 

NB :::::::::

トップユースのkmeansは必要ありませんが、クラスターの数を指定し、それらのクラスターからポイントの順序付きリストを取得したいと思います。

4

1 に答える 1

6

これは、からの最初の例を使用して、あなたが求めることを行う例です?kmeans。それはおそらくそれほど効率的ではありませんが、それを基に構築するものです。

#Taken straight from ?kmeans
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")
cl <- kmeans(x, 2)

x <- cbind(x,cl = cl$cluster)

#Function to apply to each cluster to 
# do the ordering
orderCluster <- function(i,data,centers){
    #Extract cluster and center
dt <- data[data[,3] == i,]
ct <- centers[i,]

    #Calculate distances
dt <- cbind(dt,dist = apply((dt[,1:2] - ct)^2,1,sum))
    #Sort
dt[order(dt[,4]),]
}

do.call(rbind,lapply(sort(unique(cl$cluster)),orderCluster,data = x,centers = cl$centers))
于 2012-04-09T17:54:37.913 に答える