用平面 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
存在一个由点以二维数组形式定义的曲面。即数组索引为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