Scipy优化曲线 - 无法估计协变量的警告

时间:2018-05-04 00:12:12

标签: python pandas scipy

我有这样的数据集:

    elevation  Tree_cover  dNBR  below_ground_carbon_combusted     DOB_lst
0  266.444444   39.555556  0.47                    1110.603930  221.879608
1  683.222222    7.555556  0.48                    2901.511339  236.847916
2  270.777778   44.111111  0.54                    5822.440530  222.909241
3  473.444444   76.333333  0.73                    4643.891015  183.100876
4  470.666667   79.888889  0.64                    5919.393383  183.100876
5  486.333333   76.444444  0.68                    5120.039877  183.100876
6  453.000000   79.222222  0.63                    7090.889123  183.100876
7  412.555556   73.888889  0.48                    2636.000936  183.100876
8  628.000000   45.444444  0.60                   10075.698853  195.514770
9  631.555556    3.000000  0.45                    6144.187670  178.886703

我希望用scipy的优化曲线拟合数据曲线,如下所示:

from scipy.optimize import curve_fit
from math import e
import pandas as pd

def func(data, c1, c2, c3, c4, c5, c6, c7):

    var1 = (-(df['elevation'] - c6)**2)
    var2 = 2 * c7
    var3 = var1 / var2
    return (c1 + c2) * (e**c3 * df['dNBR']) * (e**c4 * df['Tree_cover']) * (e**c5 * df['DOB_lst']) * e**var3


popt, pcov = curve_fit(func, df.drop(['below_ground_carbon_combusted'], axis = 1), df['below_ground_carbon_combusted'])

但我可以错误地说曲线无法优化,我无法弄清楚为什么与其他功能(更简单)相比,这种通用工作流程正常。

这是完整的错误:

OptimizeWarning: Covariance of the parameters could not be estimated
  category=OptimizeWarning)

1 个答案:

答案 0 :(得分:3)

<强>为什么吗 基本上,它是由返回值引起的,因为你的函数在每次迭代时返回一个零数组。

结果为零的原因是e**var3。由于var3非常负面,因此e**var3将适用于零

如何解决? 在进行优化之前规范化您的数据。

from sklearn import preprocessing

x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled,columns=['elevation','Tree_cover','dNBR','below_ground_carbon_combusted','DOB_lst'])
print df
below = df.copy()

P.S MinMaxScaler只是进行标准化的一种方法。你可以选择其他方式。

<强>输出

print popt
print pcov
[  46.64430112   46.64430112   -9.82987816 -161.61131905  128.11954276
    0.7539214     1.03938635]
[[ -3.08229583e+55   1.26754744e+56  -2.40802563e+53   3.74896120e+53
    1.29697774e+54  -2.80789589e+54   1.60677922e+54]
 [  8.98526683e+55   8.98526683e+55   7.01973971e+53  -1.04507188e+54
   -1.40394794e+54   2.80789589e+54   8.42368766e+54]
 [  0.00000000e+00  -0.00000000e+00   2.19366866e+52   1.14667678e+51
    0.00000000e+00   0.00000000e+00   8.77467464e+52]
 [  1.40394794e+54  -1.40394794e+54   1.09683433e+52  -2.25100004e+52
    0.00000000e+00   0.00000000e+00  -4.38733732e+52]
 [ -0.00000000e+00   0.00000000e+00  -2.19366866e+52   2.07900045e+52
   -2.19366866e+52   0.00000000e+00  -8.77467464e+52]
 [ -2.80789589e+54   2.80789589e+54  -2.19366866e+52  -1.14667678e+51
    0.00000000e+00   0.00000000e+00  -8.77467464e+52]
 [  0.00000000e+00   1.12315835e+55   0.00000000e+00  -3.26492254e+52
   -8.77467464e+52   0.00000000e+00   0.00000000e+00]]