使用pandas数据框的多元曲线拟合

问题描述 投票:0回答:1

我正在尝试使数据适合特定的功能以建立经验关系。

def abrasion_fit_function(x_data, a, b, c, d, e, f):
    [P, Q, R, S, U, V] = x_data
    return a * np.power(P, b) * np.power(Q, c) * np.power((R / S), d) * np.power(U, e) / np.power(V, f)

数据帧看起来像这样:

column_names = ['P', 'Q', 'R', 'S', 'U', 'V', 'L', 'M', 'Y']
values = np.concatenate(appended_data, axis=0)
df_data = pd.DataFrame(values, columns=column_names)

并且curvefit函数的调用方式如下:

params, params_covariance = curve_fit(CustomFitFunctions().abrasion_fit_function,
                                          df_data[['P', 'Q', 'R','S', 'U', 'V']],
                                          df_data['Y'])

它给我抛出一个错误:

Traceback (most recent call last):
      File "./abrasion_model.py", line 111, in <module>
        df_data['average-mass-change'])
      File "/Users/nipungoel/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 756, in curve_fit
        res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
      File "/Users/nipungoel/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 383, in leastsq
        shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
      File "/Users/nipungoel/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_func
        res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
      File "/Users/nipungoel/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 458, in func_wrapped
        return func(xdata, *params) - ydata
      File "/Users/nipungoel/research/gen3csp/gen3csp_codes/custom_fit_functions.py", line 39, in abrasion_fit_function
        np.power(velocity, e) / np.power(hardness_ratio, f)
    TypeError: ufunc 'power' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

有人可以帮忙吗?我猜可能是因为我正在尝试对dataframe列进行除法?或在数据框列上使用幂函数?我有点迷路。

python pandas numpy curve-fitting
1个回答
0
投票

我做了几处更改。也许我无法将数据框传递给curve_fit函数。所以我将数据帧转换为数组(除了将dtypes更改为float,如建议的那样。)>

x_data = df_data[['P', 'Q', 'R', 'S', 'U', 'V']].copy(deep=True).to_numpy()
y_data = df_data['Y'].copy(deep=True).to_numpy()


params, params_covariance = curve_fit(CustomFitFunctions().abrasion_fit_function, x_data.T, y_data)

现在我遇到了另一个错误:

Traceback (most recent call last):
  File "./abrasion_model.py", line 116, in <module>
    x_data = df_data[['P', 'Q', 'R', 'S', 'U', 'V']].copy(deep=True).to_numpy()
  File "/Users/nipungoel/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 756, in curve_fit
    res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "/Users/nipungoel/anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 387, in leastsq
    raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))
TypeError: Improper input: N=6 must not exceed M=4
© www.soinside.com 2019 - 2024. All rights reserved.