大家好,我想用曲线拟合在python中进行非线性回归,这是我的代码:
#fit a fourth degree polynomial to the economic data
from numpy import arange
from scipy.optimize import curve_fit
from matplotlib import pyplot
import math
x = [17.47,20.71,21.08,18.08,17.12,14.16,14.06,12.44,11.86,11.19,10.65]
y = [5,35,65,95,125,155,185,215,245,275,305]
# define the true objective function
def objective(x, a, b, c, d, e):
return ((a)-((b)*(x/3-5)))+((c)*(x/305)**2)-((d)*(math.log(305))-math.log(x))+((e)*(math.log(305)-(math.log(x))**2))
popt, _ = curve_fit(objective, x, y)
# summarize the parameter values
a, b, c, d, e = popt
# plot input vs output
pyplot.scatter(x, y)
# define a sequence of inputs between the smallest and largest known inputs
x_line = arange(min(x), max(x), 1)
# calculate the output for the range
y_line = objective(x_line, a, b, c, d, e)
# create a line plot for the mapping function
pyplot.plot(x_line, y_line, '--', color='red')
pyplot.show()
这是我的错误:
追溯(最近一次通话):文件“ C:\ Users \ Fahmi \ PycharmProjects \ pythonProject \ main.py”,行16,在popt中,_ = curve_fit(objective,x,y)文件“ C:\ Users \ Fahmi \ PycharmProjects \ pythonProject \ venv \ lib \ site-packages \ scipy \ optimize \ minpack.py“,第784行,位于curve_fit res = minimumsq(func,p0,Dfun = jac,full_output = 1,** kwargs)文件” C :\ Users \ Fahmi \ PycharmProjects \ pythonProject \ venv \ lib \ site-packages \ scipy \ optimize \ minpack.py”,第410行,infinitesq形状,dtype = _check_func('leastsq','func',func,x0, args,n)文件“ C:\ Users \ Fahmi \ PycharmProjects \ pythonProject \ venv \ lib \ site-packages \ scipy \ optimize \ minpack.py”,第24行,在_check_func res = atleast_1d(thefunc(((x0 [:numinputs],)+ args)))文件“ C:\ Users \ Fahmi \ PycharmProjects \ pythonProject \ venv \ lib \ site-packages \ scipy \ optimize \ minpack.py”,行484,在func_wrapped返回中func(xdata,params)-ydata文件“ C:\ Users \ Fahmi \ PycharmProjects \ pythonProject \ main.py”,第13行,目标返回((a)-((b)(x / 3-5))) +((c)(x / 305)** 2)-((d)(math.log(305))-math.log(x))+((e)(math.log(305)-(math .log(x))** 2))TypeError:只能将size-1数组转换为Python标量
之前感谢
这是数学库的已知问题。只需使用numpy即可解决问题,因为numpy函数支持标量和数组。
#fit a fourth degree polynomial to the economic data
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
x = [17.47,20.71,21.08,18.08,17.12,14.16,14.06,12.44,11.86,11.19,10.65]
y = [5,35,65,95,125,155,185,215,245,275,305]
# define the true objective function
def objective(x, a, b, c, d, e):
return ((a)-((b)*(x/3-5)))+((c)*(x/305)**2)-((d)*(np.log(305))-np.log(x))+((e)*(np.log(305)-(np.log(x))**2))
popt, _ = curve_fit(objective, x, y)
# summarize the parameter values
a, b, c, d, e = popt
# plot input vs output
plt.scatter(x, y)
# define a sequence of inputs between the smallest and largest known inputs
x_line = np.arange(np.min(x), np.max(x), 1)
# calculate the output for the range
y_line = objective(x_line, a, b, c, d, e)
# create a line plot for the mapping function
plt.plot(x_line, y_line, '--', color='red')
plt.show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句