【问题标题】:curve fitting and parameter estimation in PythonPython中的曲线拟合和参数估计
【发布时间】:2017-05-23 01:59:00
【问题描述】:

我目前正在使用 Python 比较两个不同的数据集(xDAT 和 yDAT),这两个数据集由一定时间内的 240 个距离测量值组成。但是,数据集 xDAT 偏移了一个非线性量。这个非线性量等于时间相关的动态介质的宽度,我称之为 A 级。更具体地说,xDAT 测量从原点到 A 级的顶部,而 yDAT 测量从原点到 A 级的底部。见下图:

为了比较两条曲线,我必须首先对 xDAT 进行校正以弥补其偏移(A 级的宽度)。

到目前为止,我已经玩过不同程度的 numpy.polyfit。即:

coefs = np.polynomial.polynomial.polyfit(xDAT, yDAT, 5)
polyEST=[]
for i in range(0,len(x-DAT)):
    polyEST.append(coefs[0] + coefs[1]*xDAT[i] + coefs[2]*pow(xDAT[i],2) + coefs[3]*pow(xDAT[i],3) + coefs[4]*pow(xDAT[i],4) + coefs[5]*pow(xDAT[i],5))

使用这种方法的问题是,当我绘制 polyEST(这是 xDAT 的更正版本)时,绘图仍然与 yDAT 的趋势不匹配并保持偏移。请看下图,其中xDAT=蓝色,修正xDAT=红色,yDAT=绿色:

理想情况下,校正后的 xDAT 仍应比 yDAT 噪声更大,但曲线的总体振荡和趋势应匹配。

非常感谢帮助我实施不同的曲线拟合和参数估计技术,以纠正由 A 级引起的非线性偏移。

谢谢。

【问题讨论】:

  • 我不认为你想做什么很清楚。您调用polyfit 就好像xDAT 和yDAT 是一组样本点的x- 和y- 坐标,但是,您的问题描述和绘图表明它们不相关。
  • 根据您的描述,偏移量是一个常数。使用度数 > 0 的多项式似乎是错误的方法。此外,从您的情节来看,xDat 和 yDat 似乎没有“排列”——即 xDat 显然不是 yDat +/- 某个常数——它似乎也被“翻转”或相移。
  • 谢谢斯泰利奥斯。在介绍中,我提到 xDAT 和 yDAT 都是 240 个点的数据集。这些点中的每一个都对应于特定时间的测量……两个数据集都是以相等的时间增量测量的。我使用 polyfit 推导出描述两个数据集之间差异的多项式,然后我使用该多项式来校正在 xDAT 中看到的偏移量。我相信有一种更合适的方法来纠正在 xDAT 中观察到的 A 级偏移,而不是 np.polyfit。
  • 是的,似乎有轻微的相移和翻转,但我不知道如何纠正。从简单的图表中可以看出,样品的位置略有不同。然而,每组中的样本是在相同的时间点采集的。在这种情况下,相移和翻转是由介质的深度和测试点水平位置的微小差异引起的。谢谢。
  • 注意:校正后的 xDAT 图表(红色)显示了观察数 75-80 之间的高原,但我在原始 xDAT(蓝色)中没有看到此功能。

标签: python numpy estimation polynomials


【解决方案1】:

答案取决于 A 级是什么。如果它是独立的,那么您的第一行应该类似于

coefs = np.polynomial.polynomial.polyfit(numpy.arange(xDAT.size), yDAT-xDAT, 5)

这将给出一个独立的 A 的 polyfit,然后更正后的 x 应该是

xDAT+np.polynomial.polynomial.polyval(numpy.arange(xDAT.size),coefs)

如果A 依赖于变量(看起来如此),你不想polyfit,因为这只会回归振荡的实部(弹簧的“弹簧”部分-阻尼系统),这就是为什么您的corrected_xDat 与xDat 同相而不是yDat。要回归类似的东西,您需要使用傅立叶变换(这不是我的专长)。

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多