2015-02-06 182 views
0

我試圖用r繪製k-means算法的所有步驟,但我不能。K-means初始中心成員資格

的K-means算法以這種方式工作的:

  • 步驟1.初始化簇
  • 步驟2的中心分配最接近初始中心的每個數據點
  • 步驟3。將每個羣集的位置設置爲屬於該羣集的所有數據點的平均值
  • 第4步。爲每個數據點分配最近的羣集
  • 第5步。重複步驟3-4,直到收斂

我繪製簇(步驟1)的數據集和初始中心。而且,我可以繪製新的聚類中心並顯示哪個點屬於每個聚類(步驟3和4)。但我不知道如何繪製第2步。我需要第一次迭代之前每個點的第一個初始中心成員資格,但kmeans()不給您。我怎麼計算?

這裏是我的代碼:

set.seed(2009) 
points1<-data.frame(x=rnorm(50,1,0.1),y=rnorm(50,5,0.1)) 
points2<-data.frame(x=rnorm(50,5,0.1),y=rnorm(50,5,0.1)) 
points3<-data.frame(x=rnorm(200,3,0.8),y=rnorm(200,3,0.8)) 
df<-rbind(points1,points2,points3) 

p <- ggplot(df, aes(x, y)) 
p + geom_point(size=7, color="grey") + labs(title="Initial configuration") 

y<-c(4.88871745,4.88099143,3.69713723) 
x<-c(0.75606015,1.26736958,3.04961545) 
kcenters<-data.frame(x,y) 

p + geom_point(size=7, color="grey") + geom_point(data=kcenters, aes(x, y), size=7, color="black", shape="x") + labs(title="Initial centers") 

dfCluster<-kmeans(df,centers=kcenters, iter.max = 1) 

p + geom_point(size=7, aes(colour=as.factor(dfCluster$cluster))) + geom_point(data=data.frame(dfCluster$center), aes(x, y), size=7, color="black", shape="x")+ theme(legend.position="none") + labs(title="First iteration") 

我的目標是,以顯示「初始中心」的情節每個點的初始中心的會員。

謝謝。


編輯:

我覺得我沒好好解釋一下自己。

在這個網站上有顯示什麼,我想獲得一個模擬:

http://www.onmyphd.com/?p=k-means.clustering

當您單擊「迭代」按鈕,在第一時間(CLICK1),初始中心放置。再按一下(點擊2),點將被分配到更近的中心,並塗上不同的顏色。點擊第三次(click3)時,將計算新的中心,並且當您第四次按下時(click4),會再次將點分配到更近的中心。

當您運行kmeans(),並在第一次迭代停止它,你得到的集羣(CLICK3),dfCluster$center的新中心,每個點(CLICK4),dfCluster$cluster的集羣成員,但你沒有得到的初始中心每個點的成員資格(點擊2),這正是我正在尋找的。


我終於完成了我想要的:一步一步的k-means。對不起,如果代碼不完美,我是一個新手R.

#How does k-means work 

library(ggplot2) 

set.seed(2009) 
points1<-data.frame(x=rnorm(50,1,0.1),y=rnorm(50,5,0.1)) 
points2<-data.frame(x=rnorm(50,5,0.1),y=rnorm(50,5,0.1)) 
points3<-data.frame(x=rnorm(200,3,0.8),y=rnorm(200,3,0.8)) 
df<-rbind(points1,points2,points3) 

#plot initial points 
p <- ggplot(df, aes(x, y)) 
p + geom_point(size=7, color="grey") 

#set initial centers 
kcenters<-df[c(49,26,297),] 

#plot centers 
p + geom_point(size=7, color="grey") + geom_point(data=kcenters, aes(x, y), size=7, color="black", shape="x") 

#assignment (to calculate distances to initial centers and to allocate points to the cluster to which they are closest) 
library(reshape) 
distances <- melt(as.matrix(dist(df,diag=T,upper = T)), varnames = c("row", "col")) 
dist_center1<-subset(distances,col==49,select = value) 
dist_center2<-subset(distances,col==26,select = value) 
dist_center3<-subset(distances,col==297,select = value) 
dist_centers<-data.frame(dist_center1,dist_center2,dist_center3) 
colnames(dist_centers)<-c("dist_center1","dist_center2","dist_center3") 
dist_centers$cluster<-apply(dist_centers, 1, which.min) 
df<-cbind(df,dist_centers) 

#plot assignment 
p + geom_point(size=7, aes(colour=as.factor(df$cluster))) + geom_point(data=kcenters, aes(x, y), size=7, color="black", shape="x") + theme(legend.position="none") 

#calculate new centers 
x<-tapply(df$x,df$cluster,mean) 
y<-tapply(df$y,df$cluster,mean) 
kcenters<-data.frame(x,y) 

#plot new centers 
p + geom_point(size=7, aes(colour=as.factor(df$cluster))) + geom_point(data=kcenters, aes(x, y), size=7, color="black", shape="x") + theme(legend.position="none") 

然後,你可以繼續過程稍有調整上面的代碼:

#assignment 
df<-rbind(df[,1:2],kcenters) 
row.names(df) <- NULL 
distances <- melt(as.matrix(dist(df,diag=T,upper = T)), varnames = c("row", "col")) 
dist_center1<-subset(distances,col==301,select = value) 
dist_center2<-subset(distances,col==302,select = value) 
dist_center3<-subset(distances,col==303,select = value) 
dist_centers<-data.frame(dist_center1,dist_center2,dist_center3) 
colnames(dist_centers)<-c("dist_center1","dist_center2","dist_center3") 
dist_centers$cluster<-apply(dist_centers, 1, which.min) 
df<-cbind(df[1:300,],dist_centers[1:300,]) 

#plot assignment 
p + geom_point(size=7, aes(colour=as.factor(df$cluster))) + geom_point(data=kcenters, aes(x, y), size=7, color="black", shape="x") + theme(legend.position="none") 

#calculate new centers 
x<-tapply(df$x,df$cluster,mean) 
y<-tapply(df$y,df$cluster,mean) 
kcenters<-data.frame(x,y) 

#plot new centers 
p + geom_point(size=7, aes(colour=as.factor(df$cluster))) + geom_point(data=kcenters, aes(x, y), size=7, color="black", shape="x") + theme(legend.position="none") 

如果運行kmeans()具有相同的初始中心,並阻止它在第一次迭代,dfCluster<-kmeans(df,centers=kcenters, iter.max = 1),你會得到後續中心:

> dfCluster$centers 
     x  y 
1 1.129419 4.905327 
2 2.928011 2.880839 
3 4.715513 4.766608 

這些中心與我在我的程序的第一次迭代(#calculate新中心)中得到的不匹配。我必須運行它14次(#assigment和#calculate新中心)來獲得它們。我不知道kmeans()程序中的「迭代」的含義。有人知道嗎?

+0

也許我誤解的問題,但不會第一個初始中心是點自己? – blakeoft 2015-02-06 16:22:02

回答

0

kcenters是您的初始質心。

的k均值方法也許不能做到0次迭代,但這些都是中心...