给定参数平面曲线r(u)=(x(u), y(u)),其中x=f(u), y=g(u),进行曲线拟合,用参数多项式三次曲线求r(u)的近似值。将需要应用最小二乘估计来解决问题。
我想问的澄清:
-
我是否对x=f(u)和y=f(u)分别进行曲线拟合,然后将产生的多项式曲线的估计x和y值结合起来,以绘制r(u)的估计?
-
我是否对r(u)进行曲线拟合并找到相应的多项式参数三次曲线?
-
我应该采用线性最小二乘方法还是非线性最小二乘方法?我认为它是非线性的,因为目的是产生一个参数多项式三次曲线。
-
在scipy中应用最小二乘函数,特别是高斯-牛顿方法是否有可能解决这个问题?
希望我能得到一些帮助,用Python编写上面的代码。
非常感谢。
尝试在python中使用leastrongquarss,但是没有效果。
期待一个方法论的方法来解决这个问题
尝试多项式特征曲线拟合库
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly_2 = poly_features.fit_transform(X)
我刚刚遇到了一个类似的问题,希望这个答案仍然有用。
方法1 -单独回归x和y -似乎工作得很好。下面是使用scipy leastrongquares的Python实现。
from scipy.optimize import least_squares
def polynome(x, coefs):
x_powers = np.stack([x**i for i in range(coefs.shape[-1])], axis=1)
y = np.sum(coefs*x_powers, axis=1)
return y
def fit_parametric_poly(Y,u,degrees=[3,3], inputs_size=1000):
"""
Y array of shape [n_samples,n_dims]
u the parametric values in range [0,1]
degrees the degrees of each polynomial as a list
inputs_size the number of samples for interpolation
"""
coefs_list = []
for i in range(Y.shape[1]):
y = np.ravel(Y[:,i])
coefs = np.ones(degrees[i]+1)
#function to regress on parametric values u
def loss_func(coefs):
return y - polynome(u, coefs)
res = least_squares(loss_func,coefs)
coefs_list.append(res.x)
inputs = np.linspace(0, 1,inputs_size)
preds = np.stack([polynome(inputs,coefs) for coefs in coefs_list], axis=1)
return inputs, preds, coefs_list
如果您有异常值,您可以将损失更改为huber或soft_l1,以获得更健壮的曲线。