Как получить надежную подгонку нелинейной регрессии с помощью scipy.optimize.least_squares? - PullRequest
0 голосов
/ 22 октября 2018

Моя конкретная проблема заключается в том, что я не могу преобразовать свои данные в числа с плавающей запятой.У меня есть данные, и я просто хочу построить надежную кривую, используя моё модельное уравнение:

y = a * e ^ (- b * z)

Эта поваренная книга - мояссылка: нажмите

Ниже моя попытка.Я получаю это:

TypeError: 'тип данных не понятен'

, который я считаю, потому что мои столбцы являются строками, поэтому я попытался pd.Series.astype().

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

for i in range(1):

    def model(z, a, b):
        y = a * np.exp(-b * z)
        return y
    data = pd.read_excel('{}.xlsx'.format(600+i), names = ['EdGnd','380','395','412','443','465','490','510','520','532','555','560','565','589','625','665','670','683','694','710','Temp','z','EdZTemp','Tilt','Roll','EdZVin'])
    data.dropna(axis = 0, how = 'any')
    data.astype('float')
    np.dtype(data)
    data.plot.scatter('z','380') 
    def fun(x, z, y):
        return x[0] * np.exp(-x[1] * z) - y
    x0 = np.ones(3)
    rbst1 = least_squares(fun, x0, loss='soft_l1', f_scale=0.1, args=('z', 'ed380'))
    y_robust = model('z', *rbst1.x)
    plt.plot('z', y_robust, label='robust lsq')
    plt.xlabel('$z$')
    plt.ylabel('$Ed$')
    plt.legend();

1 Ответ

0 голосов
/ 23 октября 2018

Я думаю, проблема в том, что вы передаете 'z' в args, который является строкой и поэтому не может использоваться в умножении.

Ниже приведен код, использующий curve_fit который использует least_squares, но может быть немного проще в использовании:

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


# your model definition
def model(z, a, b):
    return a * np.exp(-b * z)

# your input data
x = np.array([20, 30, 40, 50, 60])
y = np.array([5.4, 4.0, 3.0, 2.2, 1.6])

# do the fit with some initial values
popt, pcov = curve_fit(model, x, y, p0=(5, 0.1))

# prepare some data for a plot
xx = np.linspace(20, 60, 1000)
yy = model(xx, *popt)

plt.plot(x, y, 'o', xx, yy)
plt.title('Exponential Fit')

plt.show()

Это построит

enter image description here

Вы можете попробоватьадаптируйте этот код для своих нужд.

Если вы хотите использовать f_scale, вы можете использовать:

popt, pcov = curve_fit(model, x, y, p0=(5, 0.1), method='trf', f_scale=0.1)

См. документацию :

kwargs

Аргументы ключевых слов, переданные в leastsq для метода = 'lm' или less_squares в противном случае.

Если у вас есть несвязанная проблема, по умолчанию используется method='lm', который используетleastsq, который не принимает f_scale в качестве ключевого слова.Поэтому мы можем использовать method='trf', который затем использует least_squares, который принимает f_scale.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...