平面GLS的曲面近似值。

问题描述 投票:0回答:1

有一个由点以二维数组的形式定义的曲面。即数组的指数为x、y坐标,数组元素的值为对应点的z坐标值。

需要从最小二乘点出发,找到一个最优的函数a - x + b - y + c = z,也就是计算出相应的系数a、b、c,在R中有没有办法做到?

谢谢!请问有什么方法?

r least-squares surface approximation plane
1个回答
1
投票

这就是寻找三维空间中点的集合的最佳拟合平面的问题。

有一个简单的方法来看待这个问题。将矩阵中的每个元素视为一个 "观测值",有两个独立变量(x和y)和一个因变量(z)。

那么你可以通过最小二乘法简单地运行线性模型来找到你的系数。

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 
© www.soinside.com 2019 - 2024. All rights reserved.