我正在尝试在69列和1000行的数据帧上执行k-means。首先,我需要首先使用Davies-Bouldin指数来确定最佳簇数。这个算法要求输入应该是矩阵的形式,我首先使用这个代码:
totalm <- data.matrix(total)
遵循以下代码(戴维斯 - 布尔丁指数)
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)
答案 0 :(得分:1)
错误来自cl<-as.numeric(cl)
。调用kmeans的结果是一个对象,它是一个包含有关模型的各种信息的列表。
运行?kmeans
我还建议您将nstart = 20
添加到您的kmeans电话中。 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,因为可重现的数据是一小组)
编辑整数错误
我能够使用
重现您的错误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