Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy.optimize.curve_拟合产生无意义的曲线拟合_Python_Machine Learning_Scipy_Statistics_Curve Fitting - Fatal编程技术网

Python scipy.optimize.curve_拟合产生无意义的曲线拟合

Python scipy.optimize.curve_拟合产生无意义的曲线拟合,python,machine-learning,scipy,statistics,curve-fitting,Python,Machine Learning,Scipy,Statistics,Curve Fitting,我试图将曲线拟合到一些生成的数据,这些数据在绘制时类似于指数函数。我使用的是scipy.optimize.curve\u fit,因为它似乎是这项工作的最佳选择(而且记录得最好)。每次运行代码时都会新生成实际数据,但下面是一个示例集: import pandas import scipy.optimize as opt x1 = [0.4145392937447818, 0.7807888116968482, 0.7903528929788539, 1.5081613036989836, -

我试图将曲线拟合到一些生成的数据,这些数据在绘制时类似于指数函数。我使用的是
scipy.optimize.curve\u fit
,因为它似乎是这项工作的最佳选择(而且记录得最好)。每次运行代码时都会新生成实际数据,但下面是一个示例集:

import pandas
import scipy.optimize as opt

x1 = [0.4145392937447818, 0.7807888116968482, 0.7903528929788539, 
1.5081613036989836, -0.295895237606155, -0.0855307279546107, 
1.0523973736479486, -0.6967509832843239, -0.30499200990688413, 
1.1990545631966807, -1.270460772249312, 0.9531042718153095, 1.5747175535222993, 
-0.6483709650867473, 0.47820180254528477, 1.14266851615097, 0.6237953640100202, 
0.0664027559951128, 0.877280002485417, 0.9432317053343211, 1.0367424879878504, 
-0.6410400513164749, 1.667835241401498, -0.20484029870424125, 
2.887026948755316]

y1 = [0.718716626591187, 0.579938466590508, 0.722005637974309, 
1.61842778379047, 0.331301712743162, 0.342649242449043, 1.14950611092907, 
0.299221762023701, 0.345063839940754, 1.08398125906313, 0.315433168226251, 
1.3343730617376, 1.32514210008176, 0.308702648499771, 0.495749985226691, 
0.406025683910759, 0.445087968405107, 0.423578575247177, 0.816264419038205, 
1.16110461165631, 1.81572974380867, 0.420890068255763, 0.821468286117842, 
0.416275933630732, 4.7877353794036]

data = pandas.DataFrame({"Pi_values": x1, 
                         "CO2_at_solubility": y1})
然后,我做曲线拟合业务

##Define curve fitting
def func(x, m, c, c0):
    return c0 + m**x * c

#draw the figure
fig, ax1 = plt.subplots()
plt.xlabel('Pi Parameter')
plt.ylabel('CO2 wt%')

#plot generated data
#tried converting pandas columns to np arrays based on an issue another user was having, but it does not help
x1 = data["Pi_values"].values
y1 = data["CO2_at_solubility"].values

# Curve fitting with scipy.optimize.curve_fit
popt, pcov = opt.curve_fit(func, x1, y1)
# Use the optimized parameters to plot the best fit
plt.plot(x1, y1, 'o', x1, func(x1, *popt))
这是一个非常奇怪的结果。无论我在娱乐中尝试什么形式的方程式,如果它能够拟合任何“曲线”,它看起来就像是一团糟:

或者这一团糟

知道这里会发生什么吗?我找不到其他类似的例子。我正在jupyter笔记本上运行python3.5


其他我尝试过但不起作用的事情:方程的其他形式;其他方程式;改变初始猜测值;在y值太小的情况下缩放值。

您只需使用

data.sort_values(by='Pi_values', ascending=True, inplace=True)
在曲线拟合之前:

x1 = data["Pi_values"].values
y1 = data["CO2_at_solubility"].values
# Curve fitting with scipy.optimize.curve_fit
popt, pcov = opt.curve_fit(func, x1, y1)
# Use the optimized parameters to plot the best fit
plt.plot(x1, y1, 'o', x1, func(x1, *popt))

打印时需要对x轴的元素进行排序

例如:

x1, y1 = zip(*sorted(zip(x1, y1)))
# Curve fitting with scipy.optimize.curve_fit
popt, pcov = opt.curve_fit(func, x1, y1)
# Use the optimized parameters to plot the best fit
plt.plot(x1, y1, 'o', x1, func(x1, *popt))
其结果是:


难以置信。我搜索了一下,想知道scipy.optimize是否需要排序数据,但一定没有足够好的GoogleFu。谢谢你的修复,它现在工作得很好!