r语言 - 中断for循环不能提供正确的输出



我将三个不同的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
}    
}

最新更新