用numpy.polyfit提取多变量方程系数

时间:2019-02-03 14:27:32

标签: python numpy

这是一旦回答就可能完全显而易见的问题之一,但现在我被困住了。

我正在尝试根据结果数据集和产生该结果的四个参数重新创建一个方程。

数据在矩阵中,最后一列为结果。

我看到numpy.polyfit允许y的多个值,所以我尝试了...

[[-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]]

我假设结果系数的形式为

val data = spark.read.format("csv").option("header","true").load(<your path>)
data.printSchema 

这有点令人困惑,尤其是因为如果我将系数应用于输入数据,我似乎甚至都无法获得接近结果数据的任何东西。

首先,我对polyfit结果的含义是否正确?

第二,为什么会有四个常数都不同?我应该将它们加在一起,还是什么?

这仅仅是解决A vs结果,然后解决B vs结果等问题,而不是组合整体的多维最小化吗? (如果是这样,我该怎么做呢?)

还是我只是误导了polyfit在做什么?

1 个答案:

答案 0 :(得分:1)

Polyfit docs告诉我们

  

共享相同x坐标的几个采样点数据集可以   通过传入包含一个数据集的2D数组立即拟合   每列。

让我们理解它。 首先,让我们考虑一个例子。假设我们在平面上有3个点,并想通过1次多项式进行插值。这意味着我们要绘制一条通过给定3个点的线,并且该线到该点的距离应为最小的平方。 假设我们有3分:(1, 1), (2, 2), (3, 3)。显然,可以找到通过这些点的线而没有任何错误,并且该线是y = x。如果我们用y = a * x + b来考虑行,则a = 1, b = 0line y=x

好。现在,让我们从将此示例提供给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(选中!)。

two lines

我们正在转换第二个矩阵,因为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坐标的多条线并同时获得许多拟合。例如,它对于转换整个数据串的功能很有用。