浮点精度在这里发生了什么?

Vlo*_*Vlo 6 floating-point r matrix-multiplication stochastic-process stochastic

这个问题在参考时是对代码 - 高尔夫挑战的观察.

提交的R解决方案是一个有效的解决方案,但是我们中的一些人(可能只是我)似乎对为什么需要进行初始X=m重新分配感到茫然.

代码由@Giuseppe高调一点,所以我会给读者写一些评论.

function(m){
            X=m
            # Re-assign input m as X

            while(any(X-(X=X%*%m))) 0
            # Instead of doing the meat of the calculation in the code block after `while`
            # OP exploited its infinite looping properties to perform the
            # calculations within the condition check.
            # `-` here is an abuse of inequality check and relies on `any` to coerce
            # the numeric to logical. See `as.logical(.Machine$double.xmin)`
            # The code basically multiplies the matrix `X` with the starting matrix `m`            
            # Until the condition is met: X == X%*%m

            X
            # Return result
           }
Run Code Online (Sandbox Code Playgroud)

好吧,据我所知.乘法X%*%m相当于X%*%X因为X它只是一个迭代自乘的版本m.矩阵收敛后,乘以额外的副本mX不改变其值.参见线性代数教科书或v(m)%*%v(m)%*%v(m)%*%v(m)%*%v(m)%*%m%*%m将上述函数定义为v.有趣吗?

所以问题是,为什么@ CodesInChaos的这个想法的实现不起作用?

function(m){while(any(m!=(m=m%*%m)))0 m}
Run Code Online (Sandbox Code Playgroud)

这是由浮点精度问题引起的吗?或者这是由代码中的函数引起的,例如不等式检查或.Primitive("any")?我不相信这是as.logical由于R似乎强迫小于.Machine$double.xmin0的错误.

这是上面的演示.我们只是循环,并采取之间的差异mm%*%m.当我们试图收敛随机矩阵时,该误差变为0.它似乎收敛然后根据输入最终吹到0/INF.

mat = matrix(c(7/10, 4/10, 3/10, 6/10), 2, 2, byrow = T)

m = mat
for (i in 1:25) {
  m = m%*%m
  cat("Mean Error:", mean(m-(m=m%*%m)), 
      "\n Float to Logical:", as.logical(m-(m=m%*%m)),
      "\n iter", i, "\n")
}
Run Code Online (Sandbox Code Playgroud)

关于为什么这是一个浮点数学问题的一些额外的想法

1)循环表明这可能不是any任何逻辑检查/转换步骤的问题,而是与浮点矩阵数学有关.

2)@ user202729在原始帖子中评论这个问题在Jelly中仍然存在,代码高尔夫语言让人更加相信这可能是一个浮点问题.

Joh*_*man 5

不同的方法迭代不同的函数,都以种子值开始m.如果该固定点是稳定的并且种子在该固定点的吸引范围内,则函数迭代仅收敛到给定的固定点.

在原始代码中,您正在迭代该函数

f <- function(X) X %*% m
Run Code Online (Sandbox Code Playgroud)

极限矩阵是一个稳定的定点,在假设下(代码湾问题中说明)存在明确的限制.由于函数定义依赖于m,因此固定点是函数的函数也就不足为奇了m.

另一方面,m = m %*% m通过迭代函数获得所提出的变化使用

g <- function(X) X %*% X
Run Code Online (Sandbox Code Playgroud)

请注意,所有幂等矩阵都是此函数的固定点,但显然它们不能都是稳定的固定点.显然,原始固定函数中的限制矩阵不是一个稳定的固定点g(即使它是一个固定点).

要真正解决这个问题,你需要在函数迭代下进入矩阵不动点理论,以说明为什么g不稳定的情况下固定点.