【问题标题】:K-means initial centers membershipK-means 初始中心成员资格
【发布时间】:2015-04-06 19:01:29
【问题描述】:

我正在尝试用 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")

我的目标是在“初始中心”图中显示每个点的初始中心成员资格。

谢谢。


编辑:

我认为我没有正确解释自己。

在这个网站上有一个模拟显示我想得到什么:

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

当您第一次单击“迭代”按钮 (click1) 时,会放置初始中心。第二次按下(单击 2),点被分配到更靠近中心的位置,并涂上不同的颜色。第三次点击(click3),计算新的中心,第四次点击(click4),再次将点分配到更靠近的中心。

当您运行 kmeans() 并在第一次迭代时停止它,您将获得集群的新中心 (click3)、dfCluster$center,以及每个点的集群成员 (click4)、dfCluster$cluster,但您确实这样做了没有得到每个点的初始中心成员资格(点击 2),这正是我正在寻找的。​​p>


我终于完成了我想要的:一步一步的 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&lt;-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 new center)。我必须运行它 14 次(#assigment 和 #calculate 新中心)才能获得它们。我不知道kmeans() 过程中“迭代”的含义。有人知道吗?

【问题讨论】:

  • 也许我误解了这个问题,但第一个初始中心不是点本身吗?

标签: r cluster-analysis k-means


【解决方案1】:

kcenters 是您的初始质心。

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

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 2017-07-04
    • 2014-01-25
    • 2017-02-09
    • 2016-06-27
    • 2016-05-27
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多