使用 B 样条的张量积进行曲面拟合

机器算法验证 r 回归 最小二乘 非参数 样条
2022-04-02 05:40:28

我正在尝试使用张量产品自学使用样条进行曲面拟合。我正在尝试构建一个玩具示例,但我似乎无法让我的示例正常工作。我会尽力解释。我正在尝试使用 B 样条拟合从双变量高斯采样的一组点。

这就是采样表面的样子。

library(rgl)
library(fda)

binorm = function(x,y)
{
z =  (15/ (2*pi)) * exp(-(1/2) * (x^2 + y^2))
return(z)
}

# Set up data
samples = 10
x = seq(-3, 3, length.out = samples)
grid = cbind(rep(x, times=1, each=samples), rep(x, times=samples)) # cartesian product
Y = matrix(binorm(grid[,1], grid[,2]), nrow = samples, ncol = samples) # evaluate at each point

# Plot the surface
surface3d(x,x, Y, col = "green")

我想使用具有 12 个基函数的 6 阶 B 样条基系统。

曲面图

param.nbasis = 12
param.norder = 6

param.rangeval = c(min(x), max(x))
nbreaks = param.nbasis - param.norder + 2
basis.breaks = seq(param.rangeval[1], param.rangeval[2], length.out = nbreaks)

B.x = bsplineS(x, breaks = basis.breaks, norder = param.norder)
B.y = bsplineS(x, breaks = basis.breaks, norder = param.norder)

(注意:bsplineS() 函数来自 fda 包)

鉴于我在 10 x 10 网格上进行插值。B样条基矩阵是相同的。据我了解,通过阅读文献和这个问题,我想做两个基础矩阵的逐行克罗内克积(请参阅我之前链接的问题)。这样做我得到一个矩阵。10×(1212)

C = matrix(nrow = 10, ncol = param.nbasis^2)
for (i in 1:10) 
{
C[i,] = kronecker(B.x[i,], B.y[i,])
}

这是我感到困惑的地方,我应该能够使用正规方程求解系统。我正在做一个未加权的最小二乘拟合,所以我应该能够通过正规方程求解β

β=(CC)1Cy

在 r 代码中,这变成

y = as.vector(Y)
B = solve(t(C) %*% C) %*% t(C) %*% y

但是,我继续收到以下错误:

Error in solve.default(t(C) %*% C) : 
Lapack routine dgesv: system is exactly singular: U[7,7] = 0

显然我做错了什么。我无法弄清楚这一点,网络上没有很多代码示例。任何帮助,尤其是代码示例,将不胜感激。

1个回答

不向量化你的响应矩阵是要走的路;Y

B = ginv(t(C) %*% C) %*% t(C) %*% Y  #OLS
pred = C%*%B  #Predictions
surface3d(x,x, pred, col = "green")  #Plot