0

例如,我有一个 20 x 20 矩阵。在矩阵中,背景值约为 1,信号值约为 3.5。我包含一个图像只是为了表示矩阵数据: 矩阵数据图

我想通过表面拟合来拟合表面的每个点(x 和 y)。我这样做的方法是创建一个权重矩阵,对于任何小于截止值(例如 1.1)的值,其权重为 1,而任何更大的值的权重为零。我使用以下代码创建权重矩阵:

def Weight_Values_Excluded(data,cutoff_val=1.1):
    data_mat=np.copy(data)
    weight_mat=np.zeros(data_mat.shape)
    mask=(data_mat<=cutoff_val)
    weight_mat[mask]=1
    return weight_mat

然后我使用以下代码使用 6 阶多项式进行加权曲面拟合:

def poly_fit(data_mat,weighted_mat,order=6):
    new_data=np.copy(data_mat)
    xarray=np.arange(new_data.shape[1])
    yarray=np.arange(new_data.shape[0])
    X,Y=np.meshgrid(xarray,yarray)
    surface=np.zeros(data_mat.shape)
    for i in range(new_data.shape[0]):
        polcoef=np.polynomial.polynomial.polyfit(xarray,new_data[i,:],order,w=weighted_mat[i,:])
        surface[i,:]=np.polynomial.polynomial.polyval(xarray,polcoef)
    return X,Y,surface

结果异常诡异。尽管我在矩阵中的最大值约为 3.5,但我创建的表面在边缘处发散到 900 左右。此处包括拟合表面的图像:

拟合曲面示例

有谁可以告诉我的代码有什么问题?或者有人建议如何更好地进行加权表面贴合?

先感谢您!

4

2 回答 2

1

大次多项式插值容易产生发散振荡,这就是所谓的龙格现象。考虑使用样条曲线(即低阶分段多项式)

于 2019-08-14T21:37:47.820 回答
1

看看scipy.interpolate文档)。使用平滑 2D 样条的示例(它是分段多项式拟合函数):

from scipy.interpolate import SmoothBivariateSpline
#random points
pts = np.random.random((20,20)) * 3.5 + np.arange(400).reshape(20,20) * 0.01
#spline definition: note that I need to pass x, y and z to 1D. You can specify the degree of the polynom in x and y with kx and ky
sp = SmoothBivariateSpline(*map(np.ravel, np.meshgrid(np.arange(20), np.arange(20))), z=pts.T.ravel(), kx=3, ky=3)

一个示例 2D 切片(我不太擅长 3D 绘图):

plt.plot(np.arange(20), sp(np.arange(20), 4), np.arange(20), pts[:,4], 'ro') 

在此处输入图像描述

于 2019-08-14T15:32:12.247 回答