这是一旦回答就会很明显的那些问题之一,但现在我被困住了。
我正在尝试根据结果数据集和产生该结果的四个参数重新创建一个方程。
数据在矩阵中,最后一列为结果。
我看到numpy.polyfit允许y的多个值,所以我尝试了...
result=data[:,-1]
variables=data[:,0:-1]
factors=numpy.polyfit(result,variables,2)
结果出来的是:
[[-4.69652251e-01 8.09734523e-01 1.93673361e-02 -1.62700198e+00]
[ 1.42092582e+01 -7.06024402e+00 -9.94583683e-02 1.11882833e+01]
[ 7.44030682e+00 2.08161127e+01 2.65025708e-01 1.14229534e+01]]
我假设结果系数的形式为
[[A^2,B^2,C^2,D^2]
[A ,B, C, D]
[const,const,const,const]]
这有点令人困惑,特别是因为如果我将系数应用于输入数据,我似乎甚至都无法获得接近结果数据的任何东西。
首先,我对polyfit结果的含义是否正确?
其次,为什么有四个常数都不同?我应该将它们加在一起吗?
这仅仅是解决A vs结果,然后解决B vs结果等问题,而不是解决整个问题的组合多维最小化问题吗? (如果是这样,我该怎么做呢?)
还是我只是误导了polyfit在做什么?
最佳答案
Polyfit docs告诉我们
共享相同x坐标的几个采样点数据集可以
通过传入包含一个数据集的2D数组立即拟合
每列。
让我们了解它。
首先,让我们考虑一个例子。假设我们在平面上有3个点,并希望通过度1的多项式进行插值。这意味着我们要绘制一条通过给定3个点的线,并且该线到该点的距离应该是最小的平方。
说,我们有3分:(1, 1), (2, 2), (3, 3)
。显然,可以找到通过这些点的线而没有任何错误,并且该线是y = x
。如果我们用y = a * x + b
来表示行,那么a = 1, b = 0
。
好。现在,让我们从为numpy polyfit给出示例开始:
X = np.array([1, 2, 3])
y = np.array([1, 2, 3])
a, b = np.polyfit(X, y, deg=1)
(a, b)
>>> (0.9999999999999997, 1.2083031466395714e-15)
a * 1000 + b
>>> 999.9999999999997
真好现在让我们用矩阵代替y的一个向量作为例子。 Docs告诉我们,我们只有多条具有相同X坐标的线。让我们检查一下。我们采用两套点:
(1, 1), (2, 2), (3, 3)
和适合它们的线y = x
和(1, 2), (2, 4), (3, 6)
。拟合线为y = 2x
(选中!)。我们正在转换第二个矩阵,因为polyfit想要它。
X = np.array([1, 2, 3])
y = np.array([[1, 2, 3], [2, 4, 6]]).T
coeff = np.polyfit(X, y, deg=1)
coeff
>>> array([[1.00000000e+00, 2.00000000e+00],
[1.20830315e-15, 2.41660629e-15]])
我们看到我们有一个包含第一行
(1, 2)
和第二行(0, 0)
的矩阵。因此,第一列包含第一行的系数,第二列-第二行的系数。让我们检查一下:a, b = coeff[:, 0]
a * 10 + b
>>> 9.999999999999998
a, b = coeff[:, 1]
a * 100 + b
>>> 199.99999999999994
因此,您可以传递具有相同X坐标的多条线并同时获得许多拟合。例如,它对于转换整个数据串的特征很有用。
关于python - 使用numpy.polyfit提取多变量方程系数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54503836/