Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对称矩阵检查:公差是如何工作的?_R_Matrix - Fatal编程技术网

R 对称矩阵检查:公差是如何工作的?

R 对称矩阵检查:公差是如何工作的?,r,matrix,R,Matrix,我有一个矩阵(mat1)。测试对称性时: isSymmetric(mat1,tol=0) 假的 这意味着零公差下,矩阵是不对称的。但是,在公差稍大的情况下,矩阵被视为对称: isSymmetric(mat1,tol=10*.Machine$double.eps) 真的 但是,对称条目之间的最大差值大于此公差值: 最大值(abs(mat1-t(mat1))>(10*机器$double.eps) 真的 为什么当对称差大于公差值时,矩阵被归类为对称矩阵 对于使用?glm示例的工作示例: counts

我有一个矩阵(mat1)。测试对称性时:

isSymmetric(mat1,tol=0)

假的

这意味着零公差下,矩阵是不对称的。但是,在公差稍大的情况下,矩阵被视为对称:

isSymmetric(mat1,tol=10*.Machine$double.eps)

真的

但是,对称条目之间的最大差值大于此公差值:

最大值(abs(mat1-t(mat1))>(10*机器$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 

counts@BenBolker让您查看帮助页面中的IsSymmetry,它会引导您进入
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可能在做什么的理解,因为yious看到它正在测试“近似相等”
,然后向您介绍其中的详细信息:

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

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

您是否查看了
isSymmetric.matrix
了解详细信息?这将导致您找到
all.equal(mat1,t(mat1))
all.equal(c(abs(mat1-t(mat1))),rep(0,length(mat1))
(两者都是真的)。然后查看
?all.equal
all.equal.numeric
@BenBolker all.equal还有一个默认设置-.Machine$double.eps^0.5-,它明显小于我正在测试的值,因此使用它而不是isSymmetric,我还可以显示矩阵不是对称的:all.equal(mat1,t(mat1),公差=0)但这不是我主要关心的问题-当我故意将公差设置为小于最大值(即max(abs(mat1-t(mat1)))-all.equal(mat1,t(mat1),公差=10*.Machine$double.eps)时,为什么会这样?在测试所有与该公差相等的值时,任何较大的值差都将使其为假…2.13162e-14>2.220446e-15(对吗?)标记为重复的I的可能重复项。简而言之,与宽容相比的是相对的,而不是绝对的差异。它与
all.equal
的第二个参数中的平均绝对值相对。对,我的测试与all.equal的默认公差不同。我正在设置公差值,因此不在.Machine$double.eps^0.5处测试公差。使用我在IsSymmetry中指定的公差(10*.Machine$double.eps-也可用于all.equal),我发现矩阵被视为对称的,即使存在大于该公差值的差异-即max(abs(mat1-t(mat1)),可能我不理解“公差”:对我来说,这意味着它将“接受”差异,只要它们低于公差阈值。。。但是有比这更大的区别!