K-means初始中心成员资格

时间:2015-02-06 15:27:19

标签: r cluster-analysis k-means

我试图用r绘制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")

我的目标是显示每个点的初始中心成员资格&#34;初始中心&#34;曲线图。

感谢。


编辑:

我想我没有正确解释自己。

在这个网站上有一个模拟显示我想要得到的东西:

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

当您点击&#34;迭代&#34;按钮第一次(单击1),放置初始中心。再按一次(单击2),将点指定为更近的中心,并涂上不同的颜色。当您第三次单击(单击3)时,将计算新的中心,当您第四次按下(单击4)时,点将再次分配到更近的中心。

当你运行kmeans()并在第一次迭代时停止它时,你会得到新的集群中心(click3),dfCluster$center和每个点的集群成员资格(click4),{{1但是你没有获得每个点的初始中心成员资格(点击2),这正是我正在寻找的。


我终于完成了我想要的东西:一步一步的k-means。如果代码不完美,我很抱歉,我是R的新手。

dfCluster$cluster

然后,您可以继续稍微调整上面的代码:

#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)

这些中心与我在程序的第一次迭代(#calculate new centers)中得到的中心不匹配。我必须运行它14次(#assigment和#calculate新中心)才能获得它们。我不知道&#34;迭代&#34;的含义。在> dfCluster$centers x y 1 1.129419 4.905327 2 2.928011 2.880839 3 4.715513 4.766608 程序中。有人知道吗?

1 个答案:

答案 0 :(得分:0)

kcenters是您的初始质心。

kmeans方法可能无法进行0次迭代,但这些是中心......