我将三个不同的kemans
模型拟合到虹膜数据集。然后,我想比较一下他们使用for
环的rand index (RI)。如果一个模型的RI大于第二个模型,则停止循环并返回最大的RI值。
例如,第一个模型的RI
大于第二个模型的RI
,则打破for
循环并提供第一个模型的RI
。在我的例子中,第二个模型的RI
大于第三个模型。因此,for
循环应该中断,并为我提供第二个模型fit2$cluster
的值。当我运行模型时,它返回数字1,这是第一个模型,它是不正确的。如果有办法返回模型的名称就更好了。请帮忙好吗?
这是我的尝试:
library(aricode)## contain the RI function
fit1 <- kmeans(iris[,-5], centers = 2)
fit2 <- kmeans(iris[,-5], centers = 3)
fit3 <- kmeans(iris[,-5], centers = 4)
fit <- list(fit1$cluster, fit2$cluster, fit3$cluster)
这是我的for循环
for(i in seq_along(fit)){
if (RI(fit[[i]], iris[,5]) > RI(fit[[i+1]], iris[,5])) break
# x <- RI(fit[[i]], iris[,5])
print(i)
}
不知道为什么你想要print
,你只能读它,但不能用它做任何事情。另外,也不需要break
,因为您希望将循环运行到末尾。
这里我们使用模型1作为起始值,并在每次迭代中更新它。
w <- 1L
for (i in seq_along(fit)[-1L]) {
if (RI(fit[[i]], iris[, 5]) > RI(fit[[i - 1]], iris[, 5])) {
w <- i
}
}
w
# [1] 2
RI(fit[[w]], iris[, 5])
# [1] 0.8797315
或者如果RI()
是Vectorized
,那就容易多了,所以让我们来做吧!
RIv <- Vectorize(RI, vectorize.args='c1')
RIv(fit, iris[, 5])
# [1] 0.7636689 0.8797315 0.8295302
为了了解哪个模型的值最大,我们使用which.max
,
RIv(fit, iris[, 5]) |> which.max()
# [1] 2
简单地获得最大值,我们将其管道到max
,
RIv(fit, iris[, 5]) |> max()
# [1] 0.8797315
或all together:
RIv(fit, iris[, 5]) |> {(.) {w=which.max(.); data.frame(model=w, value=.[w])}}()
# model value
# 1 2 0.8797315
它只打印1,正是因为第二个模型的RI
大于第三个模型,为此,如果在第二次迭代中条件满足并且循环在打印2之前中断,因此,您只打印1,而不是尝试这个
for(i in seq_along(fit)){
if (RI(fit[[i]], iris[,5]) > RI(fit[[i+1]], iris[,5])) {
print(i)
break
}
}