首页 文章

相当于Python中2D多项式的“polyfit”

提问于
浏览
11

我想为 a 系数找到最小二乘解

z = (a0 + a1*x + a2*y + a3*x**2 + a4*x**2*y + a5*x**2*y**2 + a6*y**2 +
     a7*x*y**2 + a8*x*y)

给定长度为20的数组 xyz . 基本上我正在寻找相当于numpy.polyfit但是对于2D多项式 .

This question类似,但解决方案是通过MATLAB提供的 .

1 回答

  • 10

    以下是一个示例,说明如何使用 numpy.linalg.lstsq 执行此任务:

    import numpy as np
    
    x = np.linspace(0, 1, 20)
    y = np.linspace(0, 1, 20)
    X, Y = np.meshgrid(x, y, copy=False)
    Z = X**2 + Y**2 + np.random.rand(*X.shape)*0.01
    
    X = X.flatten()
    Y = Y.flatten()
    
    A = np.array([X*0+1, X, Y, X**2, X**2*Y, X**2*Y**2, Y**2, X*Y**2, X*Y]).T
    B = Z.flatten()
    
    coeff, r, rank, s = np.linalg.lstsq(A, B)
    

    调整系数 coeff 是:

    array([ 0.00423365,  0.00224748,  0.00193344,  0.9982576 , -0.00594063,
            0.00834339,  0.99803901, -0.00536561,  0.00286598])
    

    请注意, coeff[3]coeff[6] 分别对应于 X**2Y**2 ,它们接近 1. ,因为示例数据是使用 Z = X**2 + Y**2 + small_random_component 创建的 .

相关问题