【问题标题】:How to improve surface fit to 3D data?如何提高表面对 3D 数据的拟合度?
【发布时间】:2020-09-04 02:16:47
【问题描述】:

我一直在使用 scipy 将 3d 数据拟合到表面,该表面被定义为多项式函数。但结果看起来与数据并没有那么接近。如何改善拟合?

import numpy as np
from scipy.optimize import curve_fit

# import my data
data = my_data_matrix

# define polynomial function
def func(X, A, B, C, D, E, F):
    # unpacking the multi-dim. array column-wise, that's why the transpose
    x, y, z = X.T

    return (A * x ** 2) + (B * y ** 2) + (C * x * y) + (D * x) + (E * y) + F

# fit the polynomial function to the 3d data
popt, _ = curve_fit(func, data, data[:,2])


# print coefficients of the polynomial function, i.e., A, B, C, D, E and F
from string import ascii_uppercase
for i, j in zip(popt, ascii_uppercase):
    print(f"{j} = {i:.3f}")

在这种情况下,我得到了:

A = 0.903  
B = 0.022  
C = 0.325  
D = -362.140  
E = -52.875  
F = 31057.352

拟合曲面与原始数据(散点)进行比较:

【问题讨论】:

  • 嗨,你能发布一个完整的工作示例,包括数据吗?你能更准确地说“看起来不太近”是什么意思吗?
  • 顺便说一句...我会定义...+ 2 * C * x * y + ...

标签: python math scipy data-fitting


【解决方案1】:

您确定您的数据来自二次曲面并且没有任何噪音吗?这个curve_fit 函数基本上是在做line of best fit 的模拟。最佳拟合线是当您有一些数据像一条线一样展开但不完全是一条线,并且您希望通过数据找到最接近数据的线。这种“接近度”的定义方式是针对每个数据点,找出该点实际位置与线预测位置的差异,将其平方,然后将所有数据点相加。最佳拟合线是最小化这种情况的线。

现在,如果数据嘈杂(几乎总是如此),那么最佳拟合线不会完全通过每个点,而是应该接近。如果您有充分的理由认为您的数据具有线性关系,那么这很好,并且不准确之处可以告诉您数据的噪声程度。

将此扩展到您的示例,您正在尝试找到在 x 和 y 中都是二次的最佳曲面以适合您的数据。如果您有理由相信生成此数据的过程是二次的,那么您在图表中看到的差异就是数据的噪声。

但是,您的数据可能确实来自立方或更高阶的数据。您可以尝试这些类型的功能,但不要太疯狂,通常来自物理过程的数据不会太高阶。过度使用您的功能基本上称为过度拟合。更高阶的函数将减少数据的错误,您甚至可以达到可以“完美”预测所有数据的程度(通过使用度数 = 数据点数的多项式)。但是,如果您过拟合(= 太高阶),那么当您获得新数据时,您的过拟合模型会比更简单的模型预测得更差。

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2018-06-25
    • 2019-01-17
    • 1970-01-01
    • 2018-05-15
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多