Scipy Draw指数-如何更好地拟合?

时间:2019-01-24 00:22:18

标签: python matplotlib scipy

我是Python绘图的新手,所以请多多包涵。我今天搜索和阅读了很多东西,但无法弄清楚。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit

def exp_func(x,a,b,c):
    return a*np.exp(-b*x)+c

x = np.array(df_auction_cat['AgeAdj'])
y = np.array(df_auction_cat['SP/ABCost'])

plt.scatter(x, y, s=50, cmap='Blues', alpha=0.7, edgecolor='gray', linewidth=1)
popt, pcov = curve_fit(exp_func, x, y)
plt.plot(x, exp_func(x, *popt))

在代码的早期,我处理了一些数据,并将df_auction_cat数据集放在一起。分散看起来像这样,指数根本不适合:

enter image description here

任何帮助将不胜感激。下面的数据点:

AgeAdj SP/ABCost
26 0.051851813
8 0.342104363
28 0.142081738
23 0.1
22 0.056330527
19 0.157692308
18 0.157301407
17 0.15
17 0.236690872
17 0.173041737
14 0.223076923
12 0.247294549
12 0.242445636
10 0.464864865
17 0.233333333
17 0.253333333
10 0.292307692
28 0.126554024
19 0.322973634
14 0.270684988
18 0.174560858
12 0.203654335
23 0.133144882
17 0.119076601
12 0.381578947
17 0.232747811
14 0.365465999
11 0.574056541
19 0.153471963
29 0.128023925
15 0.164999835
28 0.140513444
22 0.089770069
16 0.16001412
15 0.283422611

2 个答案:

答案 0 :(得分:0)

我创建了自己的x,y并工作,可以输入您的输入数据吗?

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit

def exp_func(x,a,b,c):
    return a*np.exp(-b*x)+c

x = np.array(range(0,100))
y = np.array(exp_func(x,0.1,0.1,.1)*50+np.random.rand(100))

plt.scatter(x, y, s=50, cmap='Blues', alpha=0.7, edgecolor='gray', linewidth=1)
popt, pcov = curve_fit(exp_func,x, y)
plt.plot(x, exp_func(x, *popt))

答案 1 :(得分:0)

好,所以我知道了!我没有意识到您必须按升序对x值进行排序。我还提供了这行代码的初步猜测:

popt, pcov = curve_fit(exp_func, x, y, p0=(0.7,0.1,1))

我尝试不排序就作图并看到了。我读到有关需要对值进行排序的信息。 enter image description here

排序解决了该问题: enter image description here