【问题标题】:input k-means in R在 R 中输入 k-means
【发布时间】:2017-12-16 23:49:07
【问题描述】:

我正在尝试对具有 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)

【问题讨论】:

    标签: r cluster-analysis k-means


    【解决方案1】:

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

    运行?kmeans

    我还建议您将 nstart = 20 添加到您的 kmeans 调用中。 k-means 聚类是一个随机过程。这将运行该算法 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 作为可重现数据是一小部分)

    编辑整数错误

    我能够使用

    重现您的错误
    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
    

    【讨论】:

    • 谢谢!当我在我的真实数据集上尝试这个时,只有一个问题。然后我得到这个: intCriteria(totalm, cl$cluster, c("dav")) 中的错误:REAL() 只能应用于“数字”,而不是“整数”
    • 您能否编辑您的示例以发送您的数据集样本。请参阅stackoverflow.com/questions/5963269/…,例如dput(head(totalm,20)) 如果不是太多数据
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2014-09-30
    • 2019-02-02
    • 2013-07-07
    • 2016-08-25
    • 2013-02-07
    相关资源
    最近更新 更多