2015-02-06 23 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次迭代,但这些都是中心...