作为R的新手,我对写入和阅读矢量数据有疑问。
我的例子1
n = 100 g = 6 set.seed(g) d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))) plot(d) require(vegan) fit <- cascadeKM(scale(d, center = TRUE, scale = TRUE), 1, 10, iter = 1000) plot(fit, sortg = TRUE, grpmts.plot = TRUE) calinski.best <- as.numeric(which.max(fit$results[2,])) cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")
(source),按预期打印“Calinski准则最佳聚类数:5”。
示例2 :(首先写入数据帧d,然后读取它)
n = 100 g = 6 set.seed(g) d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))) write.table(d, "d.txt", sep='\t', quote=FALSE) #write data frame d = read.table("d.txt", header=TRUE, sep = '\t') #read later plot(d) require(vegan) fit <- cascadeKM(scale(d, center = TRUE, scale = TRUE), 1, 10, iter = 1000) plot(fit, sortg = TRUE, grpmts.plot = TRUE) calinski.best <- as.numeric(which.max(fit$results[2,])) cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")
然而,示例2打印“Calinski准则最佳簇数:1”。
我认为格式(或其他)在来自R中的文件IO后已经改变了。但我不知道R如何读写数字。任何人都可以给我一些线索,谢谢。
EDIT 如果文件没有列名和行名,则问题解决了。
write.table(d, "d.txt", sep='\t', quote=FALSE, row.name=FALSE, col.names=FALSE)
阅读时,R还会读取行和列名称。 另一个是在阅读时逃避这些名字。
答案 0 :(得分:0)
无法为一个组计算Calinski指数,但它变为Inf或-Inf。在第一个例子中它碰巧是-Inf,而在第二个例子中它碰巧是Inf,当你寻找which.max
时,Inf就是你得到的。我不知道为什么我们真的费心去计算一类案例的索引,但是如果你搜索最好的结果,你应该忽略第一种情况。我们在plot
命令中这样做,在两种情况下都给出了五个簇作为最佳结果。在以下两种情况下,代码的以下修改将给出相同的答案:
calinski.best <- as.numeric(which.max(fit$results[2,-1])) + 1
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")
我们必须有+1
,因为我们省略了一列。
Inf / -Inf不确定性的小细节。正如您在?cascadeKM
中所见,Calinski准则定义为(SSB /(K-1))/(SSW /(n-K)),对于一组K = 1,因此SSB / 0 = Inf。对于一组也SSB = 0,但计算为零,这些在数字计算机中很少精确,在我的计算机中零为-2.8e-14和-2.8e-14/0 = -Inf。在第二个例子中,SSB = 2.8e-14和2.8e-14/0 = Inf。当您寻找最佳时,只需忽略第一列。偶尔SSB可以精确为零,然后0/0 = NaN(不是数字)。