【问题标题】:Python Numpy Weighted Polynomial surface fit diverges at the edgesPython Numpy加权多项式曲面拟合在边缘发散
【发布时间】:2019-08-14 12:17:31
【问题描述】:

例如,我有一个 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 左右。此处包含拟合表面的图像:

有人能说出我的代码有什么问题吗?或者有人建议如何更好地进行加权表面拟合?

提前谢谢你!

【问题讨论】:

  • 行为不是很明显吗?您正在拟合一系列 6 次多项式,数据中的每一行都有一个。您将信号的值加权为零。边缘权重为零的 6 次多项式(信号主要在哪里)看起来像这样。也许重新考虑你是如何加权的——信号不应该是 1.0 而背景是 0.0 吗?
  • 我想适应背景表面而不是信号。我想尽可能地纠正来自背景的信号,所以我创建了一个理论表面来减少信号的每个点。但是,我可以创建小于 1 的边权重

标签: python python-3.x numpy scipy


【解决方案1】:

看看scipy.interpolate (docs)。使用平滑 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') 

【讨论】:

  • 是的,我已经使用 bisplrep 函数来拟合样条,但是样条拟合对我的口味来说有点不切实际。它适合一切。我想要另一个多项式拟合选项。
  • 您是否尝试添加更多度数(例如kx=6, ky=6)?
  • 你也可以强制结点,让它更像一个多项式,而不是一个分段多项式
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2018-02-16
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多