繁体   English   中英

在R中输入k-均值

[英]input k-means in R

我正在尝试在具有69列和1000行的数据帧上执行k-means。 首先,我需要首先使用Davies-Bouldin指数来确定最佳的簇数。 该算法要求输入应采用矩阵形式,我首先使用了以下代码:

totalm <- data.matrix(total)

后跟以下代码(Davies-Bouldin索引)

clusternumber<-0
max_cluster_number <- 30
#Davies Bouldin algorithm
library(clusterCrit)
smallest <-99999
for(b in 2:max_cluster_number){
a <-99999
for(i in 1:200){
cl <- kmeans(totalm,b)
cl<-as.numeric(cl)
intCriteria(totalm,cl$cluster,c("dav"))
if(intCriteria(totalm,cl$cluster,c("dav"))$davies_bouldin < a){
a <- intCriteria(totalm,cl$cluster,c("dav"))$davies_bouldin }
}
if(a<smallest){
smallest <- a
clusternumber <-b
}
}
print("##clusternumber##")
print(clusternumber)
print("##smallest##")
print(smallest)

我继续收到此错误:(list)对象不能被强制键入'double'。 我该如何解决?

可重现的示例:

a <- c(0,0,1,0,1,0,0)
b <- c(0,0,1,0,0,0,0)
c <- c(1,1,0,0,0,0,1)
d <- c(1,1,0,0,0,0,0)

total <- cbind(a,b,c,d)

错误来自cl<-as.numeric(cl) 调用kmeans的结果是一个对象,该对象是包含有关模型的各种信息的列表。

运行?kmeans

我还建议您在kmeans调用中添加nstart = 20 k均值聚类是一个随机过程。 这将运行算法20次,并找到最佳拟合(即,针对每个中心数量)。

for(b in 2:max_cluster_number){
    a <-99999
    for(i in 1:200){
        cl <- kmeans(totalm,centers = b,nstart = 20)
        #cl<-as.numeric(cl)
        intCriteria(totalm,cl$cluster,c("dav"))
        if(intCriteria(totalm,cl$cluster,c("dav"))$davies_bouldin < a){
            a <- intCriteria(totalm,cl$cluster,c("dav"))$davies_bouldin }
    }
    if(a<smallest){
        smallest <- a
        clusternumber <-b
    }
}

这给了我

[1] "##clusternumber##"   
[1] 4
[1] "##smallest##"
[1] 0.138675

(由于可复制的数据很小,暂时将最大聚类更改为4)

EDIT整数错误

我能够使用重现您的错误

a <- as.integer(c(0,0,1,0,1,0,0))
b <- as.integer(c(0,0,1,0,0,0,0))
c <- as.integer(c(1,1,0,0,0,0,1))
d <- as.integer(c(1,1,0,0,0,0,0))

totalm <- cbind(a,b,c,d)

这样就创建了一个整数矩阵。

然后,我能够通过使用来消除错误

storage.mode(totalm) <- "double"

注意

total <- cbind(a,b,c,d)
totalm <- data.matrix(total)

在这个例子中对于数据来说是不必要的

> identical(total,totalm)
[1] TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM