R在文件上IO后产生不同的结果

Posted

技术标签:

【中文标题】R在文件上IO后产生不同的结果【英文标题】:R produces different result after IO on file 【发布时间】:2014-01-28 03:48:53 【问题描述】:

作为 R 新手,我有一个关于写入和读取矢量数据的问题。

我的例子 1

n = 100 g = 6 set.seed(g) d

(source),它按预期打印“Calinski 标准最佳聚类数:5”。

例2:(先写数据帧d,再读)

n = 100 g = 6 set.seed(g) d

但是,示例 2 打印“Calinski 标准最优聚类数:1”。

我认为在从 R 中的文件进行 IO 之后,格式(或其他内容)已经改变。但我不知道 R 如何读取和写入数字。谁能给我一些线索,谢谢。

编辑 如果文件中没有列名和行名,问题就解决了。

write.table(d, "d.txt", sep='\t', quote=FALSE, row.name=FALSE, col.names=FALSE)

读取时,R 也会读取行名和列名,。 另一种是在阅读时转义这些名称。

【问题讨论】:

两种情况下的情节是一样的吗?代码看起来完全一样...你是否在再次阅读后打印以比较它是否相同(也许只是它的head会做head(d) 情节相同,表框d的打印相同。 将数字写入文本文件很可能会丢失一些精度。请改用savesaveRDS 感谢 Joshua,作为初学者和实验数据,我想要文本文件,因为它更容易阅读和修改。我将在真实数据中使用 saveRDS。 【参考方案1】:

无法为一组计算 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(不是数字)。

【讨论】:

以上是关于R在文件上IO后产生不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io express 不同的路由

浮点数的乘法在 Numpy 和 R 中给出不同的结果

保存的随机森林模型在同一数据集上产生不同的结果

即使在R中使用set.seed()也有不同的结果。

$\lambda = 0$ 和 OLS 的 LASSO 在 R glmnet 中产生不同的结果

CUDA 内核在 2 个不同的 GPU 上产生不同的结果(GeForce 8600M GT 与 Quadro FX 770M)