用平面 GLS 近似表面

Approximation of the surface by a plane GLS

存在一个由点以二维数组形式定义的曲面。即数组索引为x和y坐标,数组元素的值为对应点的z坐标值。

需要从最小二乘的角度寻找一个最优的函数a·x+b·y+c=z,即计算出对应的系数a、b、c。有没有办法在 R 中做到这一点?

谢谢!

这是在 3D 中找到最适合点集合的平面的问题 space。

有一种简单的方法可以解决这个问题。将矩阵中的每个元素视为具有两个自变量(x 和 y)和一个因变量 (z) 的 "observation"。

然后你可以通过简单的运行线性模型找到你的最小二乘系数:

lm(z ~ x_indices + y_indices)

事实上,我们可以用它来构造一个简单的函数,它以矩阵为输入,并给出 a、b 和 c 的值作为输出:

best_plane <- function(any_2d_matrix)
{
  x_values <- rep(seq(ncol(any_2d_matrix)), each = nrow(any_2d_matrix))
  y_values <- rep(seq(nrow(any_2d_matrix)), ncol(any_2d_matrix))
  z <- as.vector(any_2d_matrix)
  suppressWarnings(result <- summary(lm(z ~ x_indices + y_indices))$coef)
  return(c(a = result[2, 1], b = result[3, 1], c = result[1, 1]))
}

为了在工作中看到这一点,让我们使用 a、b 和 c 的预设值构造一个矩阵:

a <- 3.2
b <- 0.5
c <- -4

x_indices <- rep(1:10, each = 10)
y_indices <- rep(1:10, 10)
my_matrix <- matrix(a * x_indices + b * y_indices + c, nrow = 10)

my_matrix
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#>  [1,] -0.3  2.9  6.1  9.3 12.5 15.7 18.9 22.1 25.3  28.5
#>  [2,]  0.2  3.4  6.6  9.8 13.0 16.2 19.4 22.6 25.8  29.0
#>  [3,]  0.7  3.9  7.1 10.3 13.5 16.7 19.9 23.1 26.3  29.5
#>  [4,]  1.2  4.4  7.6 10.8 14.0 17.2 20.4 23.6 26.8  30.0
#>  [5,]  1.7  4.9  8.1 11.3 14.5 17.7 20.9 24.1 27.3  30.5
#>  [6,]  2.2  5.4  8.6 11.8 15.0 18.2 21.4 24.6 27.8  31.0
#>  [7,]  2.7  5.9  9.1 12.3 15.5 18.7 21.9 25.1 28.3  31.5
#>  [8,]  3.2  6.4  9.6 12.8 16.0 19.2 22.4 25.6 28.8  32.0
#>  [9,]  3.7  6.9 10.1 13.3 16.5 19.7 22.9 26.1 29.3  32.5
#> [10,]  4.2  7.4 10.6 13.8 17.0 20.2 23.4 26.6 29.8  33.0

现在让我们看看是否可以检索我们的系数:

best_plane(my_matrix)
#>    a    b    c 
#>  3.2  0.5 -4.0 

如果我们添加大量随机噪声,我们仍然相当接近:

best_plane(my_matrix + rnorm(100))
#>          a          b          c 
#>  3.2486162  0.5054093 -4.3669805