python最小二乘法拟合二元二次函数

F = loadtxt(r"Known.txt")            # 导入已知点数据
f = loadtxt(r"UnKnown.txt")          # 导入未知点数据
A = zeros([len(F), 6], dtype=float)  # 作为系数矩阵存储各已知点参数
a = zeros([3, 6], dtype=float)       # 作为系数矩阵存储各未知点参数
L = transpose([F[:, 2]])

# X,Y坐标中心化
xAvg = average(F[:, 0], axis=0)
yAvg = average(F[:, 1], axis=0)
F[:, 0] -= xAvg
F[:, 1] -= yAvg

# 循环得到A矩阵和L矩阵
for i in range(0, len(F)):
    # H(x,y) == a1x+a2y+a3(x**2)+a4(y**2)+a5xy+a6
    A[i][5] = F[i][0] * F[i][1]
    A[i][4] = F[i][1] * F[i][1]
    A[i][3] = F[i][0] * F[i][0]
    A[i][2] = F[i][1]
    A[i][1] = F[i][0]
    A[i][0] = 1

P = eye(len(F))    # 定权阵
aT = transpose(A)  # 求A矩阵的转置
U = dot(aT, L)     # 求U(调用自定义矩阵相乘函数)
N = dot(aT, A)     # 求N(调用自定义矩阵相乘函数)
n = linalg.inv(N)  # 求N的逆矩阵
X = dot(n, U)      # 求系数矩阵



这是一段最小二乘法拟合二次曲面的程序片,即H(x,y) == a1x+a2y+a3(x2)+a4(y2)+a5xy+a6求a1-a6,请问如何优化该代码,有没有函数能更方便的实现

1.最小二乘也可以拟合二次函数
我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的。下面我们就来试试用最小二乘来拟合抛物线形状的的图像。

对于二次函数来说,一般形状为 f(x) = axx+b*x+c,其中a,b,c为三个我们需要求解的参数。为了确定a、b、c,我们需要根据给定的样本,然后通过调整这些参数,知道最后找出一组参数a、b、c,使这些所有的样本点距离f(x)的距离平方和最小。用什么方法来调整这些参数呢?最常见的自然就是我们的梯度下降喽。

spicy库中有名为leastsq的方法,只需要输入一系列样本点,给出待求函数的基本形状,就可以针对上述问题求解了。
只要将上面代码中的func换成对应的函数即可!