【问题标题】:Symmetric matrix checking: how does tolerance work?对称矩阵检查:公差如何工作?
【发布时间】: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.equalall.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 的第二个参数中的平均绝对值有关。

标签: r matrix


【解决方案1】:

@BenBolker 告诉您查看 isSymmetric 的帮助页面,该页面会将您引导至all.equal。你建立了这个矩阵:

> mat1
            (Intercept)     outcome2     outcome3   treatment2   treatment3
(Intercept)         150 4.000000e+01 4.700000e+01 5.000000e+01 5.000000e+01
outcome2             40 4.000000e+01 2.237910e-14 1.333333e+01 1.333333e+01
outcome3             47 2.476834e-14 4.700000e+01 1.566667e+01 1.566667e+01
treatment2           50 1.333333e+01 1.566667e+01 5.000000e+01 2.710506e-14
treatment3           50 1.333333e+01 1.566667e+01 2.818926e-14 5.000000e+01

all.equal 中的测试是tolerance = .Machine$double.eps ^ 0.5,因此您的所有测试实际上都与没有参数的测试相同。 (在非常小的数字的情况下,sqrt 实际上要大一些。)请注意,还有一个关于行名和列名相等性的附加测试,您的示例会满足这些测试。

如果您查看帮助页面,您应该怀疑您对 all.equal 可能在做什么的理解,当您看到 sthat is testing ‘near equality’ 然后将您引向其中显示的详细信息:

 Numerical comparisons for scale = NULL (the default) are done by first computing the mean 
 absolute difference of the two numerical vectors.

在代码中,您可以看到测试的不是相对于容差的个体差异,而是平均绝对差异。

【讨论】:

  • 对,我的测试与 all.equal 的默认容差不同。我正在设置公差值,因此不在 .Machine$double.eps ^ 0.5 处测试公差。使用我在 isSymmetric 中指定的容差(10 * .Machine$double.eps - 也可以在 all.equal 中使用),我发现矩阵被认为是对称的,即使存在大于该容差值的差异 - 即最大值(abs(mat1-t(mat1)))也许我不理解“公差”:对我来说,这意味着只要它们低于公差阈值,它就会“接受”差异......但差异大于这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多