【发布时间】:2014-05-05 19:38:10
【问题描述】:
我有一个矩阵 (mat1)。测试对称性时:
isSymmetric(mat1,tol = 0)
错误
这意味着在零容差下,矩阵不是对称的。然而,以稍大的容差进行测试,矩阵被认为是对称的:
isSymmetric(mat1,tol = 10 * .Machine$double.eps)
是的
但是,对称条目之间的最大差异大于此容差值:
max(abs(mat1-t(mat1))) > (10 * .Machine$double.eps)
是的
为什么,当存在大于容差值的对称差时,矩阵会被归类为对称矩阵?
对于使用 ?glm 示例的工作示例:
counts <- c(18,17,15,20,10,20,25,13,12)
outcome <- gl(3,1,9)
treatment <- gl(3,3)
d.AD <- data.frame(treatment, outcome, counts)
glm.D93 <- glm(counts ~ outcome + treatment, family = poisson())
mat1 <- solve(vcov(glm.D93))
isSymmetric(mat1,tol=0) # FALSE
isSymmetric(mat1,tol=10 * .Machine$double.eps) # TRUE
max(abs(mat1-t(mat1))) > (10 * .Machine$double.eps) # TRUE
我可能不明白宽容是如何运作的;我的想法是大于公差阈值的值会使矩阵对称性测试失败,显然不是这样。
【问题讨论】:
-
您查看过
isSymmetric.matrix的详细信息吗?这将引导您到达all.equal(mat1,t(mat1))或all.equal(c(abs(mat1-t(mat1))),rep(0,length(mat1)))(两者都是 TRUE)。然后看?all.equal和all.equal.numeric -
@BenBolker all.equal 也有一个默认设置 - .Machine$double.eps ^ 0.5 - 这比我测试的要小得多,所以使用它而不是 isSymmetric,我也可以得到显示矩阵不对称: all.equal(mat1,t(mat1),tolerance=0)
-
但这不是我主要关心的问题 - 当我故意将容差设置为小于最大值时(即 max(abs(mat1-t(mat1)))) - all.equal(mat1,t( mat1),tolerance=10 * .Machine$double.eps) 为什么这是真的?在使用该公差测试 all.equal 时,任何更大的值差异都会使其错误...2.13162e-14 > 2.220446e-15(对吗?)
-
我标记为重复。简而言之,将相对而非绝对差异与容差进行比较。它与
all.equal的第二个参数中的平均绝对值有关。