【问题标题】:Matlab fit() vs. Python numpyMatlab fit() 与 Python numpy
【发布时间】:2015-07-16 14:31:17
【问题描述】:

我有一个要转换为 Python 的 matlab 脚本。因为我想对程序(而不是单个计算)进行比较,所以我希望单个计算在 Python 和 Matlab 中都匹配。计算涉及多项式曲面拟合某些数据点。

Matlab:

[xData, yData, zData] = prepareSurfaceData( dbMTOM, dbRange, dbOEM )
ft   = fittype( 'poly12' );
opts = fitoptions(ft);
opts.Normalize = 'off';
fitresult = fit([xData, yData], zData, ft, opts)

Python:

xdegree = 2
ydegree = 3

# Set up the canonical least squares form
Ax = np.vander(x, xdegree)
Ay = np.vander(y, ydegree)
A = np.hstack((Ax, Ay))

# Solve for a least squares estimate
(coeffs, residuals, rank, sing_vals) = np.linalg.lstsq(A, z)

两个代码的数据集是相等的。拟合度也相等(x-degree = 2, y-degree = 3 应该类似于 poly12)。

我没有制作上述脚本。 matlab 脚本是我要转换的原始脚本,Python 脚本是我在搜索 Python 多项式曲面拟合时找到的经过调整的代码。

结果系数的数量级相同,但不相等。 系数:

[Matlab] p00 = 3703.000000, p10 = 0.470000, p01 = 0.182000, p11 = -0.000021, p02 = 0.000156, p20 = 0.000000
[Python] fx0 = 2632.006003, fx1 = 0.539073, fy1 = -0.579960, --- = 0.000000, fy2 = -0.000182, fx2 = 0.000000

我怀疑这里使用的拟合方法不一样。但是我找不到在 Matlab 和 Python 中同样有效的拟合方法。获得相等(或几乎相等)结果的建议方法是什么?

【问题讨论】:

  • 结果有何不同?这些是在一些小的公差范围内的相同系数,还是这些真正不同的多项式?同一x,y 数据上的两个多项式给出的z 值有何不同?

标签: python matlab numpy surface data-fitting


【解决方案1】:

Python 版本缺少 MATLAB 中的 p11 项(如您的系数所示)。来自MATLAB documentation

Poly12 : Z = p00 + p10*x + p01*y + p20*x^2 + p11*x*y

此外,您的 Python 版本还有两个相同的 1 列(x**0y**0 列)。您应该放弃其中之一,因为它是多余的。

因此,为了获得相同的结果,您需要在 Python 中的最小二乘形式中添加一列“x*y”:

# ... Ax and Ay as before
Ay = Ay[:,0:-1] # lose the redundant column of 1s
Axy = (x*y)[:,None] # the indexing makes it an N by 1 array rather than just N
A = np.hstack((Ax, Ay, Axy))

# ... do your least squares as before

【讨论】:

    猜你喜欢
    • 2013-07-16
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2013-09-29
    • 1970-01-01
    • 2010-12-28
    • 2021-09-10
    相关资源
    最近更新 更多