0

我有一个基本问题。我想使用 scikit-learn 将多项式模型拟合到我的数据中。我可以通过 PolynomialFeatures 做到这一点,但我想用某种特定形式拟合多项式。

例如,如果我有 2 个功能,我想创建一个模型:

F = a1 * x1 + a2 * x2 + a3 * x1 * x2 + a4 * x1^2 + a5 * x2^3

你能指导我怎么做吗?我找不到任何可以用于我的目的的例子。

4

1 回答 1

0

我使用以下方法来尝试拟合映射到特定函数的曲线,您也许可以修改其中的一些以满足您的需求:

首先,将您的模型函数定义为一个接受 x 值和一组参数并返回相关 y 值的函数。

您需要确保您的函数确实是数学意义上的函数(即,对于 x 的任何输入值,它们返回单个 y 值)

这是您的“模型”功能 - 例如:

# A kind of elliptic curve with two parameters n, m
def mn_elliptical(x,m,n):
    return 1-((1 - (x)**(n))**(m))

对于二维模型(即输入是 x 和 y,并且 z 有第三个输出),这里讨论了制定模型和输入数据的方法:https ://scipython.com/blog/non-linear-least -squares-fitting-of-a-two-dimensional-data/ - 另外,在实践中的一个例子,见这个答案的结尾。

然后,使用scipy.optimize.curve_fit方法,您需要为它提供一对数组,一个用于 x 和一个用于您收集的已知观测值的 y,将根据这些数组进行拟合。

xdata = [ ... all x values for all observations ... ] 
ydata = [ ... all observed y values in the same order as above ... ]


from scipy.optimize import curve_fit
fitp, fite = curve_fit(mn_elliptical, xdata, ydata))

这将产生fitp该方法拟合的最佳参数,以及fite描述执行拟合后剩余多少(最小二乘)误差的输出。如果您的fite值太大,那么您的模型函数可能不是一个好的函数。

您可以通过帮助设置要返回的参数的预期范围来帮助指导该过程,这可以显着加快速度 - 或者,如果您有一个偏斜的函数,它可以帮助专注于正确的值否则会错过。这些细节在链接的 scipy 文档中有更深入的介绍。

验证并接受误差量后,您可以从 fitp 检索参数并使用这些参数通过您的(现在已拟合的)模型生成 x 的附加值,并获得预测结果。

new_y = mn_elliptical(x, *fitp)

这将产生一个结果 - 使用更高级的 numpy/pandas 方法从您提供的 x 值数组生成多个结果。



为了演示二维用例,让我们想象一个粗略绘制的圆,点 A、B、C、D、E 在以下 xy 坐标 (4,1)、(6.5,3.5)、(4,6 ), (1.5,3.5), (2,2)

在此处输入图像描述

我们知道一个圆遵循公式(x-cx)^2+(y-cy)^2=r^2,所以可以把它写成一个可拟合的函数形式:

def circ(xy, cx, cy, r):
    x,y = xy
    return (((x-cx)**2) + ((y-cy)**2))-(r**2)  

请注意,由于公式的性质,我已将返回值展平为始终为零(至少对于符合的 xy 值)。

我们使用此处列出的观察到的数据点:

xdata = np.array([4,6.5,4,1.5,2])
ydata = np.array([1,3.5,6,3.5,2])
zdata = np.array([0,0,0,0,0])

并根据2-dimensions 链接文章中使用的方法转换该数据。

xdata = np.vstack((xdata.ravel(), ydata.ravel()))
ydata = zdata.ravel()

然后将其输入二维circ函数。

curve_fit(circ,xdata,ydata)

这产生:

(array([ 4. ,  3.5, -2.5]), 

array([[ 0., -0., -0.],
       [-0.,  0., -0.],
       [-0., -0.,  0.]]))

其中第一部分描述了我的拟合circ函数中的 (cx, cy, r) 参数,前两个是中心的 x,y 坐标,第三个是圆的半径。根据我在纸上的铅笔画,这几乎是钱。

第二部分描述了遇到的错误,对于这个手绘示例来说,这并不可怕。

于 2020-06-09T12:27:47.050 回答