R kmeans()的结果在不同的运行中没有变化
我试图运行几个kmeans,以查看R kmeans()的结果在不同的运行中没有变化,r,cluster-analysis,k-means,R,Cluster Analysis,K Means,我试图运行几个kmeans,以查看totss得到的不同值。但是当我运行下面的代码时,我得到了50次相同的精确结果(n=50) 知道为什么会这样吗 图片:我删除了set.seed()的内容,并打印了a$iter(迭代次数)。set.seed(runif(1))始终为您提供set.seed(0)。您可以尝试set.seed(i) 您也可以只在循环外部使用单个set.seed 我将runif(1)更改为runif(1)*100,但每次运行都得到相同的输出 我添加了set.seed(),因为如果我删除
totss
得到的不同值。但是当我运行下面的代码时,我得到了50次相同的精确结果(n=50)
知道为什么会这样吗
图片:我删除了set.seed()的内容,并打印了a$iter
(迭代次数)。set.seed(runif(1))
始终为您提供set.seed(0)
。您可以尝试set.seed(i)
您也可以只在循环外部使用单个set.seed
我将
runif(1)
更改为runif(1)*100
,但每次运行都得到相同的输出
我添加了set.seed()
,因为如果我删除它,循环会为所有迭代提供相同的结果
我理解你的观点,但问题是有些地方出了问题,因为我在每次运行/迭代中都得到了相同的结果 谁告诉你
kmeans
总是给出随机结果?这取决于数据的外观。下面的示例有两个明确的集群,因此kmeans
不会显示随机性
set.seed(0)
X <- rbind(matrix(rnorm(100), 50), matrix(rnorm(100, 10), 50))
plot(X)
set.seed(0)
Xset.seed(runif(1))
始终为您提供set.seed(0)
。您可以尝试set.seed(i)
您也可以只在循环外部使用单个set.seed
我将runif(1)
更改为runif(1)*100
,但每次运行都得到相同的输出
我添加了set.seed()
,因为如果我删除它,循环会为所有迭代提供相同的结果
我理解你的观点,但问题是有些地方出了问题,因为我在每次运行/迭代中都得到了相同的结果
谁告诉你kmeans
总是给出随机结果?这取决于数据的外观。下面的示例有两个明确的集群,因此kmeans
不会显示随机性
set.seed(0)
X <- rbind(matrix(rnorm(100), 50), matrix(rnorm(100, 10), 50))
plot(X)
set.seed(0)
数据的X太极端,则可能只有一个最佳值
在您显示的数据部分中,第一列是常量(=无所谓),最后一列的大小太小,不重要。另外两个只有两个值。因此,几乎可以肯定的是,我们会发现这个微不足道的二进制分割
所以问题在于你的数据。数据太过极端,那么可能只有一个最佳值
在您显示的数据部分中,第一列是常量(=无所谓),最后一列的大小太小,不重要。另外两个只有两个值。因此,几乎可以肯定的是,我们会发现这个微不足道的二进制分割
因此,问题是您的数据。runif(1)返回的值介于0和1之间,set.seed需要一个整数。我怀疑你在每个循环开始时将随机数生成器重置为相同的初始值,因此计算结果完全相同。我不知道你实际上在做什么。是否设置固定的随机种子?对于前者,请参见@李哲源'下面是我的答案;对于后者(没有固定种子),只需删除set.seed(…)
,每次都会产生一个随机种子。我将“runif(1)”部分改为“set.seed(round(as.numeric(runif(1)*100))”,并且是相同的output@MauritsEvers实际上我添加了“set.seed()”的内容,因为如果我放弃它,对于所有迭代,它仍然给我相同的结果。注意,索引k
在每次迭代中增加1,但您没有使用它。如果(1)返回一个介于0和1之间的值,并且set.seed需要一个整数,那么它不会改变looprunif中的任何内容。我怀疑你在每个循环开始时将随机数生成器重置为相同的初始值,因此计算结果完全相同。我不知道你实际上在做什么。是否设置固定的随机种子?对于前者,请参见@李哲源'下面是我的答案;对于后者(没有固定种子),只需删除set.seed(…)
,每次都会产生一个随机种子。我将“runif(1)”部分改为“set.seed(round(as.numeric(runif(1)*100))”,并且是相同的output@MauritsEvers实际上我添加了“set.seed()”的内容,因为如果我放弃它,对于所有迭代,它仍然给我相同的结果。注意,索引k
在每次迭代中增加1,但您没有使用它。它不会改变你的循环中的任何东西我理解你的观点,但问题是有些地方出了问题,因为我在每次运行/迭代中没有得到相同的结果。我理解你的观点,但问题是有些地方出了问题,因为我在每次运行/迭代中没有得到相同的结果。
set.seed(0)
X <- rbind(matrix(rnorm(100), 50), matrix(rnorm(100, 10), 50))
plot(X)
## 50 run
cl <- replicate(50, kmeans(X, 2), FALSE)
## size[1]
sapply(cl, "[[", c(7, 1))
# [1] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#[26] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
## size[2]
sapply(cl, "[[", c(7, 2))
# [1] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#[26] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
## iter
sapply(cl, "[[", 8)
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#[39] 1 1 1 1 1 1 1 1 1 1 1 1
## center
ctr <- lapply(cl, "[[", 2)
unique(ctr)
#[[1]]
# [,1] [,2]
#1 0.02393097 0.02140593 ## lower left cluster is the 1st cluster
#2 9.78910937 10.11978752
#
#[[2]]
# [,1] [,2]
#1 9.78910937 10.11978752 ## upper right cluster is the 1st cluster
#2 0.02393097 0.02140593
X <- matrix(runif(200), 100)
plot(X)